/ Hex Artifact Content
Login

Artifact e2927abf9c69ce4ff9a931bd201946961c34819a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 73   clause expresss
0370: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0380: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0390: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
03a0: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
03b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
03c0: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
03d0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
03e0: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
03f0: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0400: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
0410: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
0420: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
0430: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
0440: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
0450: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
0460: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
0470: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  .  if( op==TK_SE
0480: 4c 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65  LECT ){.    asse
0490: 72 74 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  rt( pExpr->flags
04a0: 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b  &EP_xIsSelect );
04b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
04c0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
04d0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
04e0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
04f0: 45 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  Expr);.  }.#ifnd
0500: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
0510: 41 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  AST.  if( op==TK
0520: 5f 43 41 53 54 20 29 7b 0a 20 20 20 20 61 73 73  _CAST ){.    ass
0530: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
0540: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
0550: 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
0560: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41   return sqlite3A
0570: 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70  ffinityType(pExp
0580: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
0590: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 28  }.#endif.  if( (
05a0: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
05b0: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  N || op==TK_COLU
05c0: 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47  MN || op==TK_REG
05d0: 49 53 54 45 52 29 20 0a 20 20 20 26 26 20 70 45  ISTER) .   && pE
05e0: 78 70 72 2d 3e 70 54 61 62 21 3d 30 0a 20 20 29  xpr->pTab!=0.  )
05f0: 7b 0a 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f  {.    /* op==TK_
0600: 52 45 47 49 53 54 45 52 20 26 26 20 70 45 78 70  REGISTER && pExp
0610: 72 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65  r->pTab!=0 happe
0620: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
0630: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
0640: 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20   ** a TK_COLUMN 
0650: 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  but was previous
0660: 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  ly evaluated and
0670: 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67   cached in a reg
0680: 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  ister */.    int
0690: 20 6a 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c   j = pExpr->iCol
06a0: 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30  umn;.    if( j<0
06b0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
06c0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
06d0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
06e0: 3e 70 54 61 62 20 26 26 20 6a 3c 70 45 78 70 72  >pTab && j<pExpr
06f0: 2d 3e 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  ->pTab->nCol );.
0700: 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
0710: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
0720: 61 66 66 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20  affinity;.  }.  
0730: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66  return pExpr->af
0740: 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  finity;.}../*.**
0750: 20 53 65 74 20 74 68 65 20 65 78 70 6c 69 63 69   Set the explici
0760: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
0770: 65 6e 63 65 20 66 6f 72 20 61 6e 20 65 78 70 72  ence for an expr
0780: 65 73 73 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a  ession to the.**
0790: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
07a0: 6e 63 65 20 73 75 70 70 6c 69 65 64 20 69 6e 20  nce supplied in 
07b0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
07c0: 65 6e 74 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ent..*/.Expr *sq
07d0: 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f 6c 6c  lite3ExprSetColl
07e0: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 43 6f  (Expr *pExpr, Co
07f0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
0800: 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70 43   if( pExpr && pC
0810: 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 45 78 70 72  oll ){.    pExpr
0820: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b  ->pColl = pColl;
0830: 0a 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67  .    pExpr->flag
0840: 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61  s |= EP_ExpColla
0850: 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  te;.  }.  return
0860: 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pExpr;.}../*.**
0870: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
0880: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
0890: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
08a0: 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61   to be the colla
08b0: 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
08c0: 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e   named by pToken
08d0: 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .   Return a poi
08e0: 6e 74 65 72 20 74 6f 20 74 68 65 20 72 65 76 69  nter to the revi
08f0: 73 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  sed expression..
0900: 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** The collating
0910: 20 73 65 71 75 65 6e 63 65 20 69 73 20 6d 61 72   sequence is mar
0920: 6b 65 64 20 61 73 20 22 65 78 70 6c 69 63 69 74  ked as "explicit
0930: 22 20 75 73 69 6e 67 20 74 68 65 20 45 50 5f 45  " using the EP_E
0940: 78 70 43 6f 6c 6c 61 74 65 0a 2a 2a 20 66 6c 61  xpCollate.** fla
0950: 67 2e 20 20 41 6e 20 65 78 70 6c 69 63 69 74 20  g.  An explicit 
0960: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0970: 63 65 20 77 69 6c 6c 20 6f 76 65 72 72 69 64 65  ce will override
0980: 20 69 6d 70 6c 69 63 69 74 0a 2a 2a 20 63 6f 6c   implicit.** col
0990: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
09a0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
09b0: 65 33 45 78 70 72 53 65 74 43 6f 6c 6c 42 79 54  e3ExprSetCollByT
09c0: 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72  oken(Parse *pPar
09d0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
09e0: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d   Token *pCollNam
09f0: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c  e){.  char *zCol
0a00: 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
0a10: 20 20 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61    /* Dequoted na
0a20: 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20  me of collation 
0a30: 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 43 6f  sequence */.  Co
0a40: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
0a50: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
0a60: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c  arse->db;.  zCol
0a70: 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
0a80: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 43 6f  romToken(db, pCo
0a90: 6c 6c 4e 61 6d 65 29 3b 0a 20 20 70 43 6f 6c 6c  llName);.  pColl
0aa0: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
0ab0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
0ac0: 7a 43 6f 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65  zColl);.  sqlite
0ad0: 33 45 78 70 72 53 65 74 43 6f 6c 6c 28 70 45 78  3ExprSetColl(pEx
0ae0: 70 72 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 73 71  pr, pColl);.  sq
0af0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
0b00: 7a 43 6f 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e  zColl);.  return
0b10: 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pExpr;.}../*.**
0b20: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66 61   Return the defa
0b30: 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ult collation se
0b40: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65  quence for the e
0b50: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
0b60: 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20   If.** there is 
0b70: 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  no default colla
0b80: 74 69 6f 6e 20 74 79 70 65 2c 20 72 65 74 75 72  tion type, retur
0b90: 6e 20 30 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  n 0..*/.CollSeq 
0ba0: 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c  *sqlite3ExprColl
0bb0: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
0bc0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
0bd0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
0be0: 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 70  l = 0;.  Expr *p
0bf0: 20 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69 6c   = pExpr;.  whil
0c00: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  e( p ){.    int 
0c10: 6f 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  op;.    pColl = 
0c20: 70 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 66  p->pColl;.    if
0c30: 28 20 70 43 6f 6c 6c 20 29 20 62 72 65 61 6b 3b  ( pColl ) break;
0c40: 0a 20 20 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b  .    op = p->op;
0c50: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 54 61 62  .    if( p->pTab
0c60: 21 3d 30 20 26 26 20 28 0a 20 20 20 20 20 20 20  !=0 && (.       
0c70: 20 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55   op==TK_AGG_COLU
0c80: 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c  MN || op==TK_COL
0c90: 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45  UMN || op==TK_RE
0ca0: 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b  GISTER || op==TK
0cb0: 5f 54 52 49 47 47 45 52 0a 20 20 20 20 29 29 7b  _TRIGGER.    )){
0cc0: 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b  .      /* op==TK
0cd0: 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e  _REGISTER && p->
0ce0: 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20  pTab!=0 happens 
0cf0: 77 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f  when pExpr was o
0d00: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20  riginally.      
0d10: 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62  ** a TK_COLUMN b
0d20: 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ut was previousl
0d30: 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  y evaluated and 
0d40: 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69  cached in a regi
0d50: 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f  ster */.      co
0d60: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b  nst char *zColl;
0d70: 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70  .      int j = p
0d80: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
0d90: 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20   if( j>=0 ){.   
0da0: 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
0db0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
0dc0: 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70         zColl = p
0dd0: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
0de0: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  zColl;.        p
0df0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
0e00: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
0e10: 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29  C(db), zColl, 0)
0e20: 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
0e30: 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a  >pColl = pColl;.
0e40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
0e50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
0e60: 66 28 20 6f 70 21 3d 54 4b 5f 43 41 53 54 20 26  f( op!=TK_CAST &
0e70: 26 20 6f 70 21 3d 54 4b 5f 55 50 4c 55 53 20 29  & op!=TK_UPLUS )
0e80: 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
0e90: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
0ea0: 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pLeft;.  }.  if(
0eb0: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c   sqlite3CheckCol
0ec0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f  lSeq(pParse, pCo
0ed0: 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c  ll) ){ .    pCol
0ee0: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  l = 0;.  }.  ret
0ef0: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a  urn pColl;.}../*
0f00: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20  .** pExpr is an 
0f10: 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d  operand of a com
0f20: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
0f30: 2e 20 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a  .  aff2 is the.*
0f40: 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20  * type affinity 
0f50: 6f 66 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65  of the other ope
0f60: 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74  rand.  This rout
0f70: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a  ine returns the.
0f80: 2a 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74 79  ** type affinity
0f90: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
0fa0: 75 73 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d  used for the com
0fb0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
0fc0: 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65  ..*/.char sqlite
0fd0: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
0fe0: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68  (Expr *pExpr, ch
0ff0: 61 72 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72  ar aff2){.  char
1000: 20 61 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45   aff1 = sqlite3E
1010: 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70  xprAffinity(pExp
1020: 72 29 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26  r);.  if( aff1 &
1030: 26 20 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a  & aff2 ){.    /*
1040: 20 42 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74   Both sides of t
1050: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72  he comparison ar
1060: 65 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e  e columns. If on
1070: 65 20 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20  e has numeric.  
1080: 20 20 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75    ** affinity, u
1090: 73 65 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69  se that. Otherwi
10a0: 73 65 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69  se use no affini
10b0: 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ty..    */.    i
10c0: 66 28 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  f( sqlite3IsNume
10d0: 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 31  ricAffinity(aff1
10e0: 29 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75  ) || sqlite3IsNu
10f0: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 61 66  mericAffinity(af
1100: 66 32 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  f2) ){.      ret
1110: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  urn SQLITE_AFF_N
1120: 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73  UMERIC;.    }els
1130: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
1140: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1150: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
1160: 66 28 20 21 61 66 66 31 20 26 26 20 21 61 66 66  f( !aff1 && !aff
1170: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74  2 ){.    /* Neit
1180: 68 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 20  her side of the 
1190: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20  comparison is a 
11a0: 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65  column.  Compare
11b0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75   the.    ** resu
11c0: 6c 74 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20  lts directly..  
11d0: 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20    */.    return 
11e0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
11f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1200: 20 4f 6e 65 20 73 69 64 65 20 69 73 20 61 20 63   One side is a c
1210: 6f 6c 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72  olumn, the other
1220: 20 69 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65   is not. Use the
1230: 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74   columns affinit
1240: 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  y. */.    assert
1250: 28 20 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66  ( aff1==0 || aff
1260: 32 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  2==0 );.    retu
1270: 72 6e 20 28 61 66 66 31 20 2b 20 61 66 66 32 29  rn (aff1 + aff2)
1280: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  ;.  }.}../*.** p
1290: 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72  Expr is a compar
12a0: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20  ison operator.  
12b0: 52 65 74 75 72 6e 20 74 68 65 20 74 79 70 65 20  Return the type 
12c0: 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68  affinity that sh
12d0: 6f 75 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69  ould.** be appli
12e0: 65 64 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61  ed to both opera
12f0: 6e 64 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69  nds prior to doi
1300: 6e 67 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  ng the compariso
1310: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  n..*/.static cha
1320: 72 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69  r comparisonAffi
1330: 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72  nity(Expr *pExpr
1340: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20  ){.  char aff;. 
1350: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1360: 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78  op==TK_EQ || pEx
1370: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c  pr->op==TK_IN ||
1380: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
1390: 54 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70  T ||.          p
13a0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20  Expr->op==TK_GT 
13b0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
13c0: 5f 47 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _GE || pExpr->op
13d0: 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20  ==TK_LE ||.     
13e0: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d       pExpr->op==
13f0: 54 4b 5f 4e 45 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_NE || pExpr->
1400: 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78  op==TK_IS || pEx
1410: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
1420: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1430: 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20  xpr->pLeft );.  
1440: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70  aff = sqlite3Exp
1450: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  rAffinity(pExpr-
1460: 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70  >pLeft);.  if( p
1470: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a  Expr->pRight ){.
1480: 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
1490: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
14a0: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  (pExpr->pRight, 
14b0: 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  aff);.  }else if
14c0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
14d0: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
14e0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 61 66  elect) ){.    af
14f0: 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
1500: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
1510: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
1520: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
1530: 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69   aff);.  }else i
1540: 66 28 20 21 61 66 66 20 29 7b 0a 20 20 20 20 61  f( !aff ){.    a
1550: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
1560: 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75  NONE;.  }.  retu
1570: 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aff;.}../*.**
1580: 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70   pExpr is a comp
1590: 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f  arison expressio
15a0: 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c  n, eg. '=', '<',
15b0: 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a   IN(...) etc..**
15c0: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73   idx_affinity is
15d0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
15e0: 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   an indexed colu
15f0: 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a  mn. Return true.
1600: 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ** if the index 
1610: 77 69 74 68 20 61 66 66 69 6e 69 74 79 20 69 64  with affinity id
1620: 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62  x_affinity may b
1630: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
1640: 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61  ent.** the compa
1650: 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a  rison in pExpr..
1660: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
1670: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78  dexAffinityOk(Ex
1680: 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20  pr *pExpr, char 
1690: 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20  idx_affinity){. 
16a0: 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70   char aff = comp
16b0: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70  arisonAffinity(p
16c0: 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28  Expr);.  switch(
16d0: 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65   aff ){.    case
16e0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
16f0: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  :.      return 1
1700: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1710: 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20  E_AFF_TEXT:.    
1720: 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66    return idx_aff
1730: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
1740: 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61  F_TEXT;.    defa
1750: 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
1760: 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  n sqlite3IsNumer
1770: 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61  icAffinity(idx_a
1780: 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a  ffinity);.  }.}.
1790: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
17a0: 65 20 50 35 20 76 61 6c 75 65 20 74 68 61 74 20  e P5 value that 
17b0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
17c0: 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70  or a binary comp
17d0: 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65  arison.** opcode
17e0: 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65   (OP_Eq, OP_Ge e
17f0: 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d  tc.) used to com
1800: 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64 20  pare pExpr1 and 
1810: 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74 69  pExpr2..*/.stati
1820: 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61  c u8 binaryCompa
1830: 72 65 50 35 28 45 78 70 72 20 2a 70 45 78 70 72  reP5(Expr *pExpr
1840: 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c  1, Expr *pExpr2,
1850: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
1860: 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28 63 68  {.  u8 aff = (ch
1870: 61 72 29 73 71 6c 69 74 65 33 45 78 70 72 41 66  ar)sqlite3ExprAf
1880: 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a  finity(pExpr2);.
1890: 20 20 61 66 66 20 3d 20 28 75 38 29 73 71 6c 69    aff = (u8)sqli
18a0: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
18b0: 74 79 28 70 45 78 70 72 31 2c 20 61 66 66 29 20  ty(pExpr1, aff) 
18c0: 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c 6c  | (u8)jumpIfNull
18d0: 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  ;.  return aff;.
18e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
18f0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1900: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1910: 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  nce that should 
1920: 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20  be used by.** a 
1930: 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f  binary compariso
1940: 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61  n operator compa
1950: 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70  ring pLeft and p
1960: 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Right..**.** If 
1970: 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78  the left hand ex
1980: 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63  pression has a c
1990: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
19a0: 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20  e type, then it 
19b0: 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65  is.** used. Othe
19c0: 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  rwise the collat
19d0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
19e0: 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20   the right hand 
19f0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
1a00: 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65   used, or the de
1a10: 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69  fault (BINARY) i
1a20: 66 20 6e 65 69 74 68 65 72 20 65 78 70 72 65 73  f neither expres
1a30: 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61  sion has a colla
1a40: 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a  ting.** type..**
1a50: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69  .** Argument pRi
1a60: 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65  ght (but not pLe
1a70: 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c  ft) may be a nul
1a80: 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68  l pointer. In th
1a90: 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69  is case,.** it i
1aa0: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
1ab0: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
1ac0: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
1ad0: 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72  reCollSeq(.  Par
1ae0: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45  se *pParse, .  E
1af0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45  xpr *pLeft, .  E
1b00: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
1b10: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
1b20: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74  .  assert( pLeft
1b30: 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d   );.  if( pLeft-
1b40: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
1b50: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 61 73  ollate ){.    as
1b60: 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 70 43 6f  sert( pLeft->pCo
1b70: 6c 6c 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  ll );.    pColl 
1b80: 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a  = pLeft->pColl;.
1b90: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
1ba0: 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 66 6c  ht && pRight->fl
1bb0: 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
1bc0: 61 74 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ate ){.    asser
1bd0: 74 28 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c  t( pRight->pColl
1be0: 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20   );.    pColl = 
1bf0: 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20  pRight->pColl;. 
1c00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c   }else{.    pCol
1c10: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
1c20: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1c30: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21  Left);.    if( !
1c40: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
1c50: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1c60: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
1c70: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  , pRight);.    }
1c80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
1c90: 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  oll;.}../*.** Ge
1ca0: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1cb0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1cc0: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
1cd0: 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65   int codeCompare
1ce0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1cf0: 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  e,    /* The par
1d00: 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67  sing (and code g
1d10: 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65  enerating) conte
1d20: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  xt */.  Expr *pL
1d30: 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  eft,      /* The
1d40: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
1d50: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
1d60: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
1d70: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  t operand */.  i
1d80: 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20  nt opcode,      
1d90: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73   /* The comparis
1da0: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  on opcode */.  i
1db0: 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c  nt in1, int in2,
1dc0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
1dd0: 64 69 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f  ding operands */
1de0: 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
1df0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
1e00: 65 20 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20  e if true.  */. 
1e10: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   int jumpIfNull 
1e20: 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a     /* If true, j
1e30: 75 6d 70 20 69 66 20 65 69 74 68 65 72 20 6f 70  ump if either op
1e40: 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f  erand is NULL */
1e50: 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20  .){.  int p5;.  
1e60: 69 6e 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c  int addr;.  Coll
1e70: 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d  Seq *p4;..  p4 =
1e80: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
1e90: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
1ea0: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
1eb0: 68 74 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61  ht);.  p5 = bina
1ec0: 72 79 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66  ryCompareP5(pLef
1ed0: 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49  t, pRight, jumpI
1ee0: 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d  fNull);.  addr =
1ef0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f00: 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p4(pParse->pVdbe
1f10: 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64  , opcode, in2, d
1f20: 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20  est, in1,.      
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f40: 20 20 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20       (void*)p4, 
1f50: 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73  P4_COLLSEQ);.  s
1f60: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1f70: 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  P5(pParse->pVdbe
1f80: 2c 20 28 75 38 29 70 35 29 3b 0a 20 20 72 65 74  , (u8)p5);.  ret
1f90: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23 69 66  urn addr;.}..#if
1fa0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
1fb0: 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43  _DEPTH>0./*.** C
1fc0: 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65  heck that argume
1fd0: 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65  nt nHeight is le
1fe0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
1ff0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a   to the maximum.
2000: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65  ** expression de
2010: 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20  pth allowed. If 
2020: 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65  it is not, leave
2030: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2040: 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a  e in.** pParse..
2050: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2060: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50 61  prCheckHeight(Pa
2070: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2080: 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74   nHeight){.  int
2090: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20a0: 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20  .  int mxHeight 
20b0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c  = pParse->db->aL
20c0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
20d0: 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20  T_EXPR_DEPTH];. 
20e0: 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48   if( nHeight>mxH
20f0: 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c  eight ){.    sql
2100: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2110: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78  rse, .       "Ex
2120: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73  pression tree is
2130: 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69   too large (maxi
2140: 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20  mum depth %d)", 
2150: 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a  mxHeight.    );.
2160: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2170: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
2180: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68  urn rc;.}../* Th
2190: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  e following thre
21a0: 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69  e functions, hei
21b0: 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69  ghtOfExpr(), hei
21c0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a  ghtOfExprList().
21d0: 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53  ** and heightOfS
21e0: 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73 65  elect(), are use
21f0: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
2200: 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68  he maximum heigh
2210: 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72  t.** of any expr
2220: 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65  ession tree refe
2230: 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 74  renced by the st
2240: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
2250: 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61  s the.** first a
2260: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
2270: 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68  f this maximum h
2280: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
2290: 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
22a0: 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a  t value pointed.
22b0: 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68  ** to by pnHeigh
22c0: 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  t, the second pa
22d0: 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65  rameter, then se
22e0: 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74  t *pnHeight to t
22f0: 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f  hat.** value..*/
2300: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
2310: 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a  ghtOfExpr(Expr *
2320: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
2330: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
2340: 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74    if( p->nHeight
2350: 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20  >*pnHeight ){.  
2360: 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20      *pnHeight = 
2370: 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20  p->nHeight;.    
2380: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
2390: 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72  oid heightOfExpr
23a0: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
23b0: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
23c0: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
23d0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
23e0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
23f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69   i++){.      hei
2400: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69  ghtOfExpr(p->a[i
2410: 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68  ].pExpr, pnHeigh
2420: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
2430: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
2440: 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63  htOfSelect(Selec
2450: 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69  t *p, int *pnHei
2460: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ght){.  if( p ){
2470: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2480: 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48  r(p->pWhere, pnH
2490: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
24a0: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76  htOfExpr(p->pHav
24b0: 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ing, pnHeight);.
24c0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
24d0: 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65  (p->pLimit, pnHe
24e0: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
24f0: 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66 66 73  tOfExpr(p->pOffs
2500: 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  et, pnHeight);. 
2510: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
2520: 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70  ist(p->pEList, p
2530: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2540: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
2550: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48 65  ->pGroupBy, pnHe
2560: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
2570: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  tOfExprList(p->p
2580: 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67 68  OrderBy, pnHeigh
2590: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
25a0: 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f 72  Select(p->pPrior
25b0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  , pnHeight);.  }
25c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
25d0: 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76  e Expr.nHeight v
25e0: 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65 20 73  ariable in the s
25f0: 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
2600: 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65  as an .** argume
2610: 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73 69 6f  nt. An expressio
2620: 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c 64 72  n with no childr
2630: 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74 20 6f  en, Expr.pList o
2640: 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65  r .** Expr.pSele
2650: 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20 61 20  ct member has a 
2660: 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41 6e 79  height of 1. Any
2670: 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
2680: 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69 67 68  n.** has a heigh
2690: 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d  t equal to the m
26a0: 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66  aximum height of
26b0: 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72   any other .** r
26c0: 65 66 65 72 65 6e 63 65 64 20 45 78 70 72 20 70  eferenced Expr p
26d0: 6c 75 73 20 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74  lus one..*/.stat
26e0: 69 63 20 76 6f 69 64 20 65 78 70 72 53 65 74 48  ic void exprSetH
26f0: 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a  eight(Expr *p){.
2700: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
2710: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70  0;.  heightOfExp
2720: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65  r(p->pLeft, &nHe
2730: 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f  ight);.  heightO
2740: 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c  fExpr(p->pRight,
2750: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 69 66   &nHeight);.  if
2760: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
2770: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
2780: 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74  t) ){.    height
2790: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53  OfSelect(p->x.pS
27a0: 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29  elect, &nHeight)
27b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68  ;.  }else{.    h
27c0: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
27d0: 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65  p->x.pList, &nHe
27e0: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ight);.  }.  p->
27f0: 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68  nHeight = nHeigh
2800: 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t + 1;.}../*.** 
2810: 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65  Set the Expr.nHe
2820: 69 67 68 74 20 76 61 72 69 61 62 6c 65 20 75 73  ight variable us
2830: 69 6e 67 20 74 68 65 20 65 78 70 72 53 65 74 48  ing the exprSetH
2840: 65 69 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e  eight() function
2850: 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67  . If.** the heig
2860: 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ht is greater th
2870: 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  an the maximum a
2880: 6c 6c 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f  llowed expressio
2890: 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76  n depth,.** leav
28a0: 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  e an error in pP
28b0: 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  arse..*/.void sq
28c0: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
28d0: 68 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ht(Parse *pParse
28e0: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 65 78  , Expr *p){.  ex
28f0: 70 72 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a  prSetHeight(p);.
2900: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65    sqlite3ExprChe
2910: 63 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c  ckHeight(pParse,
2920: 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a   p->nHeight);.}.
2930: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2940: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
2950: 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69   of any expressi
2960: 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63  on tree referenc
2970: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c  ed.** by the sel
2980: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ect statement pa
2990: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
29a0: 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
29b0: 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
29c0: 67 68 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ght(Select *p){.
29d0: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
29e0: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c  0;.  heightOfSel
29f0: 65 63 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29  ect(p, &nHeight)
2a00: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67  ;.  return nHeig
2a10: 68 74 3b 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ht;.}.#else.  #d
2a20: 65 66 69 6e 65 20 65 78 70 72 53 65 74 48 65 69  efine exprSetHei
2a30: 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a  ght(y).#endif /*
2a40: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
2a50: 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a  _DEPTH>0 */../*.
2a60: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2a70: 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c 6c 6f  is the core allo
2a80: 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72 20 6e  cator for Expr n
2a90: 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73  odes..**.** Cons
2aa0: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
2ab0: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20  ession node and 
2ac0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
2ad0: 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a   to it.  Memory.
2ae0: 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65  ** for this node
2af0: 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70 54 6f   and for the pTo
2b00: 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ken argument is 
2b10: 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74  a single allocat
2b20: 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20  ion.** obtained 
2b30: 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
2b40: 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c  lloc().  The cal
2b50: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
2b60: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
2b70: 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
2b80: 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61  the node eventua
2b90: 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a  lly gets freed..
2ba0: 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65  **.** If dequote
2bb0: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
2bc0: 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69 74 20  he token (if it 
2bd0: 65 78 69 73 74 73 29 20 69 73 20 64 65 71 75 6f  exists) is dequo
2be0: 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75 6f  ted..** If dequo
2bf0: 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f 20  te is false, no 
2c00: 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70 65 72  dequoting is per
2c10: 66 6f 72 6d 61 6e 63 65 2e 20 20 54 68 65 20 64  formance.  The d
2c20: 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65  eQuote.** parame
2c30: 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69  ter is ignored i
2c40: 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  f pToken is NULL
2c50: 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e   or if the token
2c60: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70   does not.** app
2c70: 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64  ear to be quoted
2c80: 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73  .  If the quotes
2c90: 20 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72   were of the for
2ca0: 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d  m "..." (double-
2cb0: 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20  quotes).** then 
2cc0: 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64  the EP_DblQuoted
2cd0: 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
2ce0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  the expression n
2cf0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69  ode..**.** Speci
2d00: 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d  al case:  If op=
2d10: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20  =TK_INTEGER and 
2d20: 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f  pToken points to
2d30: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a   a string that.*
2d40: 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61  * can be transla
2d50: 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69  ted into a 32-bi
2d60: 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  t integer, then 
2d70: 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74  the token is not
2d80: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e  .** stored in u.
2d90: 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64  zToken.  Instead
2da0: 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  , the integer va
2db0: 6c 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a  lues is written.
2dc0: 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65  ** into u.iValue
2dd0: 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56   and the EP_IntV
2de0: 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74  alue flag is set
2df0: 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72  .  No extra stor
2e00: 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61  age.** is alloca
2e10: 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ted to hold the 
2e20: 69 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64  integer text and
2e30: 20 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61   the dequote fla
2e40: 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f  g is ignored..*/
2e50: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
2e60: 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74  prAlloc(.  sqlit
2e70: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
2e80: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
2e90: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
2ea0: 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e  Zero() (may be n
2eb0: 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  ull) */.  int op
2ec0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ed0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
2ee0: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  opcode */.  cons
2ef0: 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c  t Token *pToken,
2f00: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67      /* Token arg
2f10: 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65  ument.  Might be
2f20: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 64   NULL */.  int d
2f30: 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20  equote          
2f40: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65     /* True to de
2f50: 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20 45 78  quote */.){.  Ex
2f60: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  pr *pNew;.  int 
2f70: 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 69 6e  nExtra = 0;.  in
2f80: 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a 0a 20  t iValue = 0;.. 
2f90: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
2fa0: 20 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e     if( op!=TK_IN
2fb0: 54 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d  TEGER || pToken-
2fc0: 3e 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  >z==0.          
2fd0: 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  || sqlite3GetInt
2fe0: 33 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69  32(pToken->z, &i
2ff0: 56 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20  Value)==0 ){.   
3000: 20 20 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b     nExtra = pTok
3010: 65 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61  en->n+1;.      a
3020: 73 73 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30  ssert( iValue>=0
3030: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
3040: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
3050: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
3060: 69 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74  izeof(Expr)+nExt
3070: 72 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  ra);.  if( pNew 
3080: 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20  ){.    pNew->op 
3090: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e  = (u8)op;.    pN
30a0: 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20  ew->iAgg = -1;. 
30b0: 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b     if( pToken ){
30c0: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72  .      if( nExtr
30d0: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  a==0 ){.        
30e0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
30f0: 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
3100: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c      pNew->u.iVal
3110: 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20  ue = iValue;.   
3120: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3130: 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20    int c;.       
3140: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   pNew->u.zToken 
3150: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
3160: 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
3170: 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20  t( pToken->z!=0 
3180: 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20  || pToken->n==0 
3190: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
31a0: 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70  Token->n ) memcp
31b0: 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  y(pNew->u.zToken
31c0: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f  , pToken->z, pTo
31d0: 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  ken->n);.       
31e0: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b   pNew->u.zToken[
31f0: 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a  pToken->n] = 0;.
3200: 20 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75          if( dequ
3210: 6f 74 65 20 26 26 20 6e 45 78 74 72 61 3e 3d 33  ote && nExtra>=3
3220: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26   .             &
3230: 26 20 28 28 63 20 3d 20 70 54 6f 6b 65 6e 2d 3e  & ((c = pToken->
3240: 7a 5b 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20 63  z[0])=='\'' || c
3250: 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5b 27 20  =='"' || c=='[' 
3260: 7c 7c 20 63 3d 3d 27 60 27 29 20 29 7b 0a 20 20  || c=='`') ){.  
3270: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
3280: 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a  equote(pNew->u.z
3290: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  Token);.        
32a0: 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 70    if( c=='"' ) p
32b0: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
32c0: 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20  _DblQuoted;.    
32d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
32e0: 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
32f0: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a  AX_EXPR_DEPTH>0.
3300: 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68      pNew->nHeigh
3310: 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a  t = 1;.#endif  .
3320: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
3330: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  w;.}../*.** Allo
3340: 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  cate a new expre
3350: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20  ssion node from 
3360: 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  a zero-terminate
3370: 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73  d token that has
3380: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
3390: 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78   dequoted..*/.Ex
33a0: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28  pr *sqlite3Expr(
33b0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
33c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
33d0: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
33e0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28  DbMallocZero() (
33f0: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
3400: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
3410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
3420: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
3430: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
3440: 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54  zToken      /* T
3450: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20  oken argument.  
3460: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
3470: 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20  .){.  Token x;. 
3480: 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20   x.z = zToken;. 
3490: 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20   x.n = zToken ? 
34a0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
34b0: 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72  zToken) : 0;.  r
34c0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
34d0: 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26  rAlloc(db, op, &
34e0: 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x, 0);.}../*.** 
34f0: 41 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20  Attach subtrees 
3500: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
3510: 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64   to the Expr nod
3520: 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  e pRoot..**.** I
3530: 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68  f pRoot==NULL th
3540: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20  at means that a 
3550: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3560: 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
3570: 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74  rred..** In that
3580: 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68   case, delete th
3590: 65 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74  e subtrees pLeft
35a0: 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a   and pRight..*/.
35b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
35c0: 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a  AttachSubtrees(.
35d0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
35e0: 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20   Expr *pRoot,.  
35f0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45  Expr *pLeft,.  E
3600: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
3610: 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b   if( pRoot==0 ){
3620: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
3630: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
3640: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
3650: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74  Delete(db, pLeft
3660: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
3670: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69  prDelete(db, pRi
3680: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
3690: 20 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b     if( pRight ){
36a0: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52  .      pRoot->pR
36b0: 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  ight = pRight;. 
36c0: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
36d0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
36e0: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
36f0: 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c    pRoot->flags |
3700: 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b  = EP_ExpCollate;
3710: 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  .        pRoot->
3720: 70 43 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e  pColl = pRight->
3730: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  pColl;.      }. 
3740: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
3750: 66 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f  ft ){.      pRoo
3760: 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74  t->pLeft = pLeft
3770: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
3780: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  t->flags & EP_Ex
3790: 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20  pCollate ){.    
37a0: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
37b0: 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74   |= EP_ExpCollat
37c0: 65 3b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74  e;.        pRoot
37d0: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d  ->pColl = pLeft-
37e0: 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  >pColl;.      }.
37f0: 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65      }.    exprSe
3800: 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a  tHeight(pRoot);.
3810: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
3820: 6f 63 61 74 65 20 61 20 45 78 70 72 20 6e 6f 64  ocate a Expr nod
3830: 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73  e which joins as
3840: 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62   many as two sub
3850: 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65  trees..**.** One
3860: 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20   or both of the 
3870: 73 75 62 74 72 65 65 73 20 63 61 6e 20 62 65 20  subtrees can be 
3880: 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20  NULL.  Return a 
3890: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
38a0: 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e  ew.** Expr node.
38b0: 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20    Or, if an OOM 
38c0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
38d0: 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  t pParse->db->ma
38e0: 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66  llocFailed,.** f
38f0: 72 65 65 20 74 68 65 20 73 75 62 74 72 65 65 73  ree the subtrees
3900: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
3910: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
3920: 65 33 50 45 78 70 72 28 0a 20 20 50 61 72 73 65  e3PExpr(.  Parse
3930: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3940: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
3950: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
3960: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
3970: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
3980: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70   opcode */.  Exp
3990: 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20  r *pLeft,       
39a0: 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65       /* Left ope
39b0: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
39c0: 70 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  pRight,         
39d0: 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61    /* Right opera
39e0: 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  nd */.  const To
39f0: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20 20  ken *pToken     
3a00: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b 65  /* Argument toke
3a10: 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  n */.){.  Expr *
3a20: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
3a30: 41 4e 44 20 26 26 20 70 4c 65 66 74 20 26 26 20  AND && pLeft && 
3a40: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 2f 2a  pRight ){.    /*
3a50: 20 54 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20   Take advantage 
3a60: 6f 66 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74  of short-circuit
3a70: 20 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74   false optimizat
3a80: 69 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20  ion for AND */. 
3a90: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78     p = sqlite3Ex
3aa0: 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62  prAnd(pParse->db
3ab0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
3ac0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
3ad0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
3ae0: 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
3af0: 6f 70 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a  op, pToken, 1);.
3b00: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
3b10: 74 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50  ttachSubtrees(pP
3b20: 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65  arse->db, p, pLe
3b30: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  ft, pRight);.  }
3b40: 0a 20 20 69 66 28 20 70 20 29 20 7b 0a 20 20 20  .  if( p ) {.   
3b50: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
3b60: 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  kHeight(pParse, 
3b70: 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  p->nHeight);.  }
3b80: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
3b90: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69  /*.** Return 1 i
3ba0: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
3bb0: 6d 75 73 74 20 62 65 20 46 41 4c 53 45 20 69 6e  must be FALSE in
3bc0: 20 61 6c 6c 20 63 61 73 65 73 20 61 6e 64 20 30   all cases and 0
3bd0: 20 69 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   if the.** expre
3be0: 73 73 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 74  ssion might be t
3bf0: 72 75 65 2e 20 20 54 68 69 73 20 69 73 20 61 6e  rue.  This is an
3c00: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
3c10: 49 66 20 69 73 20 4f 4b 20 74 6f 0a 2a 2a 20 72  If is OK to.** r
3c20: 65 74 75 72 6e 20 30 20 68 65 72 65 20 65 76 65  eturn 0 here eve
3c30: 6e 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  n if the express
3c40: 69 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61 6c  ion really is al
3c50: 77 61 79 73 20 66 61 6c 73 65 20 28 61 20 0a 2a  ways false (a .*
3c60: 2a 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65  * false negative
3c70: 29 2e 20 20 42 75 74 20 69 74 20 69 73 20 61 20  ).  But it is a 
3c80: 62 75 67 20 74 6f 20 72 65 74 75 72 6e 20 31 20  bug to return 1 
3c90: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
3ca0: 6e 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 74 72  n.** might be tr
3cb0: 75 65 20 69 6e 20 73 6f 6d 65 20 72 61 72 65 20  ue in some rare 
3cc0: 63 69 72 63 75 6d 73 74 61 6e 63 65 73 20 28 61  circumstances (a
3cd0: 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e   false positive.
3ce0: 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ).**.** Note tha
3cf0: 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  t if the express
3d00: 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 63  ion is part of c
3d10: 6f 6e 64 69 74 69 6f 6e 61 6c 20 66 6f 72 20 61  onditional for a
3d20: 0a 2a 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74  .** LEFT JOIN, t
3d30: 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20 64 65  hen we cannot de
3d40: 74 65 72 6d 69 6e 65 20 61 74 20 63 6f 6d 70 69  termine at compi
3d50: 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20  le-time whether 
3d60: 6f 72 20 6e 6f 74 0a 2a 2a 20 69 73 20 69 74 20  or not.** is it 
3d70: 74 72 75 65 20 6f 72 20 66 61 6c 73 65 2c 20 73  true or false, s
3d80: 6f 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20  o always return 
3d90: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
3da0: 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
3db0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74  (Expr *p){.  int
3dc0: 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78   v = 0;.  if( Ex
3dd0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
3de0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20   EP_FromJoin) ) 
3df0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
3e00: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e  !sqlite3ExprIsIn
3e10: 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20 72  teger(p, &v) ) r
3e20: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
3e30: 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n v==0;.}../*.**
3e40: 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73   Join two expres
3e50: 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41  sions using an A
3e60: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  ND operator.  If
3e70: 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69   either expressi
3e80: 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74  on is.** NULL, t
3e90: 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
3ea0: 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73  the other expres
3eb0: 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f  sion..**.** If o
3ec0: 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f  ne side or the o
3ed0: 74 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20  ther of the AND 
3ee0: 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66  is known to be f
3ef0: 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65  alse, then inste
3f00: 61 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69  ad.** of returni
3f10: 6e 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73  ng an AND expres
3f20: 73 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72  sion, just retur
3f30: 6e 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70  n a constant exp
3f40: 72 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20  ression with.** 
3f50: 61 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65  a value of false
3f60: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
3f70: 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65  e3ExprAnd(sqlite
3f80: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65  3 *db, Expr *pLe
3f90: 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74  ft, Expr *pRight
3fa0: 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d  ){.  if( pLeft==
3fb0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
3fc0: 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20  pRight;.  }else 
3fd0: 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b  if( pRight==0 ){
3fe0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66  .    return pLef
3ff0: 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  t;.  }else if( e
4000: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
4010: 4c 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c 77  Left) || exprAlw
4020: 61 79 73 46 61 6c 73 65 28 70 52 69 67 68 74 29  aysFalse(pRight)
4030: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4040: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  xprDelete(db, pL
4050: 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eft);.    sqlite
4060: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
4070: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74  pRight);.    ret
4080: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
4090: 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45  lloc(db, TK_INTE
40a0: 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74  GER, &sqlite3Int
40b0: 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20  Tokens[0], 0);. 
40c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72   }else{.    Expr
40d0: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
40e0: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
40f0: 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _AND, 0, 0);.   
4100: 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61   sqlite3ExprAtta
4110: 63 68 53 75 62 74 72 65 65 73 28 64 62 2c 20 70  chSubtrees(db, p
4120: 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  New, pLeft, pRig
4130: 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ht);.    return 
4140: 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  pNew;.  }.}../*.
4150: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e  ** Construct a n
4160: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
4170: 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f  de for a functio
4180: 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a  n with multiple.
4190: 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f  ** arguments..*/
41a0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
41b0: 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65  prFunction(Parse
41c0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69   *pParse, ExprLi
41d0: 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
41e0: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70   *pToken){.  Exp
41f0: 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74  r *pNew;.  sqlit
4200: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
4210: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
4220: 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20  Token );.  pNew 
4230: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
4240: 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49  oc(db, TK_FUNCTI
4250: 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a  ON, pToken, 1);.
4260: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
4270: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
4280: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
4290: 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20  List); /* Avoid 
42a0: 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e  memory leak when
42b0: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
42c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
42d0: 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69   }.  pNew->x.pLi
42e0: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73  st = pList;.  as
42f0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
4300: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
4310: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
4320: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
4330: 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 4e 65  ight(pParse, pNe
4340: 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  w);.  return pNe
4350: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  w;.}../*.** Assi
4360: 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75  gn a variable nu
4370: 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65  mber to an expre
4380: 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64  ssion that encod
4390: 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a  es a wildcard.**
43a0: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
43b0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
43c0: 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64   .**.** Wildcard
43d0: 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  s consisting of 
43e0: 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65  a single "?" are
43f0: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65   assigned the ne
4400: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a  xt sequential.**
4410: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
4420: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
4430: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  s of the form "?
4440: 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65  nnn" are assigne
4450: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e  d the number "nn
4460: 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20  n".  We make.** 
4470: 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f  sure "nnn" is no
4480: 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69  t too be to avoi
4490: 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65  d a denial of se
44a0: 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65  rvice attack whe
44b0: 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61  n.** the SQL sta
44c0: 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f  tement comes fro
44d0: 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f  m an external so
44e0: 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  urce..**.** Wild
44f0: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
4500: 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22  m ":aaa", "@aaa"
4510: 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20  , or "$aaa" are 
4520: 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d  assigned the sam
4530: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74  e number.** as t
4540: 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74  he previous inst
4550: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
4560: 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69   wildcard.  Or i
4570: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
4580: 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20  rst.** instance 
4590: 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c  of the wildcard,
45a0: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
45b0: 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ial variable num
45c0: 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e  ber is.** assign
45d0: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
45e0: 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72  te3ExprAssignVar
45f0: 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50  Number(Parse *pP
4600: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
4610: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  r){.  sqlite3 *d
4620: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
4630: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
4640: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ..  if( pExpr==0
4650: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
4660: 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79  ert( !ExprHasAny
4670: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
4680: 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52  EP_IntValue|EP_R
4690: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
46a0: 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45  nly) );.  z = pE
46b0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
46c0: 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b   assert( z!=0 );
46d0: 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21  .  assert( z[0]!
46e0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d  =0 );.  if( z[1]
46f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69  ==0 ){.    /* Wi
4700: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
4710: 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20  rm "?".  Assign 
4720: 74 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c  the next variabl
4730: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
4740: 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f  assert( z[0]=='?
4750: 27 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  ' );.    pExpr->
4760: 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72  iColumn = (ynVar
4770: 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72  )(++pParse->nVar
4780: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
4790: 79 6e 56 61 72 20 78 20 3d 20 30 3b 0a 20 20 20  ynVar x = 0;.   
47a0: 20 75 33 32 20 6e 20 3d 20 73 71 6c 69 74 65 33   u32 n = sqlite3
47b0: 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20  Strlen30(z);.   
47c0: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29   if( z[0]=='?' )
47d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63  {.      /* Wildc
47e0: 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ard of the form 
47f0: 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74  "?nnn".  Convert
4800: 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74   "nnn" to an int
4810: 65 67 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a  eger and.      *
4820: 2a 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  * use it as the 
4830: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
4840: 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a  */.      i64 i;.
4850: 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20        int bOk = 
4860: 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34  0==sqlite3Atoi64
4870: 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c  (&z[1], &i, n-1,
4880: 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
4890: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
48a0: 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72  umn = x = (ynVar
48b0: 29 69 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  )i;.      testca
48c0: 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  se( i==0 );.    
48d0: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31    testcase( i==1
48e0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
48f0: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
4900: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
4910: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d  ARIABLE_NUMBER]-
4920: 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
4930: 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d  ase( i==db->aLim
4940: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
4950: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
4960: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f   );.      if( bO
4970: 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69  k==0 || i<1 || i
4980: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
4990: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
49a0: 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20  E_NUMBER] ){.   
49b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
49c0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61  rMsg(pParse, "va
49d0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75  riable number mu
49e0: 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31  st be between ?1
49f0: 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20   and ?%d",.     
4a00: 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69         db->aLimi
4a10: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
4a20: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29  ARIABLE_NUMBER])
4a30: 3b 0a 20 20 20 20 20 20 20 20 78 20 3d 20 30 3b  ;.        x = 0;
4a40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
4a50: 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61  f( i>pParse->nVa
4a60: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  r ){.        pPa
4a70: 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e 74  rse->nVar = (int
4a80: 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )i;.      }.    
4a90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
4aa0: 57 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22  Wildcards like "
4ab0: 3a 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72  :aaa", "$aaa" or
4ac0: 20 22 40 61 61 61 22 2e 20 20 52 65 75 73 65 20   "@aaa".  Reuse 
4ad0: 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c  the same variabl
4ae0: 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65  e.      ** numbe
4af0: 72 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61  r as the prior a
4b00: 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65  ppearance of the
4b10: 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69   same name, or i
4b20: 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20  f the name.     
4b30: 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70   ** has never ap
4b40: 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72  peared before, r
4b50: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61  euse the same va
4b60: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20  riable number.  
4b70: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 79 6e 56      */.      ynV
4b80: 61 72 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  ar i;.      for(
4b90: 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
4ba0: 7a 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  zVar; i++){.    
4bb0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
4bc0: 61 7a 56 61 72 5b 69 5d 20 26 26 20 6d 65 6d 63  azVar[i] && memc
4bd0: 6d 70 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  mp(pParse->azVar
4be0: 5b 69 5d 2c 7a 2c 6e 2b 31 29 3d 3d 30 20 29 7b  [i],z,n+1)==0 ){
4bf0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
4c00: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20  ->iColumn = x = 
4c10: 28 79 6e 56 61 72 29 69 2b 31 3b 0a 20 20 20 20  (ynVar)i+1;.    
4c20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4c30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
4c40: 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20       if( x==0 ) 
4c50: 78 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  x = pExpr->iColu
4c60: 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70  mn = (ynVar)(++p
4c70: 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20  Parse->nVar);.  
4c80: 20 20 7d 0a 20 20 20 20 69 66 28 20 78 3e 30 20    }.    if( x>0 
4c90: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70  ){.      if( x>p
4ca0: 50 61 72 73 65 2d 3e 6e 7a 56 61 72 20 29 7b 0a  Parse->nzVar ){.
4cb0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61          char **a
4cc0: 3b 0a 20 20 20 20 20 20 20 20 61 20 3d 20 73 71  ;.        a = sq
4cd0: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
4ce0: 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  b, pParse->azVar
4cf0: 2c 20 78 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29  , x*sizeof(a[0])
4d00: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
4d10: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  ==0 ) return;  /
4d20: 2a 20 45 72 72 6f 72 20 72 65 70 6f 72 74 65 64  * Error reported
4d30: 20 74 68 72 6f 75 67 68 20 64 62 2d 3e 6d 61 6c   through db->mal
4d40: 6c 6f 63 46 61 69 6c 65 64 20 2a 2f 0a 20 20 20  locFailed */.   
4d50: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56       pParse->azV
4d60: 61 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  ar = a;.        
4d70: 6d 65 6d 73 65 74 28 26 61 5b 70 50 61 72 73 65  memset(&a[pParse
4d80: 2d 3e 6e 7a 56 61 72 5d 2c 20 30 2c 20 28 78 2d  ->nzVar], 0, (x-
4d90: 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 29 2a 73  pParse->nzVar)*s
4da0: 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20  izeof(a[0]));.  
4db0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 7a        pParse->nz
4dc0: 56 61 72 20 3d 20 78 3b 0a 20 20 20 20 20 20 7d  Var = x;.      }
4dd0: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 21  .      if( z[0]!
4de0: 3d 27 3f 27 20 7c 7c 20 70 50 61 72 73 65 2d 3e  ='?' || pParse->
4df0: 61 7a 56 61 72 5b 78 2d 31 5d 3d 3d 30 20 29 7b  azVar[x-1]==0 ){
4e00: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4e10: 44 62 46 72 65 65 28 64 62 2c 20 70 50 61 72 73  DbFree(db, pPars
4e20: 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 29 3b 0a  e->azVar[x-1]);.
4e30: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
4e40: 61 7a 56 61 72 5b 78 2d 31 5d 20 3d 20 73 71 6c  azVar[x-1] = sql
4e50: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
4e60: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  , z, n);.      }
4e70: 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66  .    }.  } .  if
4e80: 28 20 21 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  ( !pParse->nErr 
4e90: 26 26 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e  && pParse->nVar>
4ea0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
4eb0: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
4ec0: 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20  _NUMBER] ){.    
4ed0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
4ee0: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
4ef0: 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22  y SQL variables"
4f00: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
4f10: 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65  Recursively dele
4f20: 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
4f30: 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   tree..*/.void s
4f40: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4f50: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
4f60: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d  pr *p){.  if( p=
4f70: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f  =0 ) return;.  /
4f80: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20  * Sanity check: 
4f90: 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
4fa0: 49 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d  IntValue is non-
4fb0: 6e 65 67 61 74 69 76 65 20 69 66 20 69 74 20 65  negative if it e
4fc0: 78 69 73 74 73 20 2a 2f 0a 20 20 61 73 73 65 72  xists */.  asser
4fd0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
4fe0: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
4ff0: 75 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c  ue) || p->u.iVal
5000: 75 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  ue>=0 );.  if( !
5010: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
5020: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
5030: 6c 79 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ly) ){.    sqlit
5040: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
5050: 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20   p->pLeft);.    
5060: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
5070: 65 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29  e(db, p->pRight)
5080: 3b 0a 20 20 20 20 69 66 28 20 21 45 78 70 72 48  ;.    if( !ExprH
5090: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
50a0: 5f 52 65 64 75 63 65 64 29 20 26 26 20 28 70 2d  _Reduced) && (p-
50b0: 3e 66 6c 61 67 73 32 20 26 20 45 50 32 5f 4d 61  >flags2 & EP2_Ma
50c0: 6c 6c 6f 63 65 64 54 6f 6b 65 6e 29 21 3d 30 20  llocedToken)!=0 
50d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
50e0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e  DbFree(db, p->u.
50f0: 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20  zToken);.    }. 
5100: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
5110: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
5120: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
5130: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
5140: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 53  lete(db, p->x.pS
5150: 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73  elect);.    }els
5160: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
5170: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
5180: 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  b, p->x.pList);.
5190: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
51a0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
51b0: 28 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29  (p, EP_Static) )
51c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
51d0: 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  ree(db, p);.  }.
51e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
51f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
5200: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  tes allocated fo
5210: 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
5220: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70   structure .** p
5230: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
5240: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69  st argument. Thi
5250: 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20  s is always one 
5260: 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  of EXPR_FULLSIZE
5270: 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45  ,.** EXPR_REDUCE
5280: 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f  DSIZE or EXPR_TO
5290: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a  KENONLYSIZE..*/.
52a0: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53  static int exprS
52b0: 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a  tructSize(Expr *
52c0: 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61  p){.  if( ExprHa
52d0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
52e0: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74  TokenOnly) ) ret
52f0: 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e  urn EXPR_TOKENON
5300: 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78  LYSIZE;.  if( Ex
5310: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
5320: 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 20 72   EP_Reduced) ) r
5330: 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43  eturn EXPR_REDUC
5340: 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e  EDSIZE;.  return
5350: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a   EXPR_FULLSIZE;.
5360: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70  }../*.** The dup
5370: 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f  edExpr*Size() ro
5380: 75 74 69 6e 65 73 20 65 61 63 68 20 72 65 74 75  utines each retu
5390: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
53a0: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 0a   bytes required.
53b0: 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f  ** to store a co
53c0: 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  py of an express
53d0: 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f  ion or expressio
53e0: 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20 64 69  n tree.  They di
53f0: 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d  ffer in.** how m
5400: 75 63 68 20 6f 66 20 74 68 65 20 74 72 65 65 20  uch of the tree 
5410: 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a  is measured..**.
5420: 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72  **     dupedExpr
5430: 53 74 72 75 63 74 53 69 7a 65 28 29 20 20 20 20  StructSize()    
5440: 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68   Size of only th
5450: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  e Expr structure
5460: 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78   .**     dupedEx
5470: 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20  prNodeSize()    
5480: 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20     Size of Expr 
5490: 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65  + space for toke
54a0: 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78  n.**     dupedEx
54b0: 70 72 53 69 7a 65 28 29 20 20 20 20 20 20 20 20  prSize()        
54c0: 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20     Expr + token 
54d0: 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e  + subtree compon
54e0: 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ents.**.********
54f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5530: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75  ***.**.** The du
5540: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
5550: 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  e() function ret
5560: 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20  urns two values 
5570: 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20  OR-ed together: 
5580: 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61   .** (1) the spa
5590: 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ce required for 
55a0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78  a copy of the Ex
55b0: 70 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c  pr structure onl
55c0: 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68  y and .** (2) th
55d0: 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74  e EP_xxx flags t
55e0: 68 61 74 20 69 6e 64 69 63 61 74 65 20 77 68 61  hat indicate wha
55f0: 74 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  t the structure 
5600: 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a  size should be..
5610: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
5620: 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f  lues is always o
5630: 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ne of:.**.**    
5640: 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a    EXPR_FULLSIZE.
5650: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45 44  **      EXPR_RED
5660: 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f  UCEDSIZE   | EP_
5670: 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20  Reduced.**      
5680: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
5690: 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  ZE | EP_TokenOnl
56a0: 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  y.**.** The size
56b0: 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72   of the structur
56c0: 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62  e can be found b
56d0: 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65  y masking the re
56e0: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66  turn value.** of
56f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
5700: 74 68 20 30 78 66 66 66 2e 20 20 54 68 65 20 66  th 0xfff.  The f
5710: 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e  lags can be foun
5720: 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65  d by masking the
5730: 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
5740: 20 77 69 74 68 20 45 50 5f 52 65 64 75 63 65 64   with EP_Reduced
5750: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a  |EP_TokenOnly..*
5760: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
5770: 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44  ith flags==EXPRD
5780: 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20  UP_REDUCE, this 
5790: 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f  routines works o
57a0: 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28  n full-size.** (
57b0: 75 6e 72 65 64 75 63 65 64 29 20 45 78 70 72 20  unreduced) Expr 
57c0: 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65 79 20  objects as they 
57d0: 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f  or originally co
57e0: 6e 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65  nstructed by the
57f0: 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69   parser..** Duri
5800: 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ng expression an
5810: 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e  alysis, extra in
5820: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d  formation is com
5830: 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20  puted and moved 
5840: 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61  into.** later pa
5850: 72 74 73 20 6f 66 20 74 65 68 20 45 78 70 72 20  rts of teh Expr 
5860: 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20  object and that 
5870: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
5880: 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70  n might get chop
5890: 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68  ped.** off if th
58a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
58b0: 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61  reduced.  Note a
58c0: 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73  lso that it does
58d0: 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20   not work to.** 
58e0: 6d 61 6b 65 20 61 20 45 58 50 52 44 55 50 5f 52  make a EXPRDUP_R
58f0: 45 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61 20  EDUCE copy of a 
5900: 72 65 64 75 63 65 64 20 65 78 70 72 65 73 73 69  reduced expressi
5910: 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20  on.  It is only 
5920: 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75  legal.** to redu
5930: 63 65 20 61 20 70 72 69 73 74 69 6e 65 20 65 78  ce a pristine ex
5940: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66 72  pression tree fr
5950: 6f 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20 20  om the parser.  
5960: 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
5970: 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45 78  on.** of dupedEx
5980: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 63  prStructSize() c
5990: 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20  ontain multiple 
59a0: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
59b0: 6e 74 73 20 74 68 61 74 20 61 74 74 65 6d 70 74  nts that attempt
59c0: 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20 74  .** to enforce t
59d0: 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  his constraint..
59e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
59f0: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
5a00: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
5a10: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69  lags){.  int nSi
5a20: 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c  ze;.  assert( fl
5a30: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
5a40: 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20  UCE || flags==0 
5a50: 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66  ); /* Only one f
5a60: 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65  lag value allowe
5a70: 64 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 28 66  d */.  if( 0==(f
5a80: 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44  lags&EXPRDUP_RED
5a90: 55 43 45 29 20 29 7b 0a 20 20 20 20 6e 53 69 7a  UCE) ){.    nSiz
5aa0: 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  e = EXPR_FULLSIZ
5ab0: 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
5ac0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
5ad0: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45  AnyProperty(p, E
5ae0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
5af0: 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61  educed) );.    a
5b00: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
5b10: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
5b20: 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20  omJoin) ); .    
5b30: 61 73 73 65 72 74 28 20 28 70 2d 3e 66 6c 61 67  assert( (p->flag
5b40: 73 32 20 26 20 45 50 32 5f 4d 61 6c 6c 6f 63 65  s2 & EP2_Malloce
5b50: 64 54 6f 6b 65 6e 29 3d 3d 30 20 29 3b 0a 20 20  dToken)==0 );.  
5b60: 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 66 6c    assert( (p->fl
5b70: 61 67 73 32 20 26 20 45 50 32 5f 49 72 72 65 64  ags2 & EP2_Irred
5b80: 75 63 69 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20  ucible)==0 );.  
5b90: 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c    if( p->pLeft |
5ba0: 7c 20 70 2d 3e 70 52 69 67 68 74 20 7c 7c 20 70  | p->pRight || p
5bb0: 2d 3e 70 43 6f 6c 6c 20 7c 7c 20 70 2d 3e 78 2e  ->pColl || p->x.
5bc0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e  pList ){.      n
5bd0: 53 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55  Size = EXPR_REDU
5be0: 43 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64  CEDSIZE | EP_Red
5bf0: 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  uced;.    }else{
5c00: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
5c10: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
5c20: 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  E | EP_TokenOnly
5c30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
5c40: 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f  turn nSize;.}../
5c50: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
5c60: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  on returns the s
5c70: 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 72 65  pace in bytes re
5c80: 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20  quired to store 
5c90: 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20  the copy .** of 
5ca0: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
5cb0: 72 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66  re and a copy of
5cc0: 20 74 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b   the Expr.u.zTok
5cd0: 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 74 68  en string (if th
5ce0: 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20  at.** string is 
5cf0: 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61  defined.).*/.sta
5d00: 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70  tic int dupedExp
5d10: 72 4e 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a  rNodeSize(Expr *
5d20: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
5d30: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70   int nByte = dup
5d40: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
5d50: 28 70 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66  (p, flags) & 0xf
5d60: 66 66 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48  ff;.  if( !ExprH
5d70: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5d80: 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d  _IntValue) && p-
5d90: 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
5da0: 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65   nByte += sqlite
5db0: 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a  3Strlen30(p->u.z
5dc0: 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20  Token)+1;.  }.  
5dd0: 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42  return ROUND8(nB
5de0: 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  yte);.}../*.** R
5df0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
5e00: 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
5e10: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  ed to create a d
5e20: 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20  uplicate of the 
5e30: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
5e40: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
5e50: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  st argument. The
5e60: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
5e70: 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f   is a.** mask co
5e80: 6e 74 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50  ntaining EXPRDUP
5e90: 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  _XXX flags..**.*
5ea0: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
5eb0: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70  rned includes sp
5ec0: 61 63 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  ace to create a 
5ed0: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
5ee0: 20 73 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c   struct.** itsel
5ef0: 66 20 61 6e 64 20 74 68 65 20 62 75 66 66 65 72  f and the buffer
5f00: 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20   referred to by 
5f10: 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69  Expr.u.zToken, i
5f20: 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f any..**.** If 
5f30: 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55  the EXPRDUP_REDU
5f40: 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  CE flag is set, 
5f50: 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
5f60: 76 61 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a  value includes .
5f70: 2a 2a 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c  ** space to dupl
5f80: 69 63 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e  icate all Expr n
5f90: 6f 64 65 73 20 69 6e 20 74 68 65 20 74 72 65 65  odes in the tree
5fa0: 20 66 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e   formed by Expr.
5fb0: 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78  pLeft .** and Ex
5fc0: 70 72 2e 70 52 69 67 68 74 20 76 61 72 69 61 62  pr.pRight variab
5fd0: 6c 65 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72  les (but not for
5fe0: 20 61 6e 79 20 73 74 72 75 63 74 75 72 65 73 20   any structures 
5ff0: 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a  pointed to or .*
6000: 2a 20 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d  * descended from
6010: 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73   the Expr.x.pLis
6020: 74 20 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c  t or Expr.x.pSel
6030: 65 63 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a  ect variables)..
6040: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
6050: 70 65 64 45 78 70 72 53 69 7a 65 28 45 78 70 72  pedExprSize(Expr
6060: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
6070: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30  .  int nByte = 0
6080: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
6090: 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78   nByte = dupedEx
60a0: 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c  prNodeSize(p, fl
60b0: 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c  ags);.    if( fl
60c0: 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55  ags&EXPRDUP_REDU
60d0: 43 45 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  CE ){.      nByt
60e0: 65 20 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69  e += dupedExprSi
60f0: 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61  ze(p->pLeft, fla
6100: 67 73 29 20 2b 20 64 75 70 65 64 45 78 70 72 53  gs) + dupedExprS
6110: 69 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66  ize(p->pRight, f
6120: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  lags);.    }.  }
6130: 0a 20 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b  .  return nByte;
6140: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
6150: 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
6160: 61 72 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70  ar to sqlite3Exp
6170: 72 44 75 70 28 29 2c 20 65 78 63 65 70 74 20 74  rDup(), except t
6180: 68 61 74 20 69 66 20 70 7a 42 75 66 66 65 72 20  hat if pzBuffer 
6190: 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  .** is not NULL 
61a0: 74 68 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69  then *pzBuffer i
61b0: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69  s assumed to poi
61c0: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c  nt to a buffer l
61d0: 61 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20  arge enough .** 
61e0: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70  to store the cop
61f0: 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20  y of expression 
6200: 70 2c 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66  p, the copies of
6210: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20   p->u.zToken.** 
6220: 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c  (if applicable),
6230: 20 61 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20   and the copies 
6240: 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20  of the p->pLeft 
6250: 61 6e 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78  and p->pRight ex
6260: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66  pressions,.** if
6270: 20 61 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74   any. Before ret
6280: 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65  urning, *pzBuffe
6290: 72 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  r is set to the 
62a0: 66 69 72 73 74 20 62 79 74 65 20 70 61 73 73 65  first byte passe
62b0: 64 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e  d the.** portion
62c0: 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 63   of the buffer c
62d0: 6f 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68  opied into by th
62e0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
62f0: 73 74 61 74 69 63 20 45 78 70 72 20 2a 65 78 70  static Expr *exp
6300: 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rDup(sqlite3 *db
6310: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  , Expr *p, int f
6320: 6c 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66  lags, u8 **pzBuf
6330: 66 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  fer){.  Expr *pN
6340: 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ew = 0;         
6350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6360: 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
6370: 2a 2f 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  */.  if( p ){.  
6380: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 52 65    const int isRe
6390: 64 75 63 65 64 20 3d 20 28 66 6c 61 67 73 26 45  duced = (flags&E
63a0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
63b0: 20 20 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a      u8 *zAlloc;.
63c0: 20 20 20 20 75 33 32 20 73 74 61 74 69 63 46 6c      u32 staticFl
63d0: 61 67 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73  ag = 0;..    ass
63e0: 65 72 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30  ert( pzBuffer==0
63f0: 20 7c 7c 20 69 73 52 65 64 75 63 65 64 20 29 3b   || isReduced );
6400: 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  ..    /* Figure 
6410: 6f 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69  out where to wri
6420: 74 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20  te the new Expr 
6430: 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
6440: 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29    if( pzBuffer )
6450: 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d  {.      zAlloc =
6460: 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20   *pzBuffer;.    
6470: 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45    staticFlag = E
6480: 50 5f 53 74 61 74 69 63 3b 0a 20 20 20 20 7d 65  P_Static;.    }e
6490: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f  lse{.      zAllo
64a0: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
64b0: 6c 6f 63 52 61 77 28 64 62 2c 20 64 75 70 65 64  locRaw(db, duped
64c0: 45 78 70 72 53 69 7a 65 28 70 2c 20 66 6c 61 67  ExprSize(p, flag
64d0: 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  s));.    }.    p
64e0: 4e 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41  New = (Expr *)zA
64f0: 6c 6c 6f 63 3b 0a 0a 20 20 20 20 69 66 28 20 70  lloc;..    if( p
6500: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  New ){.      /* 
6510: 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20  Set nNewSize to 
6520: 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74  the size allocat
6530: 65 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63  ed for the struc
6540: 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a  ture pointed to.
6550: 20 20 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77        ** by pNew
6560: 2e 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72  . This is either
6570: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20   EXPR_FULLSIZE, 
6580: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
6590: 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 45 58 50   or.      ** EXP
65a0: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e  R_TOKENONLYSIZE.
65b0: 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74   nToken is set t
65c0: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
65d0: 62 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20  bytes consumed. 
65e0: 20 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63       ** by the c
65f0: 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e  opy of the p->u.
6600: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69  zToken string (i
6610: 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f  f any)..      */
6620: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  .      const uns
6630: 69 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a  igned nStructSiz
6640: 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72  e = dupedExprStr
6650: 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  uctSize(p, flags
6660: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  );.      const i
6670: 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53  nt nNewSize = nS
6680: 74 72 75 63 74 53 69 7a 65 20 26 20 30 78 66 66  tructSize & 0xff
6690: 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f  f;.      int nTo
66a0: 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ken;.      if( !
66b0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
66c0: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
66d0: 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  && p->u.zToken )
66e0: 7b 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e  {.        nToken
66f0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
6700: 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20  30(p->u.zToken) 
6710: 2b 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  + 1;.      }else
6720: 7b 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e  {.        nToken
6730: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
6740: 20 20 20 20 69 66 28 20 69 73 52 65 64 75 63 65      if( isReduce
6750: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  d ){.        ass
6760: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
6770: 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63  erty(p, EP_Reduc
6780: 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ed)==0 );.      
6790: 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c    memcpy(zAlloc,
67a0: 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20   p, nNewSize);. 
67b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
67c0: 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20      int nSize = 
67d0: 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  exprStructSize(p
67e0: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
67f0: 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69  y(zAlloc, p, nSi
6800: 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ze);.        mem
6810: 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a  set(&zAlloc[nSiz
6820: 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c  e], 0, EXPR_FULL
6830: 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20  SIZE-nSize);.   
6840: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53     }..      /* S
6850: 65 74 20 74 68 65 20 45 50 5f 52 65 64 75 63 65  et the EP_Reduce
6860: 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c  d, EP_TokenOnly,
6870: 20 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66   and EP_Static f
6880: 6c 61 67 73 20 61 70 70 72 6f 70 72 69 61 74 65  lags appropriate
6890: 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  ly. */.      pNe
68a0: 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50  w->flags &= ~(EP
68b0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
68c0: 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 29  nOnly|EP_Static)
68d0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  ;.      pNew->fl
68e0: 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69  ags |= nStructSi
68f0: 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ze & (EP_Reduced
6900: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a  |EP_TokenOnly);.
6910: 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
6920: 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b  s |= staticFlag;
6930: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  ..      /* Copy 
6940: 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  the p->u.zToken 
6950: 73 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20  string, if any. 
6960: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 54 6f  */.      if( nTo
6970: 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ken ){.        c
6980: 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e  har *zToken = pN
6990: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28  ew->u.zToken = (
69a0: 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e  char*)&zAlloc[nN
69b0: 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20  ewSize];.       
69c0: 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20   memcpy(zToken, 
69d0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f  p->u.zToken, nTo
69e0: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ken);.      }.. 
69f0: 20 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d       if( 0==((p-
6a00: 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61  >flags|pNew->fla
6a10: 67 73 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e  gs) & EP_TokenOn
6a20: 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ly) ){.        /
6a30: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e  * Fill in the pN
6a40: 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72  ew->x.pSelect or
6a50: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d   pNew->x.pList m
6a60: 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ember. */.      
6a70: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
6a80: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
6a90: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
6aa0: 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c      pNew->x.pSel
6ab0: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
6ac0: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e  ectDup(db, p->x.
6ad0: 70 53 65 6c 65 63 74 2c 20 69 73 52 65 64 75 63  pSelect, isReduc
6ae0: 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ed);.        }el
6af0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
6b00: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71  ew->x.pList = sq
6b10: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
6b20: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c  (db, p->x.pList,
6b30: 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20   isReduced);.   
6b40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
6b50: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
6b60: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64   pNew->pLeft and
6b70: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a   pNew->pRight. *
6b80: 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  /.      if( Expr
6b90: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
6ba0: 4e 65 77 2c 20 45 50 5f 52 65 64 75 63 65 64 7c  New, EP_Reduced|
6bb0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
6bc0: 0a 20 20 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20  .        zAlloc 
6bd0: 2b 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65  += dupedExprNode
6be0: 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a  Size(p, flags);.
6bf0: 20 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72          if( Expr
6c00: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
6c10: 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 7b  , EP_Reduced) ){
6c20: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
6c30: 3e 70 4c 65 66 74 20 3d 20 65 78 70 72 44 75 70  >pLeft = exprDup
6c40: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45  (db, p->pLeft, E
6c50: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
6c60: 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  zAlloc);.       
6c70: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
6c80: 3d 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d  = exprDup(db, p-
6c90: 3e 70 52 69 67 68 74 2c 20 45 58 50 52 44 55 50  >pRight, EXPRDUP
6ca0: 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63  _REDUCE, &zAlloc
6cb0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
6cc0: 20 20 20 20 20 69 66 28 20 70 7a 42 75 66 66 65       if( pzBuffe
6cd0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  r ){.          *
6ce0: 70 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f  pzBuffer = zAllo
6cf0: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
6d00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6d10: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 32 20 3d    pNew->flags2 =
6d20: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
6d30: 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
6d40: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
6d50: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
6d60: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
6d70: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
6d80: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  b, p->pLeft, 0);
6d90: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
6da0: 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  >pRight = sqlite
6db0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
6dc0: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
6dd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
6de0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6df0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
6e00: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
6e10: 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73  roup of routines
6e20: 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65   make deep copie
6e30: 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  s of expressions
6e40: 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  ,.** expression 
6e50: 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c  lists, ID lists,
6e60: 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74   and select stat
6e70: 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70  ements.  The cop
6e80: 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65  ies can.** be de
6e90: 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e 67 20  leted (by being 
6ea0: 70 61 73 73 65 64 20 74 6f 20 74 68 65 69 72 20  passed to their 
6eb0: 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65  respective ...De
6ec0: 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29  lete() routines)
6ed0: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65  .** without effe
6ee0: 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e  cting the origin
6ef0: 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  als..**.** The e
6f00: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20  xpression list, 
6f10: 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c  ID, and source l
6f20: 69 73 74 73 20 72 65 74 75 72 6e 20 62 79 20 73  ists return by s
6f30: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
6f40: 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49  p(),.** sqlite3I
6f50: 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20  dListDup(), and 
6f60: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
6f70: 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66  p() can not be f
6f80: 75 72 74 68 65 72 20 65 78 70 61 6e 64 65 64 20  urther expanded 
6f90: 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e  .** by subsequen
6fa0: 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
6fb0: 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72  e*ListAppend() r
6fc0: 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  outines..**.** A
6fd0: 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74 20 74  ny tables that t
6fe0: 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74  he SrcList might
6ff0: 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f   point to are no
7000: 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2a  t duplicated..**
7010: 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61  .** The flags pa
7020: 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e 73  rameter contains
7030: 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f   a combination o
7040: 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 58 58  f the EXPRDUP_XX
7050: 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66 20 74  X flags..** If t
7060: 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  he EXPRDUP_REDUC
7070: 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  E flag is set, t
7080: 68 65 6e 20 74 68 65 20 73 74 72 75 63 74 75 72  hen the structur
7090: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 0a  e returned is a.
70a0: 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 76 65 72  ** truncated ver
70b0: 73 69 6f 6e 20 6f 66 20 74 68 65 20 75 73 75 61  sion of the usua
70c0: 6c 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  l Expr structure
70d0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 73 74   that will be st
70e0: 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20  ored as.** part 
70f0: 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  of the in-memory
7100: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
7110: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
7120: 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20  schema..*/.Expr 
7130: 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28  *sqlite3ExprDup(
7140: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
7150: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
7160: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 44  {.  return exprD
7170: 75 70 28 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c  up(db, p, flags,
7180: 20 30 29 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20   0);.}.ExprList 
7190: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
71a0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
71b0: 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e   ExprList *p, in
71c0: 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78 70 72  t flags){.  Expr
71d0: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74  List *pNew;.  st
71e0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
71f0: 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64  em *pItem, *pOld
7200: 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
7210: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
7220: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
7230: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
7240: 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  w(db, sizeof(*pN
7250: 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ew) );.  if( pNe
7260: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
7270: 0a 20 20 70 4e 65 77 2d 3e 69 45 43 75 72 73 6f  .  pNew->iECurso
7280: 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  r = 0;.  pNew->n
7290: 45 78 70 72 20 3d 20 69 20 3d 20 70 2d 3e 6e 45  Expr = i = p->nE
72a0: 78 70 72 3b 0a 20 20 69 66 28 20 28 66 6c 61 67  xpr;.  if( (flag
72b0: 73 20 26 20 45 58 50 52 44 55 50 5f 52 45 44 55  s & EXPRDUP_REDU
72c0: 43 45 29 3d 3d 30 20 29 20 66 6f 72 28 69 3d 31  CE)==0 ) for(i=1
72d0: 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b  ; i<p->nExpr; i+
72e0: 3d 69 29 7b 7d 0a 20 20 70 4e 65 77 2d 3e 61 20  =i){}.  pNew->a 
72f0: 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65  = pItem = sqlite
7300: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
7310: 20 20 69 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b    i*sizeof(p->a[
7320: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74  0]) );.  if( pIt
7330: 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  em==0 ){.    sql
7340: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
7350: 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  New);.    return
7360: 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49   0;.  } .  pOldI
7370: 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f  tem = p->a;.  fo
7380: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=0; i<p->nExp
7390: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c  r; i++, pItem++,
73a0: 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20   pOldItem++){.  
73b0: 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72    Expr *pOldExpr
73c0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78   = pOldItem->pEx
73d0: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  pr;.    pItem->p
73e0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
73f0: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78  prDup(db, pOldEx
7400: 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  pr, flags);.    
7410: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
7420: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
7430: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
7440: 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  me);.    pItem->
7450: 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44  zSpan = sqlite3D
7460: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
7470: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
7480: 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64    pItem->sortOrd
7490: 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73  er = pOldItem->s
74a0: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49  ortOrder;.    pI
74b0: 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20  tem->done = 0;. 
74c0: 20 20 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72     pItem->iOrder
74d0: 42 79 43 6f 6c 20 3d 20 70 4f 6c 64 49 74 65 6d  ByCol = pOldItem
74e0: 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c 3b 0a 20  ->iOrderByCol;. 
74f0: 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73     pItem->iAlias
7500: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 41 6c   = pOldItem->iAl
7510: 69 61 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ias;.  }.  retur
7520: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
7530: 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69   If cursors, tri
7540: 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64  ggers, views and
7550: 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20   subqueries are 
7560: 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  all omitted from
7570: 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74  .** the build, t
7580: 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hen none of the 
7590: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
75a0: 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a  es, except for .
75b0: 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
75c0: 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61  Dup(), can be ca
75d0: 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c  lled. sqlite3Sel
75e0: 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65  ectDup() is some
75f0: 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20  times.** called 
7600: 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75  with a NULL argu
7610: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  ment..*/.#if !de
7620: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7630: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
7640: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7650: 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21  TRIGGER) \. || !
7660: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
7670: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72  MIT_SUBQUERY).Sr
7680: 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
7690: 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  cListDup(sqlite3
76a0: 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70   *db, SrcList *p
76b0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
76c0: 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
76d0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42   int i;.  int nB
76e0: 79 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  yte;.  if( p==0 
76f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42  ) return 0;.  nB
7700: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29  yte = sizeof(*p)
7710: 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20   + (p->nSrc>0 ? 
7720: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
7730: 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20  * (p->nSrc-1) : 
7740: 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  0);.  pNew = sql
7750: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
7760: 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  db, nByte );.  i
7770: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
7780: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
7790: 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  Src = pNew->nAll
77a0: 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20  oc = p->nSrc;.  
77b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53  for(i=0; i<p->nS
77c0: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
77d0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
77e0: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
77f0: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
7800: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
7810: 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26  em *pOldItem = &
7820: 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62  p->a[i];.    Tab
7830: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e  le *pTab;.    pN
7840: 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ewItem->zDatabas
7850: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
7860: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
7870: 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
7880: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
7890: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
78a0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
78b0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
78c0: 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d  ewItem->zAlias =
78d0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
78e0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
78f0: 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77  Alias);.    pNew
7900: 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d  Item->jointype =
7910: 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74   pOldItem->joint
7920: 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ype;.    pNewIte
7930: 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c  m->iCursor = pOl
7940: 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  dItem->iCursor;.
7950: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64      pNewItem->ad
7960: 64 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64  drFillSub = pOld
7970: 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
7980: 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  b;.    pNewItem-
7990: 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c  >regReturn = pOl
79a0: 64 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  dItem->regReturn
79b0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
79c0: 69 73 43 6f 72 72 65 6c 61 74 65 64 20 3d 20 70  isCorrelated = p
79d0: 4f 6c 64 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65  OldItem->isCorre
79e0: 6c 61 74 65 64 3b 0a 20 20 20 20 70 4e 65 77 49  lated;.    pNewI
79f0: 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71  tem->zIndex = sq
7a00: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
7a10: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 49 6e 64  , pOldItem->zInd
7a20: 65 78 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ex);.    pNewIte
7a30: 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20  m->notIndexed = 
7a40: 70 4f 6c 64 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64  pOldItem->notInd
7a50: 65 78 65 64 3b 0a 20 20 20 20 70 4e 65 77 49 74  exed;.    pNewIt
7a60: 65 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 4f 6c  em->pIndex = pOl
7a70: 64 49 74 65 6d 2d 3e 70 49 6e 64 65 78 3b 0a 20  dItem->pIndex;. 
7a80: 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74     pTab = pNewIt
7a90: 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49  em->pTab = pOldI
7aa0: 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  tem->pTab;.    i
7ab0: 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20  f( pTab ){.     
7ac0: 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20   pTab->nRef++;. 
7ad0: 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65     }.    pNewIte
7ae0: 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
7af0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
7b00: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c  , pOldItem->pSel
7b10: 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ect, flags);.   
7b20: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d   pNewItem->pOn =
7b30: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
7b40: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f  db, pOldItem->pO
7b50: 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  n, flags);.    p
7b60: 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20  NewItem->pUsing 
7b70: 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  = sqlite3IdListD
7b80: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
7b90: 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e  >pUsing);.    pN
7ba0: 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20  ewItem->colUsed 
7bb0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55  = pOldItem->colU
7bc0: 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  sed;.  }.  retur
7bd0: 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74  n pNew;.}.IdList
7be0: 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44   *sqlite3IdListD
7bf0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
7c00: 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64  IdList *p){.  Id
7c10: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  List *pNew;.  in
7c20: 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t i;.  if( p==0 
7c30: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
7c40: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
7c50: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
7c60: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
7c70: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
7c80: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
7c90: 49 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70  Id = p->nId;.  p
7ca0: 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33  New->a = sqlite3
7cb0: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
7cc0: 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d  p->nId*sizeof(p-
7cd0: 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  >a[0]) );.  if( 
7ce0: 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20  pNew->a==0 ){.  
7cf0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
7d00: 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72  db, pNew);.    r
7d10: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f  eturn 0;.  }.  /
7d20: 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 65 63 61  * Note that beca
7d30: 75 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  use the size of 
7d40: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  the allocation f
7d50: 6f 72 20 70 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74  or p->a[] is not
7d60: 0a 20 20 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c  .  ** necessaril
7d70: 79 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  y a power of two
7d80: 2c 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41  , sqlite3IdListA
7d90: 70 70 65 6e 64 28 29 20 6d 61 79 20 6e 6f 74 20  ppend() may not 
7da0: 62 65 20 63 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f  be called.  ** o
7db0: 6e 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20  n the duplicate 
7dc0: 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73 20  created by this 
7dd0: 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66  function. */.  f
7de0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64  or(i=0; i<p->nId
7df0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
7e00: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
7e10: 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77  pNewItem = &pNew
7e20: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75  ->a[i];.    stru
7e30: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
7e40: 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61  pOldItem = &p->a
7e50: 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  [i];.    pNewIte
7e60: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
7e70: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
7e80: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
7e90: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69  .    pNewItem->i
7ea0: 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  dx = pOldItem->i
7eb0: 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dx;.  }.  return
7ec0: 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20   pNew;.}.Select 
7ed0: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
7ee0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
7ef0: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c  elect *p, int fl
7f00: 61 67 73 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  ags){.  Select *
7f10: 70 4e 65 77 2c 20 2a 70 50 72 69 6f 72 3b 0a 20  pNew, *pPrior;. 
7f20: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
7f30: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
7f40: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
7f50: 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29  w(db, sizeof(*p)
7f60: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
7f70: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
7f80: 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73  pNew->pEList = s
7f90: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
7fa0: 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  p(db, p->pEList,
7fb0: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
7fc0: 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  >pSrc = sqlite3S
7fd0: 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  rcListDup(db, p-
7fe0: 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20  >pSrc, flags);. 
7ff0: 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20   pNew->pWhere = 
8000: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
8010: 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c  b, p->pWhere, fl
8020: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47  ags);.  pNew->pG
8030: 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
8040: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
8050: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61  p->pGroupBy, fla
8060: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  gs);.  pNew->pHa
8070: 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
8080: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61  prDup(db, p->pHa
8090: 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ving, flags);.  
80a0: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
80b0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
80c0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  Dup(db, p->pOrde
80d0: 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  rBy, flags);.  p
80e0: 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b  New->op = p->op;
80f0: 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20  .  pNew->pPrior 
8100: 3d 20 70 50 72 69 6f 72 20 3d 20 73 71 6c 69 74  = pPrior = sqlit
8110: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
8120: 70 2d 3e 70 50 72 69 6f 72 2c 20 66 6c 61 67 73  p->pPrior, flags
8130: 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 20  );.  if( pPrior 
8140: 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20  ) pPrior->pNext 
8150: 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e  = pNew;.  pNew->
8160: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65  pNext = 0;.  pNe
8170: 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  w->pLimit = sqli
8180: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
8190: 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29  ->pLimit, flags)
81a0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
81b0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
81c0: 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65  up(db, p->pOffse
81d0: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  t, flags);.  pNe
81e0: 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  w->iLimit = 0;. 
81f0: 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d   pNew->iOffset =
8200: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46   0;.  pNew->selF
8210: 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61  lags = p->selFla
8220: 67 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68  gs & ~SF_UsesEph
8230: 65 6d 65 72 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e  emeral;.  pNew->
8240: 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a  pRightmost = 0;.
8250: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
8260: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
8270: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
8280: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
8290: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
82a0: 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  [2] = -1;.  retu
82b0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65  rn pNew;.}.#else
82c0: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
82d0: 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65  SelectDup(sqlite
82e0: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
82f0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
8300: 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a  assert( p==0 );.
8310: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
8320: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ndif.../*.** Add
8330: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
8340: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20  o the end of an 
8350: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
8360: 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a    If pList is.**
8370: 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c   initially NULL,
8380: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
8390: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ew expression li
83a0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  st..**.** If a m
83b0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
83c0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
83d0: 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69  he entire list i
83e0: 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e  s freed and.** N
83f0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
8400: 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73    If non-NULL is
8410: 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
8420: 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
8430: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77  .** that the new
8440: 20 65 6e 74 72 79 20 77 61 73 20 73 75 63 63 65   entry was succe
8450: 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64  ssfully appended
8460: 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73  ..*/.ExprList *s
8470: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
8480: 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70  pend(.  Parse *p
8490: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
84a0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
84b0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
84c0: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
84d0: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
84e0: 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
84f0: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  t be NULL */.  E
8500: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
8510: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
8520: 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e  sion to be appen
8530: 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  ded. Might be NU
8540: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  LL */.){.  sqlit
8550: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
8560: 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  >db;.  if( pList
8570: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
8580: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
8590: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
85a0: 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20  f(ExprList) );. 
85b0: 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
85c0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f  ){.      goto no
85d0: 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _mem;.    }.    
85e0: 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74  pList->a = sqlit
85f0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
8600: 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  , sizeof(pList->
8610: 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  a[0]));.    if( 
8620: 70 4c 69 73 74 2d 3e 61 3d 3d 30 20 29 20 67 6f  pList->a==0 ) go
8630: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 65 6c  to no_mem;.  }el
8640: 73 65 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e  se if( (pList->n
8650: 45 78 70 72 20 26 20 28 70 4c 69 73 74 2d 3e 6e  Expr & (pList->n
8660: 45 78 70 72 2d 31 29 29 3d 3d 30 20 29 7b 0a 20  Expr-1))==0 ){. 
8670: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
8680: 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20  st_item *a;.    
8690: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
86a0: 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61 20  Expr>0 );.    a 
86b0: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
86c0: 6f 63 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 2c  oc(db, pList->a,
86d0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2a 32 2a   pList->nExpr*2*
86e0: 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
86f0: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 3d  0]));.    if( a=
8700: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
8710: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20   no_mem;.    }. 
8720: 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b     pList->a = a;
8730: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
8740: 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20  List->a!=0 );.  
8750: 69 66 28 20 31 20 29 7b 0a 20 20 20 20 73 74 72  if( 1 ){.    str
8760: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
8770: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  m *pItem = &pLis
8780: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
8790: 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74  r++];.    memset
87a0: 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f  (pItem, 0, sizeo
87b0: 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20 20  f(*pItem));.    
87c0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
87d0: 45 78 70 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Expr;.  }.  retu
87e0: 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65  rn pList;..no_me
87f0: 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f  m:     .  /* Avo
8800: 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72  id leaking memor
8810: 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20  y if malloc has 
8820: 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c  failed. */.  sql
8830: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
8840: 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71 6c  b, pExpr);.  sql
8850: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
8860: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
8870: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
8880: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
8890: 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65  List.a[].zName e
88a0: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f  lement of the mo
88b0: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
88c0: 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65  d item.** on the
88d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
88e0: 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69  ..**.** pList mi
88f0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c  ght be NULL foll
8900: 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72  owing an OOM err
8910: 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65 20 73  or.  But pName s
8920: 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a  hould never be.*
8930: 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65  * NULL.  If a me
8940: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
8950: 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73  fails, the pPars
8960: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
8970: 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73  led flag.** is s
8980: 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
8990: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
89a0: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
89b0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
89c0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
89d0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
89e0: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  pList,        /*
89f0: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
8a00: 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20  o add the span. 
8a10: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
8a20: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
8a30: 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64 65 64  Name to be added
8a40: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74   */.  int dequot
8a50: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
8a60: 20 54 72 75 65 20 74 6f 20 63 61 75 73 65 20 74   True to cause t
8a70: 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20 64 65  he name to be de
8a80: 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61  quoted */.){.  a
8a90: 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
8aa0: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
8ab0: 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29  allocFailed!=0 )
8ac0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
8ad0: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
8ae0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
8af0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
8b00: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
8b10: 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69      pItem = &pLi
8b20: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
8b30: 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  pr-1];.    asser
8b40: 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d  t( pItem->zName=
8b50: 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  =0 );.    pItem-
8b60: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
8b70: 44 62 53 74 72 4e 44 75 70 28 70 50 61 72 73 65  DbStrNDup(pParse
8b80: 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20  ->db, pName->z, 
8b90: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69  pName->n);.    i
8ba0: 66 28 20 64 65 71 75 6f 74 65 20 26 26 20 70 49  f( dequote && pI
8bb0: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 20 73 71 6c  tem->zName ) sql
8bc0: 69 74 65 33 44 65 71 75 6f 74 65 28 70 49 74 65  ite3Dequote(pIte
8bd0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d  m->zName);.  }.}
8be0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
8bf0: 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70  ExprList.a[].zSp
8c00: 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  an element of th
8c10: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
8c20: 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e  added item.** on
8c30: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
8c40: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73  list..**.** pLis
8c50: 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  t might be NULL 
8c60: 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d  following an OOM
8c70: 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 53 70   error.  But pSp
8c80: 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  an should never 
8c90: 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20  be.** NULL.  If 
8ca0: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
8cb0: 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70  ion fails, the p
8cc0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
8cd0: 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20  cFailed flag.** 
8ce0: 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  is set..*/.void 
8cf0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
8d00: 65 74 53 70 61 6e 28 0a 20 20 50 61 72 73 65 20  etSpan(.  Parse 
8d10: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
8d20: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
8d30: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
8d40: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
8d50: 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69    /* List to whi
8d60: 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73 70  ch to add the sp
8d70: 61 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 53 70 61  an. */.  ExprSpa
8d80: 6e 20 2a 70 53 70 61 6e 20 20 20 20 20 20 20 20  n *pSpan        
8d90: 20 2f 2a 20 54 68 65 20 73 70 61 6e 20 74 6f 20   /* The span to 
8da0: 62 65 20 61 64 64 65 64 20 2a 2f 0a 29 7b 0a 20  be added */.){. 
8db0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
8dc0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73  Parse->db;.  ass
8dd0: 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c  ert( pList!=0 ||
8de0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
8df0: 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c  d!=0 );.  if( pL
8e00: 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ist ){.    struc
8e10: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
8e20: 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d  *pItem = &pList-
8e30: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  >a[pList->nExpr-
8e40: 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
8e50: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  pList->nExpr>0 )
8e60: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
8e70: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
8e80: 7c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3d 3d  | pItem->pExpr==
8e90: 70 53 70 61 6e 2d 3e 70 45 78 70 72 20 29 3b 0a  pSpan->pExpr );.
8ea0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8eb0: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70  e(db, pItem->zSp
8ec0: 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  an);.    pItem->
8ed0: 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44  zSpan = sqlite3D
8ee0: 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68  bStrNDup(db, (ch
8ef0: 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72  ar*)pSpan->zStar
8f00: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
8f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f20: 20 20 20 20 20 20 20 28 69 6e 74 29 28 70 53 70         (int)(pSp
8f30: 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e  an->zEnd - pSpan
8f40: 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20 7d 0a  ->zStart));.  }.
8f50: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
8f60: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
8f70: 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20  pEList contains 
8f80: 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69 74  more than iLimit
8f90: 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65   elements,.** le
8fa0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
8fb0: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
8fc0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
8fd0: 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67  xprListCheckLeng
8fe0: 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  th(.  Parse *pPa
8ff0: 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  rse,.  ExprList 
9000: 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74  *pEList,.  const
9010: 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29   char *zObject.)
9020: 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70 50 61  {.  int mx = pPa
9030: 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  rse->db->aLimit[
9040: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
9050: 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73 65  UMN];.  testcase
9060: 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
9070: 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b  st->nExpr==mx );
9080: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c  .  testcase( pEL
9090: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
90a0: 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20  Expr==mx+1 );.  
90b0: 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  if( pEList && pE
90c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29  List->nExpr>mx )
90d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
90e0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
90f0: 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
9100: 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29  in %s", zObject)
9110: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
9120: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
9130: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
9140: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9150: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 73  ExprListDelete(s
9160: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
9170: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
9180: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
9190: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
91a0: 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
91b0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
91c0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
91d0: 61 21 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e  a!=0 || pList->n
91e0: 45 78 70 72 3d 3d 30 20 29 3b 0a 20 20 66 6f 72  Expr==0 );.  for
91f0: 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
9200: 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e   i=0; i<pList->n
9210: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
9220: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
9230: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
9240: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
9250: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9260: 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  db, pItem->zName
9270: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
9280: 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
9290: 7a 53 70 61 6e 29 3b 0a 20 20 7d 0a 20 20 73 71  zSpan);.  }.  sq
92a0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
92b0: 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c  pList->a);.  sql
92c0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
92d0: 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
92e0: 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
92f0: 72 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61  re Walker callba
9300: 63 6b 73 2e 20 20 57 61 6c 6b 65 72 2e 75 2e 70  cks.  Walker.u.p
9310: 69 20 69 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  i is a pointer.*
9320: 2a 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e  * to an integer.
9330: 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73    These routines
9340: 20 61 72 65 20 63 68 65 63 6b 69 6e 67 20 61 6e   are checking an
9350: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 73   expression to s
9360: 65 65 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 61  ee.** if it is a
9370: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65 74 20   constant.  Set 
9380: 2a 57 61 6c 6b 65 72 2e 75 2e 70 69 20 74 6f 20  *Walker.u.pi to 
9390: 30 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  0 if the express
93a0: 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 6f  ion is.** not co
93b0: 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  nstant..**.** Th
93c0: 65 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  ese callback rou
93d0: 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
93e0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
93f0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
9400: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
9410: 49 73 43 6f 6e 73 74 61 6e 74 28 29 0a 2a 2a 20  IsConstant().** 
9420: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
9430: 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
9440: 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  ().**     sqlite
9450: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
9460: 72 46 75 6e 63 74 69 6f 6e 28 29 0a 2a 2a 0a 2a  rFunction().**.*
9470: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
9480: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28  rNodeIsConstant(
9490: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
94a0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a   Expr *pExpr){..
94b0: 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d    /* If pWalker-
94c0: 3e 75 2e 69 20 69 73 20 33 20 74 68 65 6e 20 61  >u.i is 3 then a
94d0: 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 65  ny term of the e
94e0: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
94f0: 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74  omes from.  ** t
9500: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
9510: 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e  lauses of a join
9520: 20 64 69 73 71 75 61 6c 69 66 69 65 73 20 74 68   disqualifies th
9530: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  e expression.  *
9540: 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e  * from being con
9550: 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74  sidered constant
9560: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b  . */.  if( pWalk
9570: 65 72 2d 3e 75 2e 69 3d 3d 33 20 26 26 20 45 78  er->u.i==3 && Ex
9580: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
9590: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
95a0: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c  oin) ){.    pWal
95b0: 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20  ker->u.i = 0;.  
95c0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
95d0: 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63  rt;.  }..  switc
95e0: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
95f0: 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20      /* Consider 
9600: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20  functions to be 
9610: 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20  constant if all 
9620: 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20  their arguments 
9630: 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20  are constant.   
9640: 20 2a 2a 20 61 6e 64 20 70 57 61 6c 6b 65 72 2d   ** and pWalker-
9650: 3e 75 2e 69 3d 3d 32 20 2a 2f 0a 20 20 20 20 63  >u.i==2 */.    c
9660: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
9670: 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b  .      if( pWalk
9680: 65 72 2d 3e 75 2e 69 3d 3d 32 20 29 20 72 65 74  er->u.i==2 ) ret
9690: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20  urn 0;.      /* 
96a0: 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a  Fall through */.
96b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a      case TK_ID:.
96c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
96d0: 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
96e0: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  AGG_FUNCTION:.  
96f0: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
9700: 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74 65 73 74  LUMN:.      test
9710: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
9720: 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20  =TK_ID );.      
9730: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
9740: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
9750: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9760: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
9770: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
9780: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9790: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
97a0: 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  G_COLUMN );.    
97b0: 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d    pWalker->u.i =
97c0: 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
97d0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
97e0: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 74  default:.      t
97f0: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
9800: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
9810: 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49 73   /* selectNodeIs
9820: 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64 69  Constant will di
9830: 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20  sallow */.      
9840: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
9850: 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29  >op==TK_EXISTS )
9860: 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49  ; /* selectNodeI
9870: 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64  sConstant will d
9880: 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  isallow */.     
9890: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
98a0: 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  inue;.  }.}.stat
98b0: 69 63 20 69 6e 74 20 73 65 6c 65 63 74 4e 6f 64  ic int selectNod
98c0: 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b  eIsConstant(Walk
98d0: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
98e0: 65 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20  ect *NotUsed){. 
98f0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
9900: 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70 57  R(NotUsed);.  pW
9910: 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a  alker->u.i = 0;.
9920: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
9930: 72 74 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  rt;.}.static int
9940: 20 65 78 70 72 49 73 43 6f 6e 73 74 28 45 78 70   exprIsConst(Exp
9950: 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69 74 46 6c  r *p, int initFl
9960: 61 67 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  ag){.  Walker w;
9970: 0a 20 20 77 2e 75 2e 69 20 3d 20 69 6e 69 74 46  .  w.u.i = initF
9980: 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  lag;.  w.xExprCa
9990: 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64  llback = exprNod
99a0: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77  eIsConstant;.  w
99b0: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
99c0: 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43   = selectNodeIsC
99d0: 6f 6e 73 74 61 6e 74 3b 0a 20 20 73 71 6c 69 74  onstant;.  sqlit
99e0: 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
99f0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 75 2e  );.  return w.u.
9a00: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  i;.}../*.** Walk
9a10: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
9a20: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ree.  Return 1 i
9a30: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9a40: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
9a50: 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f  and 0 if it invo
9a60: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
9a70: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
9a80: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
9a90: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
9aa0: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
9ab0: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
9ac0: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
9ad0: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
9ae0: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
9af0: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
9b00: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
9b10: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
9b20: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
9b30: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
9b40: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
9b50: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
9b60: 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  , 1);.}../*.** W
9b70: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
9b80: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
9b90: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
9ba0: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
9bb0: 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 20  ** that does no 
9bc0: 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74  originate from t
9bd0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
9be0: 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e  lauses of a join
9bf0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  ..** Return 0 if
9c00: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
9c10: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
9c20: 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d  on calls or term
9c30: 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20  s from.** an ON 
9c40: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  or USING clause.
9c50: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
9c60: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
9c70: 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20  Join(Expr *p){. 
9c80: 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f   return exprIsCo
9c90: 6e 73 74 28 70 2c 20 33 29 3b 0a 7d 0a 0a 2f 2a  nst(p, 3);.}../*
9ca0: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
9cb0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
9cc0: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
9cd0: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
9ce0: 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e  tant.** or a fun
9cf0: 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20  ction call with 
9d00: 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
9d10: 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20  ts.  Return and 
9d20: 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72  0 if there.** ar
9d30: 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e  e any variables.
9d40: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
9d50: 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
9d60: 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62  function, a doub
9d70: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
9d80: 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20   (ex: "abc").** 
9d90: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
9da0: 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73  variable but a s
9db0: 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ingle-quoted str
9dc0: 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20  ing (ex: 'abc') 
9dd0: 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74  is.** a constant
9de0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
9df0: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
9e00: 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70  Function(Expr *p
9e10: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
9e20: 49 73 43 6f 6e 73 74 28 70 2c 20 32 29 3b 0a 7d  IsConst(p, 2);.}
9e30: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
9e40: 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65  xpression p code
9e50: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74  s a constant int
9e60: 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61  eger that is sma
9e70: 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20  ll enough.** to 
9e80: 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20  fit in a 32-bit 
9e90: 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
9ea0: 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61  1 and put the va
9eb0: 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67  lue of the integ
9ec0: 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65  er.** in *pValue
9ed0: 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73  .  If the expres
9ee0: 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69  sion is not an i
9ef0: 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20  nteger or if it 
9f00: 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f  is too big.** to
9f10: 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64   fit in a signed
9f20: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
9f30: 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65   return 0 and le
9f40: 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68  ave *pValue unch
9f50: 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
9f60: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
9f70: 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  er(Expr *p, int 
9f80: 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20  *pValue){.  int 
9f90: 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66  rc = 0;..  /* If
9fa0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
9fb0: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74  s an integer lit
9fc0: 65 72 61 6c 20 74 68 61 74 20 66 69 74 73 20 69  eral that fits i
9fd0: 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
9fe0: 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20  t.  ** integer, 
9ff0: 74 68 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56  then the EP_IntV
a000: 61 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68  alue flag will h
a010: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
a020: 20 73 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74   set */.  assert
a030: 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45  ( p->op!=TK_INTE
a040: 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73  GER || (p->flags
a050: 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21   & EP_IntValue)!
a060: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
a070: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
a080: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72  (p->u.zToken, &r
a090: 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  c)==0 );..  if( 
a0a0: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  p->flags & EP_In
a0b0: 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70  tValue ){.    *p
a0c0: 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61  Value = p->u.iVa
a0d0: 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  lue;.    return 
a0e0: 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  1;.  }.  switch(
a0f0: 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
a100: 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
a110: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
a120: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
a130: 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29  ->pLeft, pValue)
a140: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a150: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
a160: 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
a170: 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66   int v;.      if
a180: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
a190: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
a1a0: 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20   &v) ){.        
a1b0: 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20  *pValue = -v;.  
a1c0: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
a1d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
a1e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
a1f0: 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d  ault: break;.  }
a200: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
a210: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41  ./*.** Return FA
a220: 4c 53 45 20 69 66 20 74 68 65 72 65 20 69 73 20  LSE if there is 
a230: 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  no chance that t
a240: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  he expression ca
a250: 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n be NULL..**.**
a260: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
a270: 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  on might be NULL
a280: 20 6f 72 20 69 66 20 74 68 65 20 65 78 70 72 65   or if the expre
a290: 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d  ssion is too com
a2a0: 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20  plex.** to tell 
a2b0: 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a  return TRUE.  .*
a2c0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a2d0: 65 20 69 73 20 75 73 65 64 20 61 73 20 61 6e 20  e is used as an 
a2e0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f  optimization, to
a2f0: 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20   skip OP_IsNull 
a300: 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20  opcodes.** when 
a310: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 76  we know that a v
a320: 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e  alue cannot be N
a330: 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61 20 66  ULL.  Hence, a f
a340: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a  alse positive.**
a350: 20 28 72 65 74 75 72 6e 69 6e 67 20 54 52 55 45   (returning TRUE
a360: 20 77 68 65 6e 20 69 6e 20 66 61 63 74 20 74 68   when in fact th
a370: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  e expression can
a380: 20 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c 29 20   never be NULL) 
a390: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d  might.** be a sm
a3a0: 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  all performance 
a3b0: 68 69 74 20 62 75 74 20 69 73 20 6f 74 68 65 72  hit but is other
a3c0: 77 69 73 65 20 68 61 72 6d 6c 65 73 73 2e 20 20  wise harmless.  
a3d0: 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20  On the other.** 
a3e0: 68 61 6e 64 2c 20 61 20 66 61 6c 73 65 20 6e 65  hand, a false ne
a3f0: 67 61 74 69 76 65 20 28 72 65 74 75 72 6e 69 6e  gative (returnin
a400: 67 20 46 41 4c 53 45 20 77 68 65 6e 20 74 68 65  g FALSE when the
a410: 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20 62 65   result could be
a420: 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c   NULL).** will l
a430: 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20  ikely result in 
a440: 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73  an incorrect ans
a450: 77 65 72 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e  wer.  So when in
a460: 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a   doubt, return.*
a470: 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73  * TRUE..*/.int s
a480: 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
a490: 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72 20 2a  ull(const Expr *
a4a0: 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77  p){.  u8 op;.  w
a4b0: 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  hile( p->op==TK_
a4c0: 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  UPLUS || p->op==
a4d0: 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d  TK_UMINUS ){ p =
a4e0: 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f   p->pLeft; }.  o
a4f0: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28  p = p->op;.  if(
a500: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
a510: 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a   ) op = p->op2;.
a520: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
a530: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
a540: 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  GER:.    case TK
a550: 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63 61 73  _STRING:.    cas
a560: 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20  e TK_FLOAT:.    
a570: 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20  case TK_BLOB:.  
a580: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
a590: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
a5a0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
a5b0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
a5c0: 20 61 6e 20 4f 50 5f 49 73 4e 75 6c 6c 20 69 6e   an OP_IsNull in
a5d0: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 74  struction that t
a5e0: 65 73 74 73 20 72 65 67 69 73 74 65 72 20 69 52  ests register iR
a5f0: 65 67 20 61 6e 64 20 6a 75 6d 70 73 0a 2a 2a 20  eg and jumps.** 
a600: 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 44 65 73  to location iDes
a610: 74 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  t if the value i
a620: 6e 20 69 52 65 67 20 69 73 20 4e 55 4c 4c 2e 20  n iReg is NULL. 
a630: 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 69 52   The value in iR
a640: 65 67 20 0a 2a 2a 20 77 61 73 20 63 6f 6d 70 75  eg .** was compu
a650: 74 65 64 20 62 79 20 70 45 78 70 72 2e 20 20 49  ted by pExpr.  I
a660: 66 20 77 65 20 63 61 6e 20 6c 6f 6f 6b 20 61 74  f we can look at
a670: 20 70 45 78 70 72 20 61 74 20 63 6f 6d 70 69 6c   pExpr at compil
a680: 65 2d 74 69 6d 65 20 61 6e 64 0a 2a 2a 20 64 65  e-time and.** de
a690: 74 65 72 6d 69 6e 65 20 74 68 61 74 20 69 74 20  termine that it 
a6a0: 63 61 6e 20 6e 65 76 65 72 20 67 65 6e 65 72 61  can never genera
a6b0: 74 65 20 61 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  te a NULL, then 
a6c0: 74 68 65 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70  the OP_IsNull op
a6d0: 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62  eration.** can b
a6e0: 65 20 6f 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f  e omitted..*/.vo
a6f0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
a700: 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 0a 20 20  deIsNullJump(.  
a710: 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
a720: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
a730: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
a740: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 45 78  on */.  const Ex
a750: 70 72 20 2a 70 45 78 70 72 2c 20 20 2f 2a 20 4f  pr *pExpr,  /* O
a760: 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 4f 50 5f  nly generate OP_
a770: 49 73 4e 75 6c 6c 20 69 66 20 74 68 69 73 20 65  IsNull if this e
a780: 78 70 72 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20  xpr can be NULL 
a790: 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20  */.  int iReg,  
a7a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 73 74           /* Test
a7b0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
a7c0: 69 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  is register for 
a7d0: 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 44  NULL */.  int iD
a7e0: 65 73 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a  est           /*
a7f0: 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68   Jump here if th
a800: 65 20 76 61 6c 75 65 20 69 73 20 6e 75 6c 6c 20  e value is null 
a810: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69  */.){.  if( sqli
a820: 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
a830: 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73  (pExpr) ){.    s
a840: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a850: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69  (v, OP_IsNull, i
a860: 52 65 67 2c 20 69 44 65 73 74 29 3b 0a 20 20 7d  Reg, iDest);.  }
a870: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
a880: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
a890: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  en expression is
a8a0: 20 61 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 63   a constant whic
a8b0: 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e  h would be.** un
a8c0: 63 68 61 6e 67 65 64 20 62 79 20 4f 50 5f 41 66  changed by OP_Af
a8d0: 66 69 6e 69 74 79 20 77 69 74 68 20 74 68 65 20  finity with the 
a8e0: 61 66 66 69 6e 69 74 79 20 67 69 76 65 6e 20 69  affinity given i
a8f0: 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  n the second.** 
a900: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
a910: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
a920: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
a930: 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69  e if the OP_Affi
a940: 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a  nity operation.*
a950: 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64  * can be omitted
a960: 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74  .  When in doubt
a970: 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 20 20   return FALSE.  
a980: 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65  A false negative
a990: 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73 73 2e  .** is harmless.
a9a0: 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69    A false positi
a9b0: 76 65 2c 20 68 6f 77 65 76 65 72 2c 20 63 61 6e  ve, however, can
a9c0: 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 77   result in the w
a9d0: 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a  rong.** answer..
a9e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
a9f0: 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
aa00: 79 43 68 61 6e 67 65 28 63 6f 6e 73 74 20 45 78  yChange(const Ex
aa10: 70 72 20 2a 70 2c 20 63 68 61 72 20 61 66 66 29  pr *p, char aff)
aa20: 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69 66 28  {.  u8 op;.  if(
aa30: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
aa40: 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 31  _NONE ) return 1
aa50: 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70  ;.  while( p->op
aa60: 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d  ==TK_UPLUS || p-
aa70: 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29  >op==TK_UMINUS )
aa80: 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20  { p = p->pLeft; 
aa90: 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  }.  op = p->op;.
aaa0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
aab0: 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e  ISTER ) op = p->
aac0: 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op2;.  switch( o
aad0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
aae0: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
aaf0: 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51    return aff==SQ
ab00: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
ab10: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
ab20: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
ab30: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46   }.    case TK_F
ab40: 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65  LOAT: {.      re
ab50: 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45  turn aff==SQLITE
ab60: 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66  _AFF_REAL || aff
ab70: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
ab80: 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ERIC;.    }.    
ab90: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
aba0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
abb0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ff==SQLITE_AFF_T
abc0: 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  EXT;.    }.    c
abd0: 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
abe0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
abf0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
ac00: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
ac10: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62   assert( p->iTab
ac20: 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63  le>=0 );  /* p c
ac30: 61 6e 6e 6f 74 20 62 65 20 70 61 72 74 20 6f 66  annot be part of
ac40: 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61   a CHECK constra
ac50: 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  int */.      ret
ac60: 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  urn p->iColumn<0
ac70: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 61  .          && (a
ac80: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff==SQLITE_AFF_I
ac90: 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53  NTEGER || aff==S
aca0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
acb0: 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  C);.    }.    de
acc0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72  fault: {.      r
acd0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
ace0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
acf0: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
ad00: 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61  iven string is a
ad10: 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e   row-id column n
ad20: 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ame..*/.int sqli
ad30: 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74  te3IsRowid(const
ad40: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28   char *z){.  if(
ad50: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
ad60: 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30  z, "_ROWID_")==0
ad70: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
ad80: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
ad90: 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30  p(z, "ROWID")==0
ada0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
adb0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
adc0: 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29  p(z, "OID")==0 )
add0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
ade0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
adf0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 77  Return true if w
ae00: 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 74 68  e are able to th
ae10: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6f 70  e IN operator op
ae20: 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 20 61 0a  timization on a.
ae30: 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68 65 20  ** query of the 
ae40: 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  form.**.**      
ae50: 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e   x IN (SELECT ..
ae60: 2e 29 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 20 74  .).**.** Where t
ae70: 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 63 6c 61  he SELECT... cla
ae80: 75 73 65 20 69 73 20 61 73 20 73 70 65 63 69 66  use is as specif
ae90: 69 65 64 20 62 79 20 74 68 65 20 70 61 72 61 6d  ied by the param
aea0: 65 74 65 72 20 74 6f 20 74 68 69 73 0a 2a 2a 20  eter to this.** 
aeb0: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
aec0: 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74  he Select object
aed0: 20 70 61 73 73 65 64 20 69 6e 20 68 61 73 20 61   passed in has a
aee0: 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72 65 70  lready been prep
aef0: 72 6f 63 65 73 73 65 64 20 61 6e 64 20 6e 6f 0a  rocessed and no.
af00: 2a 2a 20 65 72 72 6f 72 73 20 68 61 76 65 20 62  ** errors have b
af10: 65 65 6e 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 23 69  een found..*/.#i
af20: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
af30: 54 5f 53 55 42 51 55 45 52 59 0a 73 74 61 74 69  T_SUBQUERY.stati
af40: 63 20 69 6e 74 20 69 73 43 61 6e 64 69 64 61 74  c int isCandidat
af50: 65 46 6f 72 49 6e 4f 70 74 28 53 65 6c 65 63 74  eForInOpt(Select
af60: 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20   *p){.  SrcList 
af70: 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73  *pSrc;.  ExprLis
af80: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62  t *pEList;.  Tab
af90: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 66 28 20  le *pTab;.  if( 
afa0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
afb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afc0: 20 20 20 2f 2a 20 72 69 67 68 74 2d 68 61 6e 64     /* right-hand
afd0: 20 73 69 64 65 20 6f 66 20 49 4e 20 69 73 20 53   side of IN is S
afe0: 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70  ELECT */.  if( p
aff0: 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75 72  ->pPrior ) retur
b000: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
b010: 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70 6f    /* Not a compo
b020: 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  und SELECT */.  
b030: 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
b040: 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
b050: 46 5f 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a  F_Aggregate) ){.
b060: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
b070: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
b080: 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
b090: 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
b0a0: 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 74 65 73  tinct );.    tes
b0b0: 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c  tcase( (p->selFl
b0c0: 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
b0d0: 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
b0e0: 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20  )==SF_Aggregate 
b0f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
b100: 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43 54 20   /* No DISTINCT 
b110: 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e 6f 20 61  keyword and no a
b120: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
b130: 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65  ns */.  }.  asse
b140: 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d  rt( p->pGroupBy=
b150: 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
b160: 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47 52 4f     /* Has no GRO
b170: 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  UP BY clause */.
b180: 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
b190: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
b1a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20           /* Has 
b1b0: 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  no LIMIT clause 
b1c0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
b1d0: 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20  pOffset==0 );   
b1e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b1f0: 6f 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 6e 6f  o LIMIT means no
b200: 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 66 28   OFFSET */.  if(
b210: 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
b220: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
b230: 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48      /* Has no WH
b240: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
b250: 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
b260: 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d    assert( pSrc!=
b270: 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d  0 );.  if( pSrc-
b280: 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72  >nSrc!=1 ) retur
b290: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  n 0;          /*
b2a0: 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20   Single term in 
b2b0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
b2c0: 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e   if( pSrc->a[0].
b2d0: 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e  pSelect ) return
b2e0: 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20   0;     /* FROM 
b2f0: 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72  is not a subquer
b300: 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 70  y or view */.  p
b310: 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d  Tab = pSrc->a[0]
b320: 2e 70 54 61 62 3b 0a 20 20 69 66 28 20 4e 45 56  .pTab;.  if( NEV
b330: 45 52 28 70 54 61 62 3d 3d 30 29 20 29 20 72 65  ER(pTab==0) ) re
b340: 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74  turn 0;.  assert
b350: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  ( pTab->pSelect=
b360: 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
b370: 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
b380: 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f  is not a view */
b390: 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
b3a0: 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
b3b0: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f  0;        /* FRO
b3c0: 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61 20 76  M clause not a v
b3d0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
b3e0: 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
b3f0: 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69  List;.  if( pELi
b400: 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
b410: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 2f  eturn 0;       /
b420: 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  * One column in 
b430: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
b440: 2f 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e  /.  if( pEList->
b450: 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d  a[0].pExpr->op!=
b460: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75  TK_COLUMN ) retu
b470: 72 6e 20 30 3b 20 2f 2a 20 52 65 73 75 6c 74 20  rn 0; /* Result 
b480: 69 73 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  is a column */. 
b490: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
b4a0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
b4b0: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
b4c0: 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50  /*.** Code an OP
b4d0: 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 69 6f  _Once instructio
b4e0: 6e 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 73  n and allocate s
b4f0: 70 61 63 65 20 66 6f 72 20 69 74 73 20 66 6c 61  pace for its fla
b500: 67 2e 20 52 65 74 75 72 6e 20 74 68 65 20 0a 2a  g. Return the .*
b510: 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  * address of the
b520: 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e   new instruction
b530: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
b540: 43 6f 64 65 4f 6e 63 65 28 50 61 72 73 65 20 2a  CodeOnce(Parse *
b550: 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20  pParse){.  Vdbe 
b560: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
b570: 64 62 65 28 70 50 61 72 73 65 29 3b 20 20 20 20  dbe(pParse);    
b580: 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63    /* Virtual mac
b590: 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64  hine being coded
b5a0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   */.  return sql
b5b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
b5c0: 2c 20 4f 50 5f 4f 6e 63 65 2c 20 70 50 61 72 73  , OP_Once, pPars
b5d0: 65 2d 3e 6e 4f 6e 63 65 2b 2b 29 3b 0a 7d 0a 0a  e->nOnce++);.}..
b5e0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
b5f0: 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74  ion is used by t
b600: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
b610: 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e  n of the IN (...
b620: 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 49  ) operator..** I
b630: 74 27 73 20 6a 6f 62 20 69 73 20 74 6f 20 66 69  t's job is to fi
b640: 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61 20 62  nd or create a b
b650: 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
b660: 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 65 64  that may be used
b670: 0a 2a 2a 20 65 69 74 68 65 72 20 74 6f 20 74 65  .** either to te
b680: 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  st for membershi
b690: 70 20 6f 66 20 74 68 65 20 28 2e 2e 2e 29 20 73  p of the (...) s
b6a0: 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65  et or to iterate
b6b0: 20 74 68 72 6f 75 67 68 0a 2a 2a 20 69 74 73 20   through.** its 
b6c0: 6d 65 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e  members, skippin
b6d0: 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a  g duplicates..**
b6e0: 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 6f 66  .** The index of
b6f0: 20 74 68 65 20 63 75 72 73 6f 72 20 6f 70 65 6e   the cursor open
b700: 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72 65 65  ed on the b-tree
b710: 20 28 64 61 74 61 62 61 73 65 20 74 61 62 6c 65   (database table
b720: 2c 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  , database index
b730: 20 0a 2a 2a 20 6f 72 20 65 70 68 65 72 6d 61 6c   .** or ephermal
b740: 20 74 61 62 6c 65 29 20 69 73 20 73 74 6f 72 65   table) is store
b750: 64 20 69 6e 20 70 58 2d 3e 69 54 61 62 6c 65 20  d in pX->iTable 
b760: 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
b770: 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a  tion returns..**
b780: 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
b790: 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
b7a0: 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74  tion indicates t
b7b0: 68 65 20 62 2d 74 72 65 65 20 74 79 70 65 2c 20  he b-tree type, 
b7c0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
b7d0: 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  *   IN_INDEX_ROW
b7e0: 49 44 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20  ID - The cursor 
b7f0: 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
b800: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a  database table..
b810: 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  **   IN_INDEX_IN
b820: 44 45 58 20 2d 20 54 68 65 20 63 75 72 73 6f 72  DEX - The cursor
b830: 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
b840: 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 2e   database index.
b850: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45  .**   IN_INDEX_E
b860: 50 48 20 2d 20 20 20 54 68 65 20 63 75 72 73 6f  PH -   The curso
b870: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
b880: 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61  a specially crea
b890: 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ted and.**      
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
b8b0: 70 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d 61  pulated epherema
b8c0: 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41  l table..**.** A
b8d0: 6e 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72 65  n existing b-tre
b8e0: 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  e may only be us
b8f0: 65 64 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  ed if the SELECT
b900: 20 69 73 20 6f 66 20 74 68 65 20 73 69 6d 70 6c   is of the simpl
b910: 65 0a 2a 2a 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a  e.** form:.**.**
b920: 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c       SELECT <col
b930: 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65  umn> FROM <table
b940: 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  >.**.** If the p
b950: 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72 61 6d 65  rNotFound parame
b960: 74 65 72 20 69 73 20 30 2c 20 74 68 65 6e 20 74  ter is 0, then t
b970: 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62  he b-tree will b
b980: 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  e used to iterat
b990: 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65  e.** through the
b9a0: 20 73 65 74 20 6d 65 6d 62 65 72 73 2c 20 73 6b   set members, sk
b9b0: 69 70 70 69 6e 67 20 61 6e 79 20 64 75 70 6c 69  ipping any dupli
b9c0: 63 61 74 65 73 2e 20 49 6e 20 74 68 69 73 20 63  cates. In this c
b9d0: 61 73 65 20 61 6e 0a 2a 2a 20 65 70 68 65 72 65  ase an.** ephere
b9e0: 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 62  mal table must b
b9f0: 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 74 68  e used unless th
ba00: 65 20 73 65 6c 65 63 74 65 64 20 3c 63 6f 6c 75  e selected <colu
ba10: 6d 6e 3e 20 69 73 20 67 75 61 72 61 6e 74 65 65  mn> is guarantee
ba20: 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71 75  d.** to be uniqu
ba30: 65 20 2d 20 65 69 74 68 65 72 20 62 65 63 61 75  e - either becau
ba40: 73 65 20 69 74 20 69 73 20 61 6e 20 49 4e 54 45  se it is an INTE
ba50: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
ba60: 6f 72 20 69 74 0a 2a 2a 20 68 61 73 20 61 20 55  or it.** has a U
ba70: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
ba80: 20 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78   or UNIQUE index
ba90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
baa0: 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72 61 6d 65  rNotFound parame
bab0: 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  ter is not 0, th
bac0: 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 77 69  en the b-tree wi
bad0: 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66  ll be used .** f
bae0: 6f 72 20 66 61 73 74 20 73 65 74 20 6d 65 6d 62  or fast set memb
baf0: 65 72 73 68 69 70 20 74 65 73 74 73 2e 20 49 6e  ership tests. In
bb00: 20 74 68 69 73 20 63 61 73 65 20 61 6e 20 65 70   this case an ep
bb10: 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75  heremal table mu
bb20: 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20 75  st .** be used u
bb30: 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 3e 20 69  nless <column> i
bb40: 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
bb50: 4d 41 52 59 20 4b 45 59 20 6f 72 20 61 6e 20 69  MARY KEY or an i
bb60: 6e 64 65 78 20 63 61 6e 20 0a 2a 2a 20 62 65 20  ndex can .** be 
bb70: 66 6f 75 6e 64 20 77 69 74 68 20 3c 63 6f 6c 75  found with <colu
bb80: 6d 6e 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d  mn> as its left-
bb90: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a  most column..**.
bba0: 2a 2a 20 57 68 65 6e 20 74 68 65 20 62 2d 74 72  ** When the b-tr
bbb0: 65 65 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  ee is being used
bbc0: 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20   for membership 
bbd0: 74 65 73 74 73 2c 20 74 68 65 20 63 61 6c 6c 69  tests, the calli
bbe0: 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6e  ng function.** n
bbf0: 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20 77 68 65  eeds to know whe
bc00: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
bc10: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
bc20: 6e 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 0a  ns an SQL NULL .
bc30: 2a 2a 20 76 61 6c 75 65 20 69 6e 20 6f 72 64 65  ** value in orde
bc40: 72 20 74 6f 20 63 6f 72 72 65 63 74 6c 79 20 65  r to correctly e
bc50: 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69  valuate expressi
bc60: 6f 6e 73 20 6c 69 6b 65 20 22 58 20 49 4e 20 28  ons like "X IN (
bc70: 59 2c 20 5a 29 22 2e 0a 2a 2a 20 49 66 20 74 68  Y, Z)"..** If th
bc80: 65 72 65 20 69 73 20 61 6e 79 20 63 68 61 6e 63  ere is any chanc
bc90: 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29  e that the (...)
bca0: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61   might contain a
bcb0: 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a   NULL value at.*
bcc0: 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20  * runtime, then 
bcd0: 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c  a register is al
bce0: 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
bcf0: 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
bd00: 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70  written.** to *p
bd10: 72 4e 6f 74 46 6f 75 6e 64 2e 20 49 66 20 74 68  rNotFound. If th
bd20: 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
bd30: 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20   that the (...) 
bd40: 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55  contains a.** NU
bd50: 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a  LL value, then *
bd60: 70 72 4e 6f 74 46 6f 75 6e 64 20 69 73 20 6c 65  prNotFound is le
bd70: 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
bd80: 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65  .** If a registe
bd90: 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  r is allocated a
bda0: 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20  nd its location 
bdb0: 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 4e 6f 74  stored in *prNot
bdc0: 46 6f 75 6e 64 2c 20 74 68 65 6e 0a 2a 2a 20 69  Found, then.** i
bdd0: 74 73 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  ts initial value
bde0: 20 69 73 20 4e 55 4c 4c 2e 20 20 49 66 20 74 68   is NULL.  If th
bdf0: 65 20 28 2e 2e 2e 29 20 64 6f 65 73 20 6e 6f 74  e (...) does not
be00: 20 72 65 6d 61 69 6e 20 63 6f 6e 73 74 61 6e 74   remain constant
be10: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 75 72 61  .** for the dura
be20: 74 69 6f 6e 20 6f 66 20 74 68 65 20 71 75 65 72  tion of the quer
be30: 79 20 28 69 2e 65 2e 20 74 68 65 20 53 45 4c 45  y (i.e. the SELE
be40: 43 54 20 77 69 74 68 69 6e 20 74 68 65 20 28 2e  CT within the (.
be50: 2e 2e 29 0a 2a 2a 20 69 73 20 61 20 63 6f 72 72  ..).** is a corr
be60: 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 29  elated subquery)
be70: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
be80: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  of the allocated
be90: 20 72 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20   register is.** 
bea0: 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 65 61  reset to NULL ea
beb0: 63 68 20 74 69 6d 65 20 74 68 65 20 73 75 62 71  ch time the subq
bec0: 75 65 72 79 20 69 73 20 72 65 72 75 6e 2e 20 54  uery is rerun. T
bed0: 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 0a 2a  his allows the.*
bee0: 2a 20 63 61 6c 6c 65 72 20 74 6f 20 75 73 65 20  * caller to use 
bef0: 76 64 62 65 20 63 6f 64 65 20 65 71 75 69 76 61  vdbe code equiva
bf00: 6c 65 6e 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c  lent to the foll
bf10: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  owing:.**.**   i
bf20: 66 28 20 72 65 67 69 73 74 65 72 3d 3d 4e 55 4c  f( register==NUL
bf30: 4c 20 29 7b 0a 2a 2a 20 20 20 20 20 68 61 73 5f  L ){.**     has_
bf40: 6e 75 6c 6c 20 3d 20 3c 74 65 73 74 20 69 66 20  null = <test if 
bf50: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63  data structure c
bf60: 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a  ontains null>.**
bf70: 20 20 20 20 20 72 65 67 69 73 74 65 72 20 3d 20       register = 
bf80: 31 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 69  1.**   }.**.** i
bf90: 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
bfa0: 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 3c 74 65   running the <te
bfb0: 73 74 20 69 66 20 64 61 74 61 20 73 74 72 75 63  st if data struc
bfc0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 6e 75  ture contains nu
bfd0: 6c 6c 3e 0a 2a 2a 20 74 65 73 74 20 6d 6f 72 65  ll>.** test more
bfe0: 20 6f 66 74 65 6e 20 74 68 61 6e 20 69 73 20 6e   often than is n
bff0: 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 23 69 66  ecessary..*/.#if
c000: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c010: 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71  _SUBQUERY.int sq
c020: 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
c030: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
c040: 45 78 70 72 20 2a 70 58 2c 20 69 6e 74 20 2a 70  Expr *pX, int *p
c050: 72 4e 6f 74 46 6f 75 6e 64 29 7b 0a 20 20 53 65  rNotFound){.  Se
c060: 6c 65 63 74 20 2a 70 3b 20 20 20 20 20 20 20 20  lect *p;        
c070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c080: 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f      /* SELECT to
c090: 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 49 4e   the right of IN
c0a0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   operator */.  i
c0b0: 6e 74 20 65 54 79 70 65 20 3d 20 30 3b 20 20 20  nt eType = 0;   
c0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0d0: 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
c0e0: 52 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e  RHS table. IN_IN
c0f0: 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69  DEX_* */.  int i
c100: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
c110: 61 62 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20  ab++;           
c120: 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 68   /* Cursor of th
c130: 65 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20  e RHS table */. 
c140: 20 69 6e 74 20 6d 75 73 74 42 65 55 6e 69 71 75   int mustBeUniqu
c150: 65 20 3d 20 28 70 72 4e 6f 74 46 6f 75 6e 64 3d  e = (prNotFound=
c160: 3d 30 29 3b 20 20 20 2f 2a 20 54 72 75 65 20 69  =0);   /* True i
c170: 66 20 52 48 53 20 6d 75 73 74 20 62 65 20 75 6e  f RHS must be un
c180: 69 71 75 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ique */.  Vdbe *
c190: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
c1a0: 62 65 28 70 50 61 72 73 65 29 3b 20 20 20 20 20  be(pParse);     
c1b0: 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69  /* Virtual machi
c1c0: 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  ne being coded *
c1d0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 58 2d  /..  assert( pX-
c1e0: 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 0a 20  >op==TK_IN );.. 
c1f0: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
c200: 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
c210: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 63  table or index c
c220: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20  an be used to.  
c230: 2a 2a 20 73 61 74 69 73 66 79 20 74 68 65 20 71  ** satisfy the q
c240: 75 65 72 79 2e 20 20 54 68 69 73 20 69 73 20 70  uery.  This is p
c250: 72 65 66 65 72 61 62 6c 65 20 74 6f 20 67 65 6e  referable to gen
c260: 65 72 61 74 69 6e 67 20 61 20 6e 65 77 20 0a 20  erating a new . 
c270: 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 74 61   ** ephemeral ta
c280: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20  ble..  */.  p = 
c290: 28 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  (ExprHasProperty
c2a0: 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pX, EP_xIsSelec
c2b0: 74 29 20 3f 20 70 58 2d 3e 78 2e 70 53 65 6c 65  t) ? pX->x.pSele
c2c0: 63 74 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 41  ct : 0);.  if( A
c2d0: 4c 57 41 59 53 28 70 50 61 72 73 65 2d 3e 6e 45  LWAYS(pParse->nE
c2e0: 72 72 3d 3d 30 29 20 26 26 20 69 73 43 61 6e 64  rr==0) && isCand
c2f0: 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29  idateForInOpt(p)
c300: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
c310: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
c320: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
c330: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
c340: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62  ction */.    Tab
c350: 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
c360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c370: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61      /* Table <ta
c380: 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 45 78 70  ble>. */.    Exp
c390: 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20  r *pExpr;       
c3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3b0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
c3c0: 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20  n <column> */.  
c3d0: 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
c3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
c400: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 3c 63 6f 6c  x of column <col
c410: 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  umn> */.    int 
c420: 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
c430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c440: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69     /* Database i
c450: 64 78 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 0a  dx for pTab */..
c460: 20 20 20 20 61 73 73 65 72 74 28 20 70 20 29 3b      assert( p );
c470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c480: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
c490: 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
c4a0: 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
c4b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
c4c0: 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 20 20 20  EList!=0 );     
c4d0: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
c4e0: 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
c4f0: 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
c500: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
c510: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
c520: 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65 63 61 75  r!=0 ); /* Becau
c530: 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
c540: 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
c550: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
c560: 53 72 63 21 3d 30 20 29 3b 20 20 20 20 20 20 20  Src!=0 );       
c570: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
c580: 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
c590: 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
c5a0: 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53      pTab = p->pS
c5b0: 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20  rc->a[0].pTab;. 
c5c0: 20 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45     pExpr = p->pE
c5d0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
c5e0: 3b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 45 78  ;.    iCol = pEx
c5f0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
c600: 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20  .    /* Code an 
c610: 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 20  OP_VerifyCookie 
c620: 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b  and OP_TableLock
c630: 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f   for <table>. */
c640: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
c650: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
c660: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
c670: 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  a);.    sqlite3C
c680: 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
c690: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
c6a0: 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
c6b0: 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
c6c0: 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
c6d0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
c6e0: 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
c6f0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  on is only calle
c700: 64 20 66 72 6f 6d 20 74 77 6f 20 70 6c 61 63 65  d from two place
c710: 73 2e 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73  s. In both cases
c720: 20 74 68 65 20 76 64 62 65 0a 20 20 20 20 2a 2a   the vdbe.    **
c730: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
c740: 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20 53 6f 20  n allocated. So 
c750: 61 73 73 75 6d 65 20 73 71 6c 69 74 65 33 47 65  assume sqlite3Ge
c760: 74 56 64 62 65 28 29 20 69 73 20 61 6c 77 61 79  tVdbe() is alway
c770: 73 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73  s.    ** success
c780: 66 75 6c 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f  ful here..    */
c790: 0a 20 20 20 20 61 73 73 65 72 74 28 76 29 3b 0a  .    assert(v);.
c7a0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
c7b0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64 64  {.      int iAdd
c7c0: 72 3b 0a 0a 20 20 20 20 20 20 69 41 64 64 72 20  r;..      iAddr 
c7d0: 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63  = sqlite3CodeOnc
c7e0: 65 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20  e(pParse);..    
c7f0: 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
c800: 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c  le(pParse, iTab,
c810: 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
c820: 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20  penRead);.      
c830: 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
c840: 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20 20 20 73  _ROWID;..      s
c850: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
c860: 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20  re(v, iAddr);.  
c870: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
c880: 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
c890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8a0: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
c8b0: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  variable */..   
c8c0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74     /* The collat
c8d0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65  ion sequence use
c8e0: 64 20 62 79 20 74 68 65 20 63 6f 6d 70 61 72 69  d by the compari
c8f0: 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64 65 78  son. If an index
c900: 20 69 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20   is to.      ** 
c910: 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65  be used in place
c920: 20 6f 66 20 61 20 74 65 6d 70 2d 74 61 62 6c 65   of a temp-table
c930: 2c 20 69 74 20 6d 75 73 74 20 62 65 20 6f 72 64  , it must be ord
c940: 65 72 65 64 20 61 63 63 6f 72 64 69 6e 67 0a 20  ered according. 
c950: 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20       ** to this 
c960: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
c970: 63 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 43 6f  ce.  */.      Co
c980: 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d 20 73 71  llSeq *pReq = sq
c990: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
c9a0: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
c9b0: 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 45 78  , pX->pLeft, pEx
c9c0: 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  pr);..      /* C
c9d0: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 66  heck that the af
c9e0: 66 69 6e 69 74 79 20 74 68 61 74 20 77 69 6c 6c  finity that will
c9f0: 20 62 65 20 75 73 65 64 20 74 6f 20 70 65 72 66   be used to perf
ca00: 6f 72 6d 20 74 68 65 20 0a 20 20 20 20 20 20 2a  orm the .      *
ca10: 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  * comparison is 
ca20: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
ca30: 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  affinity of the 
ca40: 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20 20 20 20 20  column. If.     
ca50: 20 2a 2a 20 69 74 20 69 73 20 6e 6f 74 2c 20 69   ** it is not, i
ca60: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
ca70: 65 20 74 6f 20 75 73 65 20 61 6e 79 20 69 6e 64  e to use any ind
ca80: 65 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ex..      */.   
ca90: 20 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f     char aff = co
caa0: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
cab0: 28 70 58 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  (pX);.      int 
cac0: 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 28 70  affinity_ok = (p
cad0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
cae0: 61 66 66 69 6e 69 74 79 3d 3d 61 66 66 7c 7c 61  affinity==aff||a
caf0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
cb00: 4f 4e 45 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72  ONE);..      for
cb10: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
cb20: 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70  ex; pIdx && eTyp
cb30: 65 3d 3d 30 20 26 26 20 61 66 66 69 6e 69 74 79  e==0 && affinity
cb40: 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  _ok; pIdx=pIdx->
cb50: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
cb60: 69 66 28 20 28 70 49 64 78 2d 3e 61 69 43 6f 6c  if( (pIdx->aiCol
cb70: 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20  umn[0]==iCol).  
cb80: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
cb90: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
cba0: 20 45 4e 43 28 64 62 29 2c 20 70 49 64 78 2d 3e   ENC(db), pIdx->
cbb0: 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 30 29 3d 3d 70  azColl[0], 0)==p
cbc0: 52 65 71 0a 20 20 20 20 20 20 20 20 20 26 26 20  Req.         && 
cbd0: 28 21 6d 75 73 74 42 65 55 6e 69 71 75 65 20 7c  (!mustBeUnique |
cbe0: 7c 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  | (pIdx->nColumn
cbf0: 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45  ==1 && pIdx->onE
cc00: 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 29 29 0a  rror!=OE_None)).
cc10: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
cc20: 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a       int iAddr;.
cc30: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
cc40: 70 4b 65 79 3b 0a 20 20 0a 20 20 20 20 20 20 20  pKey;.  .       
cc50: 20 20 20 70 4b 65 79 20 3d 20 28 63 68 61 72 20     pKey = (char 
cc60: 2a 29 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  *)sqlite3IndexKe
cc70: 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yinfo(pParse, pI
cc80: 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  dx);.          i
cc90: 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f  Addr = sqlite3Co
cca0: 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a  deOnce(pParse);.
ccb0: 20 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c    .          sql
ccc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
ccd0: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
cce0: 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  Tab, pIdx->tnum,
ccf0: 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20   iDb,.          
cd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd10: 20 20 20 20 20 70 4b 65 79 2c 50 34 5f 4b 45 59       pKey,P4_KEY
cd20: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
cd30: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d           VdbeCom
cd40: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
cd50: 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Idx->zName));.  
cd60: 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20          eType = 
cd70: 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 3b 0a  IN_INDEX_INDEX;.
cd80: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
cd90: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
cda0: 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20  , iAddr);.      
cdb0: 20 20 20 20 69 66 28 20 70 72 4e 6f 74 46 6f 75      if( prNotFou
cdc0: 6e 64 20 26 26 20 21 70 54 61 62 2d 3e 61 43 6f  nd && !pTab->aCo
cdd0: 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20  l[iCol].notNull 
cde0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ){.            *
cdf0: 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 2b 2b 70  prNotFound = ++p
ce00: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
ce10: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ce20: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
ce30: 5f 4e 75 6c 6c 2c 20 30 2c 20 2a 70 72 4e 6f 74  _Null, 0, *prNot
ce40: 46 6f 75 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  Found);.        
ce50: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
ce60: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
ce70: 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20  .  if( eType==0 
ce80: 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20  ){.    /* Could 
ce90: 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 20 65 78 69  not found an exi
cea0: 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69  sting table or i
ceb0: 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73 20 74  ndex to use as t
cec0: 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20  he RHS b-tree.. 
ced0: 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61     ** We will ha
cee0: 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ve to generate a
cef0: 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
cf00: 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e  e to do the job.
cf10: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 75 62  .    */.    doub
cf20: 6c 65 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  le savedNQueryLo
cf30: 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75  op = pParse->nQu
cf40: 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74  eryLoop;.    int
cf50: 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20   rMayHaveNull = 
cf60: 30 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49  0;.    eType = I
cf70: 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20  N_INDEX_EPH;.   
cf80: 20 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20   if( prNotFound 
cf90: 29 7b 0a 20 20 20 20 20 20 2a 70 72 4e 6f 74 46  ){.      *prNotF
cfa0: 6f 75 6e 64 20 3d 20 72 4d 61 79 48 61 76 65 4e  ound = rMayHaveN
cfb0: 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ull = ++pParse->
cfc0: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
cfd0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
cfe0: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 2a 70 72   OP_Null, 0, *pr
cff0: 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20 20 20 20 7d  NotFound);.    }
d000: 65 6c 73 65 7b 0a 20 20 20 20 20 20 74 65 73 74  else{.      test
d010: 63 61 73 65 28 20 70 50 61 72 73 65 2d 3e 6e 51  case( pParse->nQ
d020: 75 65 72 79 4c 6f 6f 70 3e 28 64 6f 75 62 6c 65  ueryLoop>(double
d030: 29 31 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  )1 );.      pPar
d040: 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
d050: 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20 20 20   (double)1;.    
d060: 20 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d    if( pX->pLeft-
d070: 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45  >iColumn<0 && !E
d080: 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
d090: 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pX, EP_xIsSele
d0a0: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ct) ){.        e
d0b0: 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
d0c0: 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20  ROWID;.      }. 
d0d0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
d0e0: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
d0f0: 61 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61  arse, pX, rMayHa
d100: 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49  veNull, eType==I
d110: 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a  N_INDEX_ROWID);.
d120: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65      pParse->nQue
d130: 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51  ryLoop = savedNQ
d140: 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73  ueryLoop;.  }els
d150: 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62 6c  e{.    pX->iTabl
d160: 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 20 20  e = iTab;.  }.  
d170: 72 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a  return eType;.}.
d180: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
d190: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
d1a0: 73 63 61 6c 61 72 20 73 75 62 71 75 65 72 69 65  scalar subquerie
d1b0: 73 20 75 73 65 64 20 61 73 20 61 20 73 75 62 71  s used as a subq
d1c0: 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 2c  uery expression,
d1d0: 20 45 58 49 53 54 53 2c 0a 2a 2a 20 6f 72 20 49   EXISTS,.** or I
d1e0: 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 45 78  N operators.  Ex
d1f0: 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  amples:.**.**   
d200: 20 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d    (SELECT a FROM
d210: 20 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20   b)          -- 
d220: 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20  subquery.**     
d230: 45 58 49 53 54 53 20 28 53 45 4c 45 43 54 20 61  EXISTS (SELECT a
d240: 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58   FROM b)   -- EX
d250: 49 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a  ISTS subquery.**
d260: 20 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31       x IN (4,5,1
d270: 31 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1)              
d280: 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  -- IN operator w
d290: 69 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68  ith list on righ
d2a0: 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20  t-hand side.**  
d2b0: 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20     x IN (SELECT 
d2c0: 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d  a FROM b)     --
d2d0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74   IN operator wit
d2e0: 68 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68  h subquery on th
d2f0: 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68  e right.**.** Th
d300: 65 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65  e pExpr paramete
d310: 72 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  r describes the 
d320: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
d330: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4e 0a  contains the IN.
d340: 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73  ** operator or s
d350: 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49  ubquery..**.** I
d360: 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 52 6f  f parameter isRo
d370: 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  wid is non-zero,
d380: 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e   then expression
d390: 20 70 45 78 70 72 20 69 73 20 67 75 61 72 61 6e   pExpr is guaran
d3a0: 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 6f 66  teed.** to be of
d3b0: 20 74 68 65 20 66 6f 72 6d 20 22 3c 72 6f 77 69   the form "<rowi
d3c0: 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22  d> IN (?, ?, ?)"
d3d0: 2c 20 77 68 65 72 65 20 3c 72 6f 77 69 64 3e 20  , where <rowid> 
d3e0: 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 2a  is a reference.*
d3f0: 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74 65 67 65  * to some intege
d400: 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f 66 20  r key column of 
d410: 61 20 74 61 62 6c 65 20 42 2d 54 72 65 65 2e 20  a table B-Tree. 
d420: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 75 73  In this case, us
d430: 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 42  e an.** intkey B
d440: 2d 54 72 65 65 20 74 6f 20 73 74 6f 72 65 20 74  -Tree to store t
d450: 68 65 20 73 65 74 20 6f 66 20 49 4e 28 2e 2e 2e  he set of IN(...
d460: 29 20 76 61 6c 75 65 73 20 69 6e 73 74 65 61 64  ) values instead
d470: 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a   of the usual.**
d480: 20 28 73 6c 6f 77 65 72 29 20 76 61 72 69 61 62   (slower) variab
d490: 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 73 20 42  le length keys B
d4a0: 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  -Tree..**.** If 
d4b0: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20  rMayHaveNull is 
d4c0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61 74 20 6d  non-zero, that m
d4d0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6f 70  eans that the op
d4e0: 65 72 61 74 69 6f 6e 20 69 73 20 61 6e 20 49 4e  eration is an IN
d4f0: 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45 4c 45 43  .** (not a SELEC
d500: 54 20 6f 72 20 45 58 49 53 54 53 29 20 61 6e 64  T or EXISTS) and
d510: 20 74 68 61 74 20 74 68 65 20 52 48 53 20 6d 69   that the RHS mi
d520: 67 68 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c  ght contains NUL
d530: 4c 73 2e 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f  Ls..** Furthermo
d540: 72 65 2c 20 74 68 65 20 49 4e 20 69 73 20 69 6e  re, the IN is in
d550: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
d560: 61 6e 64 20 74 68 61 74 20 77 65 20 72 65 61 6c  and that we real
d570: 6c 79 20 77 61 6e 74 0a 2a 2a 20 74 6f 20 69 74  ly want.** to it
d580: 65 72 61 74 65 20 6f 76 65 72 20 74 68 65 20 52  erate over the R
d590: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
d5a0: 72 61 74 6f 72 20 69 6e 20 6f 72 64 65 72 20 74  rator in order t
d5b0: 6f 20 71 75 69 63 6b 6c 79 20 6c 6f 63 61 74 65  o quickly locate
d5c0: 0a 2a 2a 20 61 6c 6c 20 63 6f 72 72 65 73 70 6f  .** all correspo
d5d0: 6e 64 69 6e 67 20 4c 48 53 20 65 6c 65 6d 65 6e  nding LHS elemen
d5e0: 74 73 2e 20 20 41 6c 6c 20 74 68 69 73 20 72 6f  ts.  All this ro
d5f0: 75 74 69 6e 65 20 64 6f 65 73 20 69 73 20 69 6e  utine does is in
d600: 69 74 69 61 6c 69 7a 65 0a 2a 2a 20 74 68 65 20  itialize.** the 
d610: 72 65 67 69 73 74 65 72 20 67 69 76 65 6e 20 62  register given b
d620: 79 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 74  y rMayHaveNull t
d630: 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67  o NULL.  Calling
d640: 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 74   routines will t
d650: 61 6b 65 0a 2a 2a 20 63 61 72 65 20 6f 66 20 63  ake.** care of c
d660: 68 61 6e 67 69 6e 67 20 74 68 69 73 20 72 65 67  hanging this reg
d670: 69 73 74 65 72 20 76 61 6c 75 65 20 74 6f 20 6e  ister value to n
d680: 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20 52  on-NULL if the R
d690: 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e  HS is NULL-free.
d6a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61  .**.** If rMayHa
d6b0: 76 65 4e 75 6c 6c 20 69 73 20 7a 65 72 6f 2c 20  veNull is zero, 
d6c0: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
d6d0: 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
d6e0: 62 65 69 6e 67 20 75 73 65 64 0a 2a 2a 20 66 6f  being used.** fo
d6f0: 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  r membership tes
d700: 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 54 68 65 72  ting only.  Ther
d710: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
d720: 69 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 0a 2a  initialize any.*
d730: 2a 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 69  * registers to i
d740: 6e 64 69 63 61 74 65 20 74 68 65 20 70 72 65 73  ndicate the pres
d750: 65 6e 73 65 20 6f 72 20 61 62 73 65 6e 63 65 20  ense or absence 
d760: 6f 66 20 4e 55 4c 4c 73 20 6f 6e 20 74 68 65 20  of NULLs on the 
d770: 52 48 53 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  RHS..**.** For a
d780: 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54   SELECT or EXIST
d790: 53 20 6f 70 65 72 61 74 6f 72 2c 20 72 65 74 75  S operator, retu
d7a0: 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
d7b0: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a  that holds the.*
d7c0: 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 49  * result.  For I
d7d0: 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69  N operators or i
d7e0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
d7f0: 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  s, the return va
d800: 6c 75 65 20 69 73 20 30 2e 0a 2a 2f 0a 23 69 66  lue is 0..*/.#if
d810: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d820: 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71  _SUBQUERY.int sq
d830: 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
d840: 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
d850: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
d860: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
d870: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
d880: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
d890: 20 54 68 65 20 49 4e 2c 20 53 45 4c 45 43 54 2c   The IN, SELECT,
d8a0: 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61   or EXISTS opera
d8b0: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 4d 61  tor */.  int rMa
d8c0: 79 48 61 76 65 4e 75 6c 6c 2c 20 20 20 20 20 20  yHaveNull,      
d8d0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61   /* Register tha
d8e0: 74 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65  t records whethe
d8f0: 72 20 4e 55 4c 4c 73 20 65 78 69 73 74 20 69 6e  r NULLs exist in
d900: 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 73   RHS */.  int is
d910: 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20  Rowid           
d920: 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 4c 48    /* If true, LH
d930: 53 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  S of IN operator
d940: 20 69 73 20 61 20 72 6f 77 69 64 20 2a 2f 0a 29   is a rowid */.)
d950: 7b 0a 20 20 69 6e 74 20 74 65 73 74 41 64 64 72  {.  int testAddr
d960: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
d970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
d980: 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64  ne-time test add
d990: 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52  ress */.  int rR
d9a0: 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
d9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9c0: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74    /* Register st
d9d0: 6f 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20  oring resulting 
d9e0: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
d9f0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
da00: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56  arse);.  if( NEV
da10: 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
da20: 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  n 0;.  sqlite3Ex
da30: 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
da40: 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  se);..  /* This 
da50: 63 6f 64 65 20 6d 75 73 74 20 62 65 20 72 75 6e  code must be run
da60: 20 69 6e 20 69 74 73 20 65 6e 74 69 72 65 74 79   in its entirety
da70: 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 20 69   every time it i
da80: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20  s encountered.  
da90: 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ** if any of the
daa0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
dab0: 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ue:.  **.  **   
dac0: 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
dad0: 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f 72  nd side is a cor
dae0: 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79  related subquery
daf0: 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
db00: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
db10: 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  is an expression
db20: 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
db30: 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20   variables.  ** 
db40: 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73     *  We are ins
db50: 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20 20  ide a trigger.  
db60: 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f  **.  ** If all o
db70: 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20  f the above are 
db80: 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63  false, then we c
db90: 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65  an run this code
dba0: 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20   just once.  ** 
dbb0: 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  save the results
dbc0: 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65 20  , and reuse the 
dbd0: 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73  same result on s
dbe0: 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61  ubsequent invoca
dbf0: 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
dc00: 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f  ( !ExprHasAnyPro
dc10: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
dc20: 56 61 72 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  VarSelect) ){.  
dc30: 20 20 74 65 73 74 41 64 64 72 20 3d 20 73 71 6c    testAddr = sql
dc40: 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61  ite3CodeOnce(pPa
dc50: 72 73 65 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  rse);.  }..#ifnd
dc60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
dc70: 58 50 4c 41 49 4e 0a 20 20 69 66 28 20 70 50 61  XPLAIN.  if( pPa
dc80: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
dc90: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  ){.    char *zMs
dca0: 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
dcb0: 74 66 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  tf(.        pPar
dcc0: 73 65 2d 3e 64 62 2c 20 22 45 58 45 43 55 54 45  se->db, "EXECUTE
dcd0: 20 25 73 25 73 20 53 55 42 51 55 45 52 59 20 25   %s%s SUBQUERY %
dce0: 64 22 2c 20 74 65 73 74 41 64 64 72 3e 3d 30 3f  d", testAddr>=0?
dcf0: 22 22 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22  "":"CORRELATED "
dd00: 2c 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ,.        pExpr-
dd10: 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49 53 54  >op==TK_IN?"LIST
dd20: 22 3a 22 53 43 41 4c 41 52 22 2c 20 70 50 61 72  ":"SCALAR", pPar
dd30: 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
dd40: 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  d.    );.    sql
dd50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
dd60: 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50  , OP_Explain, pP
dd70: 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
dd80: 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f   0, 0, zMsg, P4_
dd90: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 23 65  DYNAMIC);.  }.#e
dda0: 6e 64 69 66 0a 0a 20 20 73 77 69 74 63 68 28 20  ndif..  switch( 
ddb0: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
ddc0: 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
ddd0: 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69       char affini
dde0: 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ty;             
ddf0: 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f 66 20   /* Affinity of 
de00: 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  the LHS of the I
de10: 4e 20 2a 2f 0a 20 20 20 20 20 20 4b 65 79 49 6e  N */.      KeyIn
de20: 66 6f 20 6b 65 79 49 6e 66 6f 3b 20 20 20 20 20  fo keyInfo;     
de30: 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66         /* Keyinf
de40: 6f 20 66 6f 72 20 74 68 65 20 67 65 6e 65 72 61  o for the genera
de50: 74 65 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ted table */.   
de60: 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20     int addr;    
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
de80: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f  * Address of OP_
de90: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
dea0: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  struction */.   
deb0: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
dec0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 20 2f   pExpr->pLeft; /
ded0: 2a 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  * the LHS of the
dee0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
def0: 0a 20 20 20 20 20 20 69 66 28 20 72 4d 61 79 48  .      if( rMayH
df00: 61 76 65 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  aveNull ){.     
df10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
df20: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
df30: 20 30 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c   0, rMayHaveNull
df40: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
df50: 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c    affinity = sql
df60: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
df70: 28 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20  (pLeft);..      
df80: 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69 73 20  /* Whether this 
df90: 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45  is an 'x IN(SELE
dfa0: 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78  CT...)' or an 'x
dfb0: 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27   IN(<exprlist>)'
dfc0: 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73  .      ** expres
dfd0: 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c  sion it is handl
dfe0: 65 64 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e  ed the same way.
dff0: 20 20 41 6e 20 65 70 68 65 6d 65 72 61 6c 20 74    An ephemeral t
e000: 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a  able is .      *
e010: 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 73 69  * filled with si
e020: 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65 78  ngle-field index
e030: 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74 69   keys representi
e040: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  ng the results. 
e050: 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65       ** from the
e060: 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c   SELECT or the <
e070: 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20  exprlist>..     
e080: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
e090: 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73 69  the 'x' expressi
e0a0: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76  on is a column v
e0b0: 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c  alue, or the SEL
e0c0: 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  ECT....      ** 
e0d0: 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e  statement return
e0e0: 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  s a column value
e0f0: 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e  , then the affin
e100: 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20  ity of that.    
e110: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75    ** column is u
e120: 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65  sed to build the
e130: 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20   index keys. If 
e140: 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68 65  both 'x' and the
e150: 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  .      ** SELECT
e160: 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ... statement ar
e170: 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  e columns, then 
e180: 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
e190: 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a   is used.      *
e1a0: 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75  * if either colu
e1b0: 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f  mn has NUMERIC o
e1c0: 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69  r INTEGER affini
e1d0: 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20  ty. If neither. 
e1e0: 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20       ** 'x' nor 
e1f0: 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74  the SELECT... st
e200: 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75  atement are colu
e210: 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69  mns, then numeri
e220: 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20  c affinity.     
e230: 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20   ** is used..   
e240: 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70     */.      pExp
e250: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72  r->iTable = pPar
e260: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
e270: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
e280: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e290: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
e2a0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 21  pExpr->iTable, !
e2b0: 69 73 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  isRowid);.      
e2c0: 69 66 28 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  if( rMayHaveNull
e2d0: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
e2e0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52  eChangeP5(v, BTR
e2f0: 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20  EE_UNORDERED);. 
e300: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6b 65 79       memset(&key
e310: 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
e320: 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20  keyInfo));.     
e330: 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20   keyInfo.nField 
e340: 3d 20 31 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  = 1;..      if( 
e350: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
e360: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
e370: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
e380: 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65  /* Case 1:     e
e390: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
e3a0: 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ..).        **. 
e3b0: 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61         ** Genera
e3c0: 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65  te code to write
e3d0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
e3e0: 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20  the select into 
e3f0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
e400: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61        ** table a
e410: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65  llocated and ope
e420: 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20  ned above..     
e430: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65     */.        Se
e440: 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20  lectDest dest;. 
e450: 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
e460: 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20  *pEList;..      
e470: 20 20 61 73 73 65 72 74 28 20 21 69 73 52 6f 77    assert( !isRow
e480: 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  id );.        sq
e490: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
e4a0: 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53  nit(&dest, SRT_S
e4b0: 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  et, pExpr->iTabl
e4c0: 65 29 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74  e);.        dest
e4d0: 2e 61 66 66 53 64 73 74 20 3d 20 28 75 38 29 61  .affSdst = (u8)a
e4e0: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20  ffinity;.       
e4f0: 20 61 73 73 65 72 74 28 20 28 70 45 78 70 72 2d   assert( (pExpr-
e500: 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30 46 46  >iTable&0x0000FF
e510: 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  FF)==pExpr->iTab
e520: 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 45  le );.        pE
e530: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  xpr->x.pSelect->
e540: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
e550: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
e560: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
e570: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  xpr->x.pSelect, 
e580: 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  &dest) ){.      
e590: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
e5a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e5b0: 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
e5c0: 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
e5d0: 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 41  t;.        if( A
e5e0: 4c 57 41 59 53 28 70 45 4c 69 73 74 21 3d 30 20  LWAYS(pEList!=0 
e5f0: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
e600: 3e 30 29 20 29 7b 20 0a 20 20 20 20 20 20 20 20  >0) ){ .        
e610: 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b    keyInfo.aColl[
e620: 30 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  0] = sqlite3Bina
e630: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
e640: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
e650: 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20 20  pLeft,.         
e660: 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30       pEList->a[0
e670: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
e680: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
e690: 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72  if( ALWAYS(pExpr
e6a0: 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b  ->x.pList!=0) ){
e6b0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
e6c0: 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   2:     expr IN 
e6d0: 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20  (exprlist).     
e6e0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
e6f0: 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   For each expres
e700: 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69  sion, build an i
e710: 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68  ndex key from th
e720: 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64  e evaluation and
e730: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
e740: 65 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70  e it in the temp
e750: 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20  orary table. If 
e760: 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75  <expr> is a colu
e770: 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20  mn, then use.   
e780: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c       ** that col
e790: 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68  umns affinity wh
e7a0: 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65  en building inde
e7b0: 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72  x keys. If <expr
e7c0: 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20  > is not.       
e7d0: 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73   ** a column, us
e7e0: 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  e numeric affini
e7f0: 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ty..        */. 
e800: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
e810: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
e820: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
e830: 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  .pList;.        
e840: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
e850: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
e860: 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c       int r1, r2,
e870: 20 72 33 3b 0a 0a 20 20 20 20 20 20 20 20 69 66   r3;..        if
e880: 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20  ( !affinity ){. 
e890: 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74           affinit
e8a0: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  y = SQLITE_AFF_N
e8b0: 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
e8c0: 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61         keyInfo.a
e8d0: 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Coll[0] = sqlite
e8e0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
e8f0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
e900: 74 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  t);..        /* 
e910: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
e920: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  h expression in 
e930: 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20  <exprlist>. */. 
e940: 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
e950: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
e960: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  arse);.        r
e970: 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
e980: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
e990: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e9a0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
e9b0: 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20  ull, 0, r2);.   
e9c0: 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74       for(i=pList
e9d0: 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
e9e0: 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  List->a; i>0; i-
e9f0: 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
ea00: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32         Expr *pE2
ea10: 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
ea20: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
ea30: 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20  ValToIns;..     
ea40: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65       /* If the e
ea50: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
ea60: 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77   constant then w
ea70: 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20  e will need to. 
ea80: 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73 61           ** disa
ea90: 62 6c 65 20 74 68 65 20 74 65 73 74 20 74 68 61  ble the test tha
eaa0: 74 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  t was generated 
eab0: 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65 73  above that makes
eac0: 20 73 75 72 65 0a 20 20 20 20 20 20 20 20 20 20   sure.          
ead0: 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c  ** this code onl
eae0: 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65 2e  y executes once.
eaf0: 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61 20    Because for a 
eb00: 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20  non-constant.   
eb10: 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73         ** expres
eb20: 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  sion we need to 
eb30: 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20  rerun this code 
eb40: 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20  each time..     
eb50: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
eb60: 20 20 69 66 28 20 74 65 73 74 41 64 64 72 3e 3d    if( testAddr>=
eb70: 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70  0 && !sqlite3Exp
eb80: 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29  rIsConstant(pE2)
eb90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
eba0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
ebb0: 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73 74 41  eToNoop(v, testA
ebc0: 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ddr);.          
ebd0: 20 20 74 65 73 74 41 64 64 72 20 3d 20 2d 31 3b    testAddr = -1;
ebe0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
ebf0: 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75          /* Evalu
ec00: 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ate the expressi
ec10: 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  on and insert it
ec20: 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74   into the temp t
ec30: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
ec40: 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 26 26    if( isRowid &&
ec50: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
ec60: 74 65 67 65 72 28 70 45 32 2c 20 26 69 56 61 6c  teger(pE2, &iVal
ec70: 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20 20  ToIns) ){.      
ec80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ec90: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
eca0: 73 65 72 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e  sertInt, pExpr->
ecb0: 69 54 61 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c  iTable, r2, iVal
ecc0: 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 20 20  ToIns);.        
ecd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ece0: 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65       r3 = sqlite
ecf0: 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
ed00: 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29  pParse, pE2, r1)
ed10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
ed20: 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20  ( isRowid ){.   
ed30: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
ed40: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ed50: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33  OP_MustBeInt, r3
ed60: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ed70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72    sqlite3VdbeCur
ed90: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a  rentAddr(v)+2);.
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
edb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
edc0: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45  v, OP_Insert, pE
edd0: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c  xpr->iTable, r2,
ede0: 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r3);.          
edf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ee00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ee10: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
ee20: 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31  akeRecord, r3, 1
ee30: 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c  , r2, &affinity,
ee40: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
ee50: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
ee60: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
ee70: 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29  e(pParse, r3, 1)
ee80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
ee90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
eea0: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
eeb0: 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
eec0: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20  , r2);.         
eed0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
eee0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
eef0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
ef00: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
ef10: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
ef20: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
ef30: 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
ef40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
ef50: 66 28 20 21 69 73 52 6f 77 69 64 20 29 7b 0a 20  f( !isRowid ){. 
ef60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ef70: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
ef80: 64 72 2c 20 28 76 6f 69 64 20 2a 29 26 6b 65 79  dr, (void *)&key
ef90: 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
efa0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
efb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
efc0: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
efd0: 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
efe0: 45 4c 45 43 54 3a 0a 20 20 20 20 64 65 66 61 75  ELECT:.    defau
eff0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49  lt: {.      /* I
f000: 66 20 74 68 69 73 20 68 61 73 20 74 6f 20 62 65  f this has to be
f010: 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54   a scalar SELECT
f020: 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  .  Generate code
f030: 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20   to put the.    
f040: 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68    ** value of th
f050: 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d  is select in a m
f060: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72  emory cell and r
f070: 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
f080: 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
f090: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20   memory cell in 
f0a0: 69 43 6f 6c 75 6d 6e 2e 20 20 49 66 20 74 68 69  iColumn.  If thi
f0b0: 73 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20  s is an EXISTS, 
f0c0: 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 61  write.      ** a
f0d0: 6e 20 69 6e 74 65 67 65 72 20 30 20 28 6e 6f 74  n integer 0 (not
f0e0: 20 65 78 69 73 74 73 29 20 6f 72 20 31 20 28 65   exists) or 1 (e
f0f0: 78 69 73 74 73 29 20 69 6e 74 6f 20 61 20 6d 65  xists) into a me
f100: 6d 6f 72 79 20 63 65 6c 6c 0a 20 20 20 20 20 20  mory cell.      
f110: 2a 2a 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68  ** and record th
f120: 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  at memory cell i
f130: 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  n iColumn..     
f140: 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
f150: 20 2a 70 53 65 6c 3b 20 20 20 20 20 20 20 20 20   *pSel;         
f160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f170: 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
f180: 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f  ent to encode */
f190: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
f1a0: 74 20 64 65 73 74 3b 20 20 20 20 20 20 20 20 20  t dest;         
f1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f1c0: 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68  How to deal with
f1d0: 20 53 45 4c 45 43 74 20 72 65 73 75 6c 74 20 2a   SELECt result *
f1e0: 2f 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  /..      testcas
f1f0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
f200: 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20  _EXISTS );.     
f210: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
f220: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
f230: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
f240: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
f250: 58 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e  XISTS || pExpr->
f260: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
f270: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
f280: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
f290: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
f2a0: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 70 53  ect) );.      pS
f2b0: 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53  el = pExpr->x.pS
f2c0: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 73 71 6c  elect;.      sql
f2d0: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
f2e0: 69 74 28 26 64 65 73 74 2c 20 30 2c 20 2b 2b 70  it(&dest, 0, ++p
f2f0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  Parse->nMem);.  
f300: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
f310: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
f320: 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65          dest.eDe
f330: 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20  st = SRT_Mem;.  
f340: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f350: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
f360: 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50  ll, 0, dest.iSDP
f370: 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64  arm);.        Vd
f380: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49  beComment((v, "I
f390: 6e 69 74 20 73 75 62 71 75 65 72 79 20 72 65 73  nit subquery res
f3a0: 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65  ult"));.      }e
f3b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73  lse{.        des
f3c0: 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78  t.eDest = SRT_Ex
f3d0: 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71  ists;.        sq
f3e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f3f0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
f400: 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b  , dest.iSDParm);
f410: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
f420: 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 45  ment((v, "Init E
f430: 58 49 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b  XISTS result"));
f440: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
f450: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
f460: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65  (pParse->db, pSe
f470: 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  l->pLimit);.    
f480: 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d    pSel->pLimit =
f490: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
f4a0: 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52  arse, TK_INTEGER
f4b0: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
f4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4d0: 20 20 20 20 20 20 20 20 20 20 26 73 71 6c 69 74            &sqlit
f4e0: 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 29 3b  e3IntTokens[1]);
f4f0: 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c 69  .      pSel->iLi
f500: 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  mit = 0;.      i
f510: 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
f520: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26  (pParse, pSel, &
f530: 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  dest) ){.       
f540: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
f550: 20 7d 0a 20 20 20 20 20 20 72 52 65 67 20 3d 20   }.      rReg = 
f560: 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20  dest.iSDParm;.  
f570: 20 20 20 20 45 78 70 72 53 65 74 49 72 72 65 64      ExprSetIrred
f580: 75 63 69 62 6c 65 28 70 45 78 70 72 29 3b 0a 20  ucible(pExpr);. 
f590: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f5a0: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 74 65 73  }.  }..  if( tes
f5b0: 74 41 64 64 72 3e 3d 30 20 29 7b 0a 20 20 20 20  tAddr>=0 ){.    
f5c0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
f5d0: 65 72 65 28 76 2c 20 74 65 73 74 41 64 64 72 29  ere(v, testAddr)
f5e0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
f5f0: 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
f600: 73 65 2c 20 31 29 3b 0a 0a 20 20 72 65 74 75 72  se, 1);..  retur
f610: 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66  n rReg;.}.#endif
f620: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
f630: 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66  SUBQUERY */..#if
f640: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f650: 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
f660: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
f670: 72 20 61 6e 20 49 4e 20 65 78 70 72 65 73 73 69  r an IN expressi
f680: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78  on..**.**      x
f690: 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
f6a0: 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 76  .**      x IN (v
f6b0: 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e  alue, value, ...
f6c0: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ).**.** The left
f6d0: 2d 68 61 6e 64 20 73 69 64 65 20 28 4c 48 53 29  -hand side (LHS)
f6e0: 20 69 73 20 61 20 73 63 61 6c 61 72 20 65 78 70   is a scalar exp
f6f0: 72 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 72 69  ression.  The ri
f700: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52  ght-hand side (R
f710: 48 53 29 0a 2a 2a 20 69 73 20 61 6e 20 61 72 72  HS).** is an arr
f720: 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f  ay of zero or mo
f730: 72 65 20 76 61 6c 75 65 73 2e 20 20 54 68 65 20  re values.  The 
f740: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
f750: 75 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  ue if the LHS is
f760: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  .** contained wi
f770: 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 54  thin the RHS.  T
f780: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
f790: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e  expression is un
f7a0: 6b 6e 6f 77 6e 20 28 4e 55 4c 4c 29 0a 2a 2a 20  known (NULL).** 
f7b0: 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 4e 55  if the LHS is NU
f7c0: 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 4c 48 53  LL or if the LHS
f7d0: 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   is not containe
f7e0: 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53  d within the RHS
f7f0: 20 61 6e 64 20 74 68 65 0a 2a 2a 20 52 48 53 20   and the.** RHS 
f800: 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
f810: 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73  more NULL values
f820: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
f830: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
f840: 6f 64 65 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f  ode will jump to
f850: 20 64 65 73 74 49 66 46 61 6c 73 65 20 69 66 20   destIfFalse if 
f860: 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a  the LHS is not .
f870: 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  ** contained wit
f880: 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66  hin the RHS.  If
f890: 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65   due to NULLs we
f8a0: 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
f8b0: 65 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20  e if the LHS.** 
f8c0: 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
f8d0: 74 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75 6d  the RHS then jum
f8e0: 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e  p to destIfNull.
f8f0: 20 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20    If the LHS is 
f900: 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74  contained.** wit
f910: 68 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e  hin the RHS then
f920: 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a   fall through..*
f930: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
f940: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
f950: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
f960: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
f970: 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
f980: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
f990: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
f9a0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
f9b0: 65 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 20  e IN expression 
f9c0: 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66 46  */.  int destIfF
f9d0: 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75  alse,      /* Ju
f9e0: 6d 70 20 68 65 72 65 20 69 66 20 4c 48 53 20 69  mp here if LHS i
f9f0: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  s not contained 
fa00: 69 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20  in the RHS */.  
fa10: 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 20  int destIfNull  
fa20: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
fa30: 72 65 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  re if the result
fa40: 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75  s are unknown du
fa50: 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b  e to NULLs */.){
fa60: 0a 20 20 69 6e 74 20 72 52 68 73 48 61 73 4e 75  .  int rRhsHasNu
fa70: 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69  ll = 0;  /* Regi
fa80: 73 74 65 72 20 74 68 61 74 20 69 73 20 74 72 75  ster that is tru
fa90: 65 20 69 66 20 52 48 53 20 63 6f 6e 74 61 69 6e  e if RHS contain
faa0: 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f  s NULL values */
fab0: 0a 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79  .  char affinity
fac0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70  ;        /* Comp
fad0: 61 72 69 73 6f 6e 20 61 66 66 69 6e 69 74 79 20  arison affinity 
fae0: 74 6f 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  to use */.  int 
faf0: 65 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 20  eType;          
fb00: 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65    /* Type of the
fb10: 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72 31   RHS */.  int r1
fb20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fb30: 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65  /* Temporary use
fb40: 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 56   register */.  V
fb50: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
fb60: 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e       /* Statemen
fb70: 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
fb80: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f  tion */..  /* Co
fb90: 6d 70 75 74 65 20 74 68 65 20 52 48 53 2e 20 20  mpute the RHS.  
fba0: 20 41 66 74 65 72 20 74 68 69 73 20 73 74 65 70   After this step
fbb0: 2c 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  , the table with
fbc0: 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 70 45 78   cursor.  ** pEx
fbd0: 70 72 2d 3e 69 54 61 62 6c 65 20 77 69 6c 6c 20  pr->iTable will 
fbe0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c  contains the val
fbf0: 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70  ues that make up
fc00: 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20   the RHS..  */. 
fc10: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
fc20: 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  be;.  assert( v!
fc30: 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f  =0 );       /* O
fc40: 4f 4d 20 64 65 74 65 63 74 65 64 20 70 72 69 6f  OM detected prio
fc50: 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
fc60: 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43  e */.  VdbeNoopC
fc70: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69  omment((v, "begi
fc80: 6e 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 20 20  n IN expr"));.  
fc90: 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46  eType = sqlite3F
fca0: 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73  indInIndex(pPars
fcb0: 65 2c 20 70 45 78 70 72 2c 20 26 72 52 68 73 48  e, pExpr, &rRhsH
fcc0: 61 73 4e 75 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 46  asNull);..  /* F
fcd0: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 61 66  igure out the af
fce0: 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20 74 6f  finity to use to
fcf0: 20 63 72 65 61 74 65 20 61 20 6b 65 79 20 66 72   create a key fr
fd00: 6f 6d 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  om the results. 
fd10: 20 2a 2a 20 6f 66 20 74 68 65 20 65 78 70 72 65   ** of the expre
fd20: 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53  ssion. affinityS
fd30: 74 72 20 73 74 6f 72 65 73 20 61 20 73 74 61 74  tr stores a stat
fd40: 69 63 20 73 74 72 69 6e 67 20 73 75 69 74 61 62  ic string suitab
fd50: 6c 65 20 66 6f 72 0a 20 20 2a 2a 20 50 34 20 6f  le for.  ** P4 o
fd60: 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e  f OP_MakeRecord.
fd70: 0a 20 20 2a 2f 0a 20 20 61 66 66 69 6e 69 74 79  .  */.  affinity
fd80: 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66   = comparisonAff
fd90: 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 0a 20  inity(pExpr);.. 
fda0: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c 48 53   /* Code the LHS
fdb0: 2c 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f  , the <expr> fro
fdc0: 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e  m "<expr> IN (..
fdd0: 2e 29 22 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  .)"..  */.  sqli
fde0: 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
fdf0: 28 70 50 61 72 73 65 29 3b 0a 20 20 72 31 20 3d  (pParse);.  r1 =
fe00: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
fe10: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
fe20: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
fe30: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
fe40: 66 74 2c 20 72 31 29 3b 0a 0a 20 20 2f 2a 20 49  ft, r1);..  /* I
fe50: 66 20 74 68 65 20 4c 48 53 20 69 73 20 4e 55 4c  f the LHS is NUL
fe60: 4c 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  L, then the resu
fe70: 6c 74 20 69 73 20 65 69 74 68 65 72 20 66 61 6c  lt is either fal
fe80: 73 65 20 6f 72 20 4e 55 4c 4c 20 64 65 70 65 6e  se or NULL depen
fe90: 64 69 6e 67 0a 20 20 2a 2a 20 6f 6e 20 77 68 65  ding.  ** on whe
fea0: 74 68 65 72 20 74 68 65 20 52 48 53 20 69 73 20  ther the RHS is 
feb0: 65 6d 70 74 79 20 6f 72 20 6e 6f 74 2c 20 72 65  empty or not, re
fec0: 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2f  spectively..  */
fed0: 0a 20 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c  .  if( destIfNul
fee0: 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29  l==destIfFalse )
fef0: 7b 0a 20 20 20 20 2f 2a 20 53 68 6f 72 74 63 75  {.    /* Shortcu
ff00: 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  t for the common
ff10: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
ff20: 66 61 6c 73 65 20 61 6e 64 20 4e 55 4c 4c 20 6f  false and NULL o
ff30: 75 74 63 6f 6d 65 73 20 61 72 65 0a 20 20 20 20  utcomes are.    
ff40: 2a 2a 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a  ** the same. */.
ff50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ff60: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
ff70: 6c 6c 2c 20 72 31 2c 20 64 65 73 74 49 66 4e 75  ll, r1, destIfNu
ff80: 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ll);.  }else{.  
ff90: 20 20 69 6e 74 20 61 64 64 72 31 20 3d 20 73 71    int addr1 = sq
ffa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
ffb0: 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72  v, OP_NotNull, r
ffc0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
ffd0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
ffe0: 52 65 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69  Rewind, pExpr->i
fff0: 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c  Table, destIfFal
10000 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  se);.    sqlite3
10010 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10020 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66  _Goto, 0, destIf
10030 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  Null);.    sqlit
10040 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
10050 2c 20 61 64 64 72 31 29 3b 0a 20 20 7d 0a 0a 20  , addr1);.  }.. 
10060 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49   if( eType==IN_I
10070 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20  NDEX_ROWID ){.  
10080 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
10090 65 2c 20 74 68 65 20 52 48 53 20 69 73 20 74 68  e, the RHS is th
100a0 65 20 52 4f 57 49 44 20 6f 66 20 74 61 62 6c 65  e ROWID of table
100b0 20 62 2d 74 72 65 65 0a 20 20 20 20 2a 2f 0a 20   b-tree.    */. 
100c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
100d0 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp2(v, OP_MustB
100e0 65 49 6e 74 2c 20 72 31 2c 20 64 65 73 74 49 66  eInt, r1, destIf
100f0 46 61 6c 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  False);.    sqli
10100 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10110 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 70   OP_NotExists, p
10120 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
10130 73 74 49 66 46 61 6c 73 65 2c 20 72 31 29 3b 0a  stIfFalse, r1);.
10140 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
10150 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
10160 65 20 52 48 53 20 69 73 20 61 6e 20 69 6e 64 65  e RHS is an inde
10170 78 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2f  x b-tree..    */
10180 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10190 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66  AddOp4(v, OP_Aff
101a0 69 6e 69 74 79 2c 20 72 31 2c 20 31 2c 20 30 2c  inity, r1, 1, 0,
101b0 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a   &affinity, 1);.
101c0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
101d0 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  et membership te
101e0 73 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74  st fails, then t
101f0 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
10200 20 0a 20 20 20 20 2a 2a 20 22 78 20 49 4e 20 28   .    ** "x IN (
10210 2e 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e  ...)" expression
10220 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
10230 30 20 6f 72 20 4e 55 4c 4c 2e 20 49 66 20 74 68  0 or NULL. If th
10240 65 20 73 65 74 0a 20 20 20 20 2a 2a 20 63 6f 6e  e set.    ** con
10250 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76 61  tains no NULL va
10260 6c 75 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72  lues, then the r
10270 65 73 75 6c 74 20 69 73 20 30 2e 20 49 66 20 74  esult is 0. If t
10280 68 65 20 73 65 74 20 0a 20 20 20 20 2a 2a 20 63  he set .    ** c
10290 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
102a0 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c  ore NULL values,
102b0 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
102c0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 65   of the.    ** e
102d0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 73  xpression is als
102e0 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20  o NULL..    */. 
102f0 20 20 20 69 66 28 20 72 52 68 73 48 61 73 4e 75     if( rRhsHasNu
10300 6c 6c 3d 3d 30 20 7c 7c 20 64 65 73 74 49 66 46  ll==0 || destIfF
10310 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c  alse==destIfNull
10320 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
10330 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66  s branch runs if
10340 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 61 74 20   it is known at 
10350 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 74 68 61  compile time tha
10360 74 20 74 68 65 20 52 48 53 0a 20 20 20 20 20 20  t the RHS.      
10370 2a 2a 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 61 69  ** cannot contai
10380 6e 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 20 54  n NULL values. T
10390 68 69 73 20 68 61 70 70 65 6e 73 20 61 73 20 74  his happens as t
103a0 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  he result.      
103b0 2a 2a 20 6f 66 20 61 20 22 4e 4f 54 20 4e 55 4c  ** of a "NOT NUL
103c0 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e  L" constraint in
103d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
103e0 68 65 6d 61 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  hema..      **. 
103f0 20 20 20 20 20 2a 2a 20 41 6c 73 6f 20 72 75 6e       ** Also run
10400 20 74 68 69 73 20 62 72 61 6e 63 68 20 69 66 20   this branch if 
10410 4e 55 4c 4c 20 69 73 20 65 71 75 69 76 61 6c 65  NULL is equivale
10420 6e 74 20 74 6f 20 46 41 4c 53 45 0a 20 20 20 20  nt to FALSE.    
10430 20 20 2a 2a 20 66 6f 72 20 74 68 69 73 20 70 61    ** for this pa
10440 72 74 69 63 75 6c 61 72 20 49 4e 20 6f 70 65 72  rticular IN oper
10450 61 74 6f 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ator..      */. 
10460 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10470 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
10480 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  NotFound, pExpr-
10490 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46  >iTable, destIfF
104a0 61 6c 73 65 2c 20 72 31 2c 20 31 29 3b 0a 0a 20  alse, r1, 1);.. 
104b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
104c0 2f 2a 20 49 6e 20 74 68 69 73 20 62 72 61 6e 63  /* In this branc
104d0 68 2c 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  h, the RHS of th
104e0 65 20 49 4e 20 6d 69 67 68 74 20 63 6f 6e 74 61  e IN might conta
104f0 69 6e 20 61 20 4e 55 4c 4c 20 61 6e 64 0a 20 20  in a NULL and.  
10500 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65 73 65      ** the prese
10510 6e 63 65 20 6f 66 20 61 20 4e 55 4c 4c 20 6f 6e  nce of a NULL on
10520 20 74 68 65 20 52 48 53 20 6d 61 6b 65 73 20 61   the RHS makes a
10530 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74   difference in t
10540 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 75 74 63  he.      ** outc
10550 6f 6d 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ome..      */.  
10560 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 2c 20      int j1, j2, 
10570 6a 33 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69  j3;..      /* Fi
10580 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65  rst check to see
10590 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 63   if the LHS is c
105a0 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
105b0 52 48 53 2e 20 20 49 66 20 73 6f 2c 0a 20 20 20  RHS.  If so,.   
105c0 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 70     ** then the p
105d0 72 65 73 65 6e 63 65 20 6f 66 20 4e 55 4c 4c 73  resence of NULLs
105e0 20 69 6e 20 74 68 65 20 52 48 53 20 64 6f 65 73   in the RHS does
105f0 20 6e 6f 74 20 6d 61 74 74 65 72 2c 20 73 6f 20   not matter, so 
10600 6a 75 6d 70 0a 20 20 20 20 20 20 2a 2a 20 6f 76  jump.      ** ov
10610 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f  er all of the co
10620 64 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 2e  de that follows.
10630 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10640 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
10650 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
10660 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  Found, pExpr->iT
10670 61 62 6c 65 2c 20 30 2c 20 72 31 2c 20 31 29 3b  able, 0, r1, 1);
10680 0a 0a 20 20 20 20 20 20 2f 2a 20 48 65 72 65 20  ..      /* Here 
10690 77 65 20 62 65 67 69 6e 20 67 65 6e 65 72 61 74  we begin generat
106a0 69 6e 67 20 63 6f 64 65 20 74 68 61 74 20 72 75  ing code that ru
106b0 6e 73 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  ns if the LHS is
106c0 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f   not.      ** co
106d0 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74  ntained within t
106e0 68 65 20 52 48 53 2e 20 20 47 65 6e 65 72 61 74  he RHS.  Generat
106f0 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 64  e additional cod
10700 65 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  e that.      ** 
10710 74 65 73 74 73 20 74 68 65 20 52 48 53 20 66 6f  tests the RHS fo
10720 72 20 4e 55 4c 4c 73 2e 20 20 49 66 20 74 68 65  r NULLs.  If the
10730 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 61 20   RHS contains a 
10740 4e 55 4c 4c 20 74 68 65 6e 0a 20 20 20 20 20 20  NULL then.      
10750 2a 2a 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49  ** jump to destI
10760 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 72 65  fNull.  If there
10770 20 61 72 65 20 6e 6f 20 4e 55 4c 4c 73 20 69 6e   are no NULLs in
10780 20 74 68 65 20 52 48 53 20 74 68 65 6e 0a 20 20   the RHS then.  
10790 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20 64      ** jump to d
107a0 65 73 74 49 66 46 61 6c 73 65 2e 0a 20 20 20 20  estIfFalse..    
107b0 20 20 2a 2f 0a 20 20 20 20 20 20 6a 32 20 3d 20    */.      j2 = 
107c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
107d0 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  1(v, OP_NotNull,
107e0 20 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20   rRhsHasNull);. 
107f0 20 20 20 20 20 6a 33 20 3d 20 73 71 6c 69 74 65       j3 = sqlite
10800 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
10810 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70  , OP_Found, pExp
10820 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72 52  r->iTable, 0, rR
10830 68 73 48 61 73 4e 75 6c 6c 2c 20 31 29 3b 0a 20  hsHasNull, 1);. 
10840 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10850 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
10860 65 67 65 72 2c 20 2d 31 2c 20 72 52 68 73 48 61  eger, -1, rRhsHa
10870 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  sNull);.      sq
10880 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
10890 65 28 76 2c 20 6a 33 29 3b 0a 20 20 20 20 20 20  e(v, j3);.      
108a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
108b0 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
108c0 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 31 29 3b  rRhsHasNull, 1);
108d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
108e0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 32  beJumpHere(v, j2
108f0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d  );..      /* Jum
10900 70 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72  p to the appropr
10910 69 61 74 65 20 74 61 72 67 65 74 20 64 65 70 65  iate target depe
10920 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
10930 20 6f 72 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a   or not.      **
10940 20 74 68 65 20 52 48 53 20 63 6f 6e 74 61 69 6e   the RHS contain
10950 73 20 61 20 4e 55 4c 4c 0a 20 20 20 20 20 20 2a  s a NULL.      *
10960 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
10970 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10980 49 66 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c  If, rRhsHasNull,
10990 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
109a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
109b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
109c0 2c 20 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65  , 0, destIfFalse
109d0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  );..      /* The
109e0 20 4f 50 5f 46 6f 75 6e 64 20 61 74 20 74 68 65   OP_Found at the
109f0 20 74 6f 70 20 6f 66 20 74 68 69 73 20 62 72 61   top of this bra
10a00 6e 63 68 20 6a 75 6d 70 73 20 68 65 72 65 20 77  nch jumps here w
10a10 68 65 6e 20 74 72 75 65 2c 20 0a 20 20 20 20 20  hen true, .     
10a20 20 2a 2a 20 63 61 75 73 69 6e 67 20 74 68 65 20   ** causing the 
10a30 6f 76 65 72 61 6c 6c 20 49 4e 20 65 78 70 72 65  overall IN expre
10a40 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 69 6f 6e  ssion evaluation
10a50 20 74 6f 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   to fall through
10a60 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10a70 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
10a80 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20  Here(v, j1);.   
10a90 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
10aa0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
10ab0 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 73 71  Parse, r1);.  sq
10ac0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
10ad0 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20  p(pParse, 1);.  
10ae0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
10af0 22 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29 3b  "end IN expr"));
10b00 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
10b10 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
10b20 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75 70 6c  Y */../*.** Dupl
10b30 69 63 61 74 65 20 61 6e 20 38 2d 62 79 74 65 20  icate an 8-byte 
10b40 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20  value.*/.static 
10b50 63 68 61 72 20 2a 64 75 70 38 62 79 74 65 73 28  char *dup8bytes(
10b60 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63  Vdbe *v, const c
10b70 68 61 72 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72  har *in){.  char
10b80 20 2a 6f 75 74 20 3d 20 73 71 6c 69 74 65 33 44   *out = sqlite3D
10b90 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71 6c 69 74  bMallocRaw(sqlit
10ba0 65 33 56 64 62 65 44 62 28 76 29 2c 20 38 29 3b  e3VdbeDb(v), 8);
10bb0 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20  .  if( out ){.  
10bc0 20 20 6d 65 6d 63 70 79 28 6f 75 74 2c 20 69 6e    memcpy(out, in
10bd0 2c 20 38 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 8);.  }.  retu
10be0 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 23 69 66 6e 64  rn out;.}..#ifnd
10bf0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
10c00 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a  LOATING_POINT./*
10c10 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
10c20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
10c30 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c   will put the fl
10c40 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
10c50 76 61 6c 75 65 20 64 65 73 63 72 69 62 65 64 20  value described 
10c60 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74  by z[0..n-1] int
10c70 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e  o register iMem.
10c80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73  .**.** The z[] s
10c90 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61  tring will proba
10ca0 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d  bly not be zero-
10cb0 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74  terminated.  But
10cc0 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68   the .** z[n] ch
10cd0 61 72 61 63 74 65 72 20 69 73 20 67 75 61 72 61  aracter is guara
10ce0 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65  nteed to be some
10cf0 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20  thing that does 
10d00 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65  not look.** like
10d10 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f   the continuatio
10d20 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e  n of the number.
10d30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10d40 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76  codeReal(Vdbe *v
10d50 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  , const char *z,
10d60 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c   int negateFlag,
10d70 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66   int iMem){.  if
10d80 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29  ( ALWAYS(z!=0) )
10d90 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c  {.    double val
10da0 75 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56  ue;.    char *zV
10db0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f  ;.    sqlite3Ato
10dc0 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c  F(z, &value, sql
10dd0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c  ite3Strlen30(z),
10de0 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
10df0 20 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69     assert( !sqli
10e00 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65 29 20  te3IsNaN(value) 
10e10 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20 41 74  ); /* The new At
10e20 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73  oF never returns
10e30 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20   NaN */.    if( 
10e40 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76 61 6c  negateFlag ) val
10e50 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20  ue = -value;.   
10e60 20 7a 56 20 3d 20 64 75 70 38 62 79 74 65 73 28   zV = dup8bytes(
10e70 76 2c 20 28 63 68 61 72 2a 29 26 76 61 6c 75 65  v, (char*)&value
10e80 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
10e90 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 52  beAddOp4(v, OP_R
10ea0 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c  eal, 0, iMem, 0,
10eb0 20 7a 56 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20   zV, P4_REAL);. 
10ec0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
10ed0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
10ee0 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
10ef0 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e   will put the in
10f00 74 65 67 65 72 20 64 65 73 63 72 69 62 65 20 62  teger describe b
10f10 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e  y.** text z[0..n
10f20 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65  -1] into registe
10f30 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78  r iMem..**.** Ex
10f40 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73 20 61  pr.u.zToken is a
10f50 6c 77 61 79 73 20 55 54 46 38 20 61 6e 64 20 7a  lways UTF8 and z
10f60 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a  ero-terminated..
10f70 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
10f80 6f 64 65 49 6e 74 65 67 65 72 28 50 61 72 73 65  odeInteger(Parse
10f90 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
10fa0 70 45 78 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c  pExpr, int negFl
10fb0 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20  ag, int iMem){. 
10fc0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
10fd0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20  e->pVdbe;.  if( 
10fe0 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
10ff0 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20  P_IntValue ){.  
11000 20 20 69 6e 74 20 69 20 3d 20 70 45 78 70 72 2d    int i = pExpr-
11010 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 61  >u.iValue;.    a
11020 73 73 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20  ssert( i>=0 );. 
11030 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29     if( negFlag )
11040 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c   i = -i;.    sql
11050 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11060 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c  , OP_Integer, i,
11070 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b   iMem);.  }else{
11080 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20  .    int c;.    
11090 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20 63  i64 value;.    c
110a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
110b0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
110c0 20 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30      assert( z!=0
110d0 20 29 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c 69   );.    c = sqli
110e0 74 65 33 41 74 6f 69 36 34 28 7a 2c 20 26 76 61  te3Atoi64(z, &va
110f0 6c 75 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  lue, sqlite3Strl
11100 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f  en30(z), SQLITE_
11110 55 54 46 38 29 3b 0a 20 20 20 20 69 66 28 20 63  UTF8);.    if( c
11120 3d 3d 30 20 7c 7c 20 28 63 3d 3d 32 20 26 26 20  ==0 || (c==2 && 
11130 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20 20 20 20  negFlag) ){.    
11140 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20    char *zV;.    
11150 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 7b    if( negFlag ){
11160 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32 20 3f 20   value = c==2 ? 
11170 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a  SMALLEST_INT64 :
11180 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20 20 20   -value; }.     
11190 20 7a 56 20 3d 20 64 75 70 38 62 79 74 65 73 28   zV = dup8bytes(
111a0 76 2c 20 28 63 68 61 72 2a 29 26 76 61 6c 75 65  v, (char*)&value
111b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
111c0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
111d0 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c  _Int64, 0, iMem,
111e0 20 30 2c 20 7a 56 2c 20 50 34 5f 49 4e 54 36 34   0, zV, P4_INT64
111f0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69  );.    }else{.#i
11200 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
11210 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
11220 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
11230 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
11240 76 65 72 73 69 7a 65 64 20 69 6e 74 65 67 65 72  versized integer
11250 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67  : %s%s", negFlag
11260 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 29 3b   ? "-" : "", z);
11270 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 63 6f 64  .#else.      cod
11280 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46  eReal(v, z, negF
11290 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 23 65 6e 64  lag, iMem);.#end
112a0 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  if.    }.  }.}..
112b0 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 63 61  /*.** Clear a ca
112c0 63 68 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74  che entry..*/.st
112d0 61 74 69 63 20 76 6f 69 64 20 63 61 63 68 65 45  atic void cacheE
112e0 6e 74 72 79 43 6c 65 61 72 28 50 61 72 73 65 20  ntryClear(Parse 
112f0 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20  *pParse, struct 
11300 79 43 6f 6c 43 61 63 68 65 20 2a 70 29 7b 0a 20  yColCache *p){. 
11310 20 69 66 28 20 70 2d 3e 74 65 6d 70 52 65 67 20   if( p->tempReg 
11320 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  ){.    if( pPars
11330 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61  e->nTempReg<Arra
11340 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54  ySize(pParse->aT
11350 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 20  empReg) ){.     
11360 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
11370 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  g[pParse->nTempR
11380 65 67 2b 2b 5d 20 3d 20 70 2d 3e 69 52 65 67 3b  eg++] = p->iReg;
11390 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 65  .    }.    p->te
113a0 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d  mpReg = 0;.  }.}
113b0 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20  .../*.** Record 
113c0 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  in the column ca
113d0 63 68 65 20 74 68 61 74 20 61 20 70 61 72 74 69  che that a parti
113e0 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 66 72 6f  cular column fro
113f0 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61  m a.** particula
11400 72 20 74 61 62 6c 65 20 69 73 20 73 74 6f 72 65  r table is store
11410 64 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61  d in a particula
11420 72 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 76  r register..*/.v
11430 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
11440 61 63 68 65 53 74 6f 72 65 28 50 61 72 73 65 20  acheStore(Parse 
11450 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61  *pParse, int iTa
11460 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74  b, int iCol, int
11470 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b   iReg){.  int i;
11480 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20  .  int minLru;. 
11490 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a 20 20 73   int idxLru;.  s
114a0 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
114b0 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  *p;..  assert( i
114c0 52 65 67 3e 30 20 29 3b 20 20 2f 2a 20 52 65 67  Reg>0 );  /* Reg
114d0 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 61 72  ister numbers ar
114e0 65 20 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76  e always positiv
114f0 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  e */.  assert( i
11500 43 6f 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c  Col>=-1 && iCol<
11510 33 32 37 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e  32768 );  /* Fin
11520 69 74 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  ite column numbe
11530 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  rs */..  /* The 
11540 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63  SQLITE_ColumnCac
11550 68 65 20 66 6c 61 67 20 64 69 73 61 62 6c 65 73  he flag disables
11560 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
11570 65 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  e.  This is used
11580 0a 20 20 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e  .  ** for testin
11590 67 20 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69  g only - to veri
115a0 66 79 20 74 68 61 74 20 53 51 4c 69 74 65 20 61  fy that SQLite a
115b0 6c 77 61 79 73 20 67 65 74 73 20 74 68 65 20 73  lways gets the s
115c0 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20  ame answer.  ** 
115d0 77 69 74 68 20 61 6e 64 20 77 69 74 68 6f 75 74  with and without
115e0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
115f0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
11600 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
11610 26 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43  & SQLITE_ColumnC
11620 61 63 68 65 20 29 20 72 65 74 75 72 6e 3b 0a 0a  ache ) return;..
11630 20 20 2f 2a 20 46 69 72 73 74 20 72 65 70 6c 61    /* First repla
11640 63 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  ce any existing 
11650 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  entry..  **.  **
11660 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 77   Actually, the w
11670 61 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ay the column ca
11680 63 68 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  che is currently
11690 20 75 73 65 64 2c 20 77 65 20 61 72 65 20 67 75   used, we are gu
116a0 61 72 61 6e 74 65 65 64 0a 20 20 2a 2a 20 74 68  aranteed.  ** th
116b0 61 74 20 74 68 65 20 6f 62 6a 65 63 74 20 77 69  at the object wi
116c0 6c 6c 20 6e 65 76 65 72 20 61 6c 72 65 61 64 79  ll never already
116d0 20 62 65 20 69 6e 20 63 61 63 68 65 2e 20 20 56   be in cache.  V
116e0 65 72 69 66 79 20 74 68 69 73 20 67 75 61 72 61  erify this guara
116f0 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  ntee..  */.#ifnd
11700 65 66 20 4e 44 45 42 55 47 0a 20 20 66 6f 72 28  ef NDEBUG.  for(
11710 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
11720 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
11730 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
11740 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 61 73  ++, p++){.    as
11750 73 65 72 74 28 20 70 2d 3e 69 52 65 67 3d 3d 30  sert( p->iReg==0
11760 20 7c 7c 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69   || p->iTable!=i
11770 54 61 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d  Tab || p->iColum
11780 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23  n!=iCol );.  }.#
11790 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 69 6e 64  endif..  /* Find
117a0 20 61 6e 20 65 6d 70 74 79 20 73 6c 6f 74 20 61   an empty slot a
117b0 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20 2a 2f  nd replace it */
117c0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
117d0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
117e0 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
117f0 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
11800 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
11810 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
11820 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d  iLevel = pParse-
11830 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20  >iCacheLevel;.  
11840 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20      p->iTable = 
11850 69 54 61 62 3b 0a 20 20 20 20 20 20 70 2d 3e 69  iTab;.      p->i
11860 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20  Column = iCol;. 
11870 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69       p->iReg = i
11880 52 65 67 3b 0a 20 20 20 20 20 20 70 2d 3e 74 65  Reg;.      p->te
11890 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 20  mpReg = 0;.     
118a0 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65   p->lru = pParse
118b0 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20  ->iCacheCnt++;. 
118c0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
118d0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70   }.  }..  /* Rep
118e0 6c 61 63 65 20 74 68 65 20 6c 61 73 74 20 72 65  lace the last re
118f0 63 65 6e 74 6c 79 20 75 73 65 64 20 2a 2f 0a 20  cently used */. 
11900 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66 66 66   minLru = 0x7fff
11910 66 66 66 66 3b 0a 20 20 69 64 78 4c 72 75 20 3d  ffff;.  idxLru =
11920 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20   -1;.  for(i=0, 
11930 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
11940 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
11950 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
11960 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
11970 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20 20  lru<minLru ){.  
11980 20 20 20 20 69 64 78 4c 72 75 20 3d 20 69 3b 0a      idxLru = i;.
11990 20 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20 70        minLru = p
119a0 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a 20 20 7d  ->lru;.    }.  }
119b0 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 69 64  .  if( ALWAYS(id
119c0 78 4c 72 75 3e 3d 30 29 20 29 7b 0a 20 20 20 20  xLru>=0) ){.    
119d0 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f  p = &pParse->aCo
119e0 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d 3b 0a  lCache[idxLru];.
119f0 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20      p->iLevel = 
11a00 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
11a10 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62  vel;.    p->iTab
11a20 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70  le = iTab;.    p
11a30 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c  ->iColumn = iCol
11a40 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20  ;.    p->iReg = 
11a50 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e 74 65 6d  iReg;.    p->tem
11a60 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 70 2d  pReg = 0;.    p-
11a70 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69  >lru = pParse->i
11a80 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20  CacheCnt++;.    
11a90 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f  return;.  }.}../
11aa0 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
11ab0 61 74 20 72 65 67 69 73 74 65 72 73 20 62 65 74  at registers bet
11ac0 77 65 65 6e 20 69 52 65 67 2e 2e 69 52 65 67 2b  ween iReg..iReg+
11ad0 6e 52 65 67 2d 31 20 61 72 65 20 62 65 69 6e 67  nReg-1 are being
11ae0 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2a   overwritten..**
11af0 20 50 75 72 67 65 20 74 68 65 20 72 61 6e 67 65   Purge the range
11b00 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 66 72   of registers fr
11b10 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  om the column ca
11b20 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  che..*/.void sql
11b30 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
11b40 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ove(Parse *pPars
11b50 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74  e, int iReg, int
11b60 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b   nReg){.  int i;
11b70 0a 20 20 69 6e 74 20 69 4c 61 73 74 20 3d 20 69  .  int iLast = i
11b80 52 65 67 20 2b 20 6e 52 65 67 20 2d 20 31 3b 0a  Reg + nReg - 1;.
11b90 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
11ba0 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30  he *p;.  for(i=0
11bb0 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
11bc0 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
11bd0 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
11be0 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72   p++){.    int r
11bf0 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20   = p->iReg;.    
11c00 69 66 28 20 72 3e 3d 69 52 65 67 20 26 26 20 72  if( r>=iReg && r
11c10 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  <=iLast ){.     
11c20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
11c30 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
11c40 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a     p->iReg = 0;.
11c50 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
11c60 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20  ** Remember the 
11c70 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 63  current column c
11c80 61 63 68 65 20 63 6f 6e 74 65 78 74 2e 20 20 41  ache context.  A
11c90 6e 79 20 6e 65 77 20 65 6e 74 72 69 65 73 20 61  ny new entries a
11ca0 64 64 65 64 0a 2a 2a 20 61 64 64 65 64 20 74 6f  dded.** added to
11cb0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
11cc0 65 20 61 66 74 65 72 20 74 68 69 73 20 63 61 6c  e after this cal
11cd0 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 77 68  l are removed wh
11ce0 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  en the.** corres
11cf0 70 6f 6e 64 69 6e 67 20 70 6f 70 20 6f 63 63 75  ponding pop occu
11d00 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rs..*/.void sqli
11d10 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
11d20 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
11d30 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  .  pParse->iCach
11d40 65 4c 65 76 65 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a  eLevel++;.}../*.
11d50 2a 2a 20 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74  ** Remove from t
11d60 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
11d70 61 6e 79 20 65 6e 74 72 69 65 73 20 74 68 61 74  any entries that
11d80 20 77 65 72 65 20 61 64 64 65 64 20 73 69 6e 63   were added sinc
11d90 65 20 74 68 65 0a 2a 2a 20 74 68 65 20 70 72 65  e the.** the pre
11da0 76 69 6f 75 73 20 4e 20 50 75 73 68 20 6f 70 65  vious N Push ope
11db0 72 61 74 69 6f 6e 73 2e 20 20 49 6e 20 6f 74 68  rations.  In oth
11dc0 65 72 20 77 6f 72 64 73 2c 20 72 65 73 74 6f 72  er words, restor
11dd0 65 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 74  e the cache.** t
11de0 6f 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  o the state it w
11df0 61 73 20 69 6e 20 4e 20 50 75 73 68 65 73 20 61  as in N Pushes a
11e00 67 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  go..*/.void sqli
11e10 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
11e20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
11e30 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  nt N){.  int i;.
11e40 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
11e50 68 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  he *p;.  assert(
11e60 20 4e 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74   N>0 );.  assert
11e70 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  ( pParse->iCache
11e80 4c 65 76 65 6c 3e 3d 4e 20 29 3b 0a 20 20 70 50  Level>=N );.  pP
11e90 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
11ea0 6c 20 2d 3d 20 4e 3b 0a 20 20 66 6f 72 28 69 3d  l -= N;.  for(i=
11eb0 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
11ec0 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
11ed0 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
11ee0 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
11ef0 70 2d 3e 69 52 65 67 20 26 26 20 70 2d 3e 69 4c  p->iReg && p->iL
11f00 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43 61  evel>pParse->iCa
11f10 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20  cheLevel ){.    
11f20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61    cacheEntryClea
11f30 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  r(pParse, p);.  
11f40 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b      p->iReg = 0;
11f50 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
11f60 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61 63 68 65  .** When a cache
11f70 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65 75 73  d column is reus
11f80 65 64 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  ed, make sure th
11f90 61 74 20 69 74 73 20 72 65 67 69 73 74 65 72 20  at its register 
11fa0 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20  is.** no longer 
11fb0 61 76 61 69 6c 61 62 6c 65 20 61 73 20 61 20 74  available as a t
11fc0 65 6d 70 20 72 65 67 69 73 74 65 72 2e 20 20 74  emp register.  t
11fd0 69 63 6b 65 74 20 23 33 38 37 39 3a 20 20 74 68  icket #3879:  th
11fe0 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65 67 69 73  at same.** regis
11ff0 74 65 72 20 6d 69 67 68 74 20 62 65 20 69 6e 20  ter might be in 
12000 74 68 65 20 63 61 63 68 65 20 69 6e 20 6d 75 6c  the cache in mul
12010 74 69 70 6c 65 20 70 6c 61 63 65 73 2c 20 73 6f  tiple places, so
12020 20 62 65 20 73 75 72 65 20 74 6f 0a 2a 2a 20 67   be sure to.** g
12030 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a  et them all..*/.
12040 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
12050 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e 52  te3ExprCachePinR
12060 65 67 69 73 74 65 72 28 50 61 72 73 65 20 2a 70  egister(Parse *p
12070 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29  Parse, int iReg)
12080 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
12090 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
120a0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ;.  for(i=0, p=p
120b0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
120c0 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
120d0 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
120e0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
120f0 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20  g==iReg ){.     
12100 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b   p->tempReg = 0;
12110 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
12120 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
12130 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  e to extract the
12140 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 43   value of the iC
12150 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20  ol-th column of 
12160 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  a table..*/.void
12170 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
12180 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
12190 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
121a0 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
121b0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
121c0 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  on */.  Table *p
121d0 54 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20 74  Tab,    /* The t
121e0 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
121f0 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  the value */.  i
12200 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f  nt iTabCur,    /
12210 2a 20 54 68 65 20 63 75 72 73 6f 72 20 66 6f 72  * The cursor for
12220 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
12230 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20   int iCol,      
12240 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
12250 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61   column to extra
12260 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ct */.  int regO
12270 75 74 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61  ut      /* Extra
12280 63 74 20 74 68 65 20 76 61 6c 75 64 20 69 6e 74  ct the valud int
12290 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  o this register 
122a0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 43 6f 6c  */.){.  if( iCol
122b0 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62  <0 || iCol==pTab
122c0 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 73  ->iPKey ){.    s
122d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
122e0 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54  (v, OP_Rowid, iT
122f0 61 62 43 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a  abCur, regOut);.
12300 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
12310 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c 28   op = IsVirtual(
12320 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75  pTab) ? OP_VColu
12330 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a  mn : OP_Column;.
12340 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12350 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61  ddOp3(v, op, iTa
12360 62 43 75 72 2c 20 69 43 6f 6c 2c 20 72 65 67 4f  bCur, iCol, regO
12370 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  ut);.  }.  if( i
12380 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  Col>=0 ){.    sq
12390 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75  lite3ColumnDefau
123a0 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c  lt(v, pTab, iCol
123b0 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d  , regOut);.  }.}
123c0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
123d0 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
123e0 65 78 74 72 61 63 74 20 74 68 65 20 69 43 6f 6c  extract the iCol
123f0 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72  umn-th column fr
12400 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62  om.** table pTab
12410 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 63   and store the c
12420 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61  olumn value in a
12430 20 72 65 67 69 73 74 65 72 2e 20 20 41 6e 20 65   register.  An e
12440 66 66 6f 72 74 0a 2a 2a 20 69 73 20 6d 61 64 65  ffort.** is made
12450 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f   to store the co
12460 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65  lumn value in re
12470 67 69 73 74 65 72 20 69 52 65 67 2c 20 62 75 74  gister iReg, but
12480 20 74 68 69 73 20 69 73 0a 2a 2a 20 6e 6f 74 20   this is.** not 
12490 67 75 61 72 61 6e 74 65 65 64 2e 20 20 54 68 65  guaranteed.  The
124a0 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
124b0 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73   column value is
124c0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
124d0 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
124e0 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f  n open cursor to
124f0 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65 20   pTab in iTable 
12500 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
12510 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20  e.** is called. 
12520 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68   If iColumn<0 th
12530 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72  en code is gener
12540 61 74 65 64 20 74 68 61 74 20 65 78 74 72 61 63  ated that extrac
12550 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f  ts the rowid..*/
12560 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
12570 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20  CodeGetColumn(. 
12580 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
12590 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
125a0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
125b0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
125c0 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f  ble *pTab,     /
125d0 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
125e0 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72   the table we ar
125f0 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a  e reading from *
12600 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c  /.  int iColumn,
12610 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
12620 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d   the table colum
12630 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  n */.  int iTabl
12640 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  e,      /* The c
12650 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
12660 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  o the table */. 
12670 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20 20   int iReg,      
12680 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c    /* Store resul
12690 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 75 38 20  ts here */.  u8 
126a0 70 35 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p5            /*
126b0 20 50 35 20 76 61 6c 75 65 20 66 6f 72 20 4f 50   P5 value for OP
126c0 5f 43 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20  _Column */.){.  
126d0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
126e0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
126f0 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
12700 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28  ache *p;..  for(
12710 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
12720 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
12730 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
12740 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
12750 28 20 70 2d 3e 69 52 65 67 3e 30 20 26 26 20 70  ( p->iReg>0 && p
12760 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
12770 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d   && p->iColumn==
12780 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
12790 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65   p->lru = pParse
127a0 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20  ->iCacheCnt++;. 
127b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
127c0 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72  CachePinRegister
127d0 28 70 50 61 72 73 65 2c 20 70 2d 3e 69 52 65 67  (pParse, p->iReg
127e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
127f0 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20  p->iReg;.    }. 
12800 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28 20 76   }  .  assert( v
12810 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
12820 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
12830 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62  nOfTable(v, pTab
12840 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d  , iTable, iColum
12850 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69 66 28 20  n, iReg);.  if( 
12860 70 35 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  p5 ){.    sqlite
12870 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
12880 20 70 35 29 3b 0a 20 20 7d 65 6c 73 65 7b 20 20   p5);.  }else{  
12890 20 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70   .    sqlite3Exp
128a0 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
128b0 73 65 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c  se, iTable, iCol
128c0 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d 0a  umn, iReg);.  }.
128d0 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d    return iReg;.}
128e0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6c  ../*.** Clear al
128f0 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 65  l column cache e
12900 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ntries..*/.void 
12910 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
12920 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50 61  Clear(Parse *pPa
12930 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  rse){.  int i;. 
12940 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
12950 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  e *p;..  for(i=0
12960 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
12970 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
12980 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
12990 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
129a0 2d 3e 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20  ->iReg ){.      
129b0 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28  cacheEntryClear(
129c0 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
129d0 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20    p->iReg = 0;. 
129e0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
129f0 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63  * Record the fac
12a00 74 20 74 68 61 74 20 61 6e 20 61 66 66 69 6e 69  t that an affini
12a10 74 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63  ty change has oc
12a20 63 75 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74  curred on iCount
12a30 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73 74  .** registers st
12a40 61 72 74 69 6e 67 20 77 69 74 68 20 69 53 74 61  arting with iSta
12a50 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rt..*/.void sqli
12a60 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
12a70 6e 69 74 79 43 68 61 6e 67 65 28 50 61 72 73 65  nityChange(Parse
12a80 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 53   *pParse, int iS
12a90 74 61 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74  tart, int iCount
12aa0 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  ){.  sqlite3Expr
12ab0 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72  CacheRemove(pPar
12ac0 73 65 2c 20 69 53 74 61 72 74 2c 20 69 43 6f 75  se, iStart, iCou
12ad0 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  nt);.}../*.** Ge
12ae0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d  nerate code to m
12af0 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ove content from
12b00 20 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d   registers iFrom
12b10 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a  ...iFrom+nReg-1.
12b20 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e  ** over to iTo..
12b30 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70  iTo+nReg-1. Keep
12b40 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
12b50 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f  e up-to-date..*/
12b60 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
12b70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20  rCodeMove(Parse 
12b80 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72  *pParse, int iFr
12b90 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74  om, int iTo, int
12ba0 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b   nReg){.  int i;
12bb0 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
12bc0 63 68 65 20 2a 70 3b 0a 20 20 69 66 28 20 4e 45  che *p;.  if( NE
12bd0 56 45 52 28 69 46 72 6f 6d 3d 3d 69 54 6f 29 20  VER(iFrom==iTo) 
12be0 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
12bf0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 50  te3VdbeAddOp3(pP
12c00 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
12c10 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f  Move, iFrom, iTo
12c20 2c 20 6e 52 65 67 29 3b 0a 20 20 66 6f 72 28 69  , nReg);.  for(i
12c30 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
12c40 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
12c50 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
12c60 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  +, p++){.    int
12c70 20 78 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20   x = p->iReg;.  
12c80 20 20 69 66 28 20 78 3e 3d 69 46 72 6f 6d 20 26    if( x>=iFrom &
12c90 26 20 78 3c 69 46 72 6f 6d 2b 6e 52 65 67 20 29  & x<iFrom+nReg )
12ca0 7b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  {.      p->iReg 
12cb0 2b 3d 20 69 54 6f 2d 69 46 72 6f 6d 3b 0a 20 20  += iTo-iFrom;.  
12cc0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
12cd0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
12ce0 6f 20 63 6f 70 79 20 63 6f 6e 74 65 6e 74 20 66  o copy content f
12cf0 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69 46  rom registers iF
12d00 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67  rom...iFrom+nReg
12d10 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54  -1.** over to iT
12d20 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 0a 2a  o..iTo+nReg-1..*
12d30 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
12d40 70 72 43 6f 64 65 43 6f 70 79 28 50 61 72 73 65  prCodeCopy(Parse
12d50 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46   *pParse, int iF
12d60 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e  rom, int iTo, in
12d70 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t nReg){.  int i
12d80 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 69 46  ;.  if( NEVER(iF
12d90 72 6f 6d 3d 3d 69 54 6f 29 20 29 20 72 65 74 75  rom==iTo) ) retu
12da0 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
12db0 3c 6e 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nReg; i++){.   
12dc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12dd0 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
12de0 2c 20 4f 50 5f 43 6f 70 79 2c 20 69 46 72 6f 6d  , OP_Copy, iFrom
12df0 2b 69 2c 20 69 54 6f 2b 69 29 3b 0a 20 20 7d 0a  +i, iTo+i);.  }.
12e00 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
12e10 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
12e20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43  defined(SQLITE_C
12e30 4f 56 45 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a  OVERAGE_TEST)./*
12e40 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
12e50 69 66 20 61 6e 79 20 72 65 67 69 73 74 65 72 20  if any register 
12e60 69 6e 20 74 68 65 20 72 61 6e 67 65 20 69 46 72  in the range iFr
12e70 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69  om..iTo (inclusi
12e80 76 65 29 0a 2a 2a 20 69 73 20 75 73 65 64 20 61  ve).** is used a
12e90 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f  s part of the co
12ea0 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  lumn cache..**.*
12eb0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
12ec0 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 73  s used within as
12ed0 73 65 72 74 28 29 20 61 6e 64 20 74 65 73 74 63  sert() and testc
12ee0 61 73 65 28 29 20 6d 61 63 72 6f 73 20 6f 6e 6c  ase() macros onl
12ef0 79 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f  y.** and does no
12f00 74 20 61 70 70 65 61 72 20 69 6e 20 61 20 6e 6f  t appear in a no
12f10 72 6d 61 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73  rmal build..*/.s
12f20 74 61 74 69 63 20 69 6e 74 20 75 73 65 64 41 73  tatic int usedAs
12f30 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73  ColumnCache(Pars
12f40 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
12f50 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a  From, int iTo){.
12f60 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
12f70 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
12f80 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
12f90 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
12fa0 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
12fb0 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
12fc0 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69      int r = p->i
12fd0 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d  Reg;.    if( r>=
12fe0 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20  iFrom && r<=iTo 
12ff0 29 20 72 65 74 75 72 6e 20 31 3b 20 20 20 20 2f  ) return 1;    /
13000 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a 20  *NO_TEST*/.  }. 
13010 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
13020 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
13030 42 55 47 20 7c 7c 20 53 51 4c 49 54 45 5f 43 4f  BUG || SQLITE_CO
13040 56 45 52 41 47 45 5f 54 45 53 54 20 2a 2f 0a 0a  VERAGE_TEST */..
13050 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
13060 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72  ode into the cur
13070 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61  rent Vdbe to eva
13080 6c 75 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a  luate the given.
13090 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ** expression.  
130a0 41 74 74 65 6d 70 74 20 74 6f 20 73 74 6f 72 65  Attempt to store
130b0 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
130c0 72 65 67 69 73 74 65 72 20 22 74 61 72 67 65 74  register "target
130d0 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  "..** Return the
130e0 20 72 65 67 69 73 74 65 72 20 77 68 65 72 65 20   register where 
130f0 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
13100 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74  ed..**.** With t
13110 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
13120 72 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e 74  re is no guarant
13130 65 65 20 74 68 61 74 20 72 65 73 75 6c 74 73 20  ee that results 
13140 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65  will.** be store
13150 64 20 69 6e 20 74 61 72 67 65 74 2e 20 20 54 68  d in target.  Th
13160 65 20 72 65 73 75 6c 74 20 6d 69 67 68 74 20 62  e result might b
13170 65 20 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65  e stored in some
13180 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69 73 74   other.** regist
13190 65 72 20 69 66 20 69 74 20 69 73 20 63 6f 6e 76  er if it is conv
131a0 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e  enient to do so.
131b0 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75    The calling fu
131c0 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63  nction.** must c
131d0 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20  heck the return 
131e0 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20 74 68  code and move th
131f0 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65  e results to the
13200 20 64 65 73 69 72 65 64 0a 2a 2a 20 72 65 67 69   desired.** regi
13210 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ster..*/.int sql
13220 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
13230 65 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  et(Parse *pParse
13240 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
13250 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64  nt target){.  Vd
13260 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
13270 70 56 64 62 65 3b 20 20 2f 2a 20 54 68 65 20 56  pVdbe;  /* The V
13280 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  M under construc
13290 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tion */.  int op
132a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
132b0 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64      /* The opcod
132c0 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  e being coded */
132d0 0a 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 74  .  int inReg = t
132e0 61 72 67 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  arget;       /* 
132f0 52 65 73 75 6c 74 73 20 73 74 6f 72 65 64 20 69  Results stored i
13300 6e 20 72 65 67 69 73 74 65 72 20 69 6e 52 65 67  n register inReg
13310 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65   */.  int regFre
13320 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  e1 = 0;         
13330 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66  /* If non-zero f
13340 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61  ree this tempora
13350 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  ry register */. 
13360 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20   int regFree2 = 
13370 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  0;         /* If
13380 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74   non-zero free t
13390 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65  his temporary re
133a0 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
133b0 72 31 2c 20 72 32 2c 20 72 33 2c 20 72 34 3b 20  r1, r2, r3, r4; 
133c0 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73        /* Various
133d0 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
133e0 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
133f0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
13400 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
13410 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a   connection */..
13420 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
13430 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50  >0 && target<=pP
13440 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  arse->nMem );.  
13450 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
13460 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
13470 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
13480 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   );.    return 0
13490 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 78  ;.  }..  if( pEx
134a0 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20  pr==0 ){.    op 
134b0 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  = TK_NULL;.  }el
134c0 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78  se{.    op = pEx
134d0 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77  pr->op;.  }.  sw
134e0 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
134f0 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
13500 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49  MN: {.      AggI
13510 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20  nfo *pAggInfo = 
13520 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b  pExpr->pAggInfo;
13530 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67  .      struct Ag
13540 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20  gInfo_col *pCol 
13550 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  = &pAggInfo->aCo
13560 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a  l[pExpr->iAgg];.
13570 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67 49        if( !pAggI
13580 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
13590 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
135a0 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20  t( pCol->iMem>0 
135b0 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
135c0 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20   = pCol->iMem;. 
135d0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
135e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41      }else if( pA
135f0 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69  ggInfo->useSorti
13600 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20  ngIdx ){.       
13610 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13620 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
13630 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69   pAggInfo->sorti
13640 6e 67 49 64 78 50 54 61 62 2c 0a 20 20 20 20 20  ngIdxPTab,.     
13650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13660 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
13670 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61  SorterColumn, ta
13680 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62  rget);.        b
13690 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
136a0 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65      /* Otherwise
136b0 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f  , fall thru into
136c0 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63   the TK_COLUMN c
136d0 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ase */.    }.   
136e0 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
136f0 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
13700 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a  pr->iTable<0 ){.
13710 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
13720 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
13730 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b 20 63  n coding check c
13740 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
13750 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
13760 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30 20 29  arse->ckBase>0 )
13770 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  ;.        inReg 
13780 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
13790 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73   + pParse->ckBas
137a0 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
137b0 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
137c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
137d0 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
137e0 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20   pExpr->pTab,.  
137f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
13810 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70  Expr->iColumn, p
13820 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61  Expr->iTable, ta
13830 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  rget,.          
13840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13850 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
13860 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
13870 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
13880 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
13890 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65  ER: {.      code
138a0 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20  Integer(pParse, 
138b0 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74  pExpr, 0, target
138c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
138d0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
138e0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
138f0 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73  NG_POINT.    cas
13900 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
13910 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
13920 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
13930 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
13940 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 52 65   );.      codeRe
13950 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  al(v, pExpr->u.z
13960 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72 67 65 74  Token, 0, target
13970 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
13980 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
13990 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
139a0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
139b0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
139c0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
139d0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 73  alue) );.      s
139e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
139f0 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
13a00 30 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 70 45  0, target, 0, pE
13a10 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
13a20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
13a30 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
13a40 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  K_NULL: {.      
13a50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13a60 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
13a70 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
13a80 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
13a90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13aa0 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20  _BLOB_LITERAL.  
13ab0 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20    case TK_BLOB: 
13ac0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  {.      int n;. 
13ad0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
13ae0 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  *z;.      char *
13af0 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73  zBlob;.      ass
13b00 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
13b10 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
13b20 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
13b30 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
13b40 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
13b50 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a  x' || pExpr->u.z
13b60 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b  Token[0]=='X' );
13b70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13b80 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  Expr->u.zToken[1
13b90 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20  ]=='\'' );.     
13ba0 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a   z = &pExpr->u.z
13bb0 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20  Token[2];.      
13bc0 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
13bd0 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20  n30(z) - 1;.    
13be0 20 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d    assert( z[n]==
13bf0 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 42  '\'' );.      zB
13c00 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78  lob = sqlite3Hex
13c10 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64  ToBlob(sqlite3Vd
13c20 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a  beDb(v), z, n);.
13c30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13c40 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c  eAddOp4(v, OP_Bl
13c50 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c  ob, n/2, target,
13c60 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59   0, zBlob, P4_DY
13c70 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 62 72  NAMIC);.      br
13c80 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
13c90 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41  f.    case TK_VA
13ca0 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20  RIABLE: {.      
13cb0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
13cc0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
13cd0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
13ce0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
13cf0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30  xpr->u.zToken!=0
13d00 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
13d10 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
13d20 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20  n[0]!=0 );.     
13d30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13d40 70 32 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c  p2(v, OP_Variabl
13d50 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  e, pExpr->iColum
13d60 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  n, target);.    
13d70 20 20 69 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a    if( pExpr->u.z
13d80 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20  Token[1]!=0 ){. 
13d90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13da0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
13db0 5d 3d 3d 27 3f 27 20 0a 20 20 20 20 20 20 20 20  ]=='?' .        
13dc0 20 20 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 70       || strcmp(p
13dd0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
13de0 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45  pParse->azVar[pE
13df0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 29  xpr->iColumn-1])
13e00 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ==0 );.        s
13e10 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
13e20 50 34 28 76 2c 20 2d 31 2c 20 70 50 61 72 73 65  P4(v, -1, pParse
13e30 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69  ->azVar[pExpr->i
13e40 43 6f 6c 75 6d 6e 2d 31 5d 2c 20 50 34 5f 53 54  Column-1], P4_ST
13e50 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ATIC);.      }. 
13e60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13e70 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  }.    case TK_RE
13e80 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  GISTER: {.      
13e90 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69  inReg = pExpr->i
13ea0 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 62 72 65  Table;.      bre
13eb0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
13ec0 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20  se TK_AS: {.    
13ed0 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
13ee0 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
13ef0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
13f00 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  Left, target);. 
13f10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13f20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
13f30 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63  _OMIT_CAST.    c
13f40 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20  ase TK_CAST: {. 
13f50 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
13f60 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  ons of the form:
13f70 20 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53     CAST(pLeft AS
13f80 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20   token) */.     
13f90 20 69 6e 74 20 61 66 66 2c 20 74 6f 5f 6f 70 3b   int aff, to_op;
13fa0 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
13fb0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
13fc0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
13fd0 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
13fe0 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
13ff0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
14000 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
14010 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
14020 61 66 66 20 3d 20 73 71 6c 69 74 65 33 41 66 66  aff = sqlite3Aff
14030 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72 2d  inityType(pExpr-
14040 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
14050 20 20 74 6f 5f 6f 70 20 3d 20 61 66 66 20 2d 20    to_op = aff - 
14060 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
14070 2b 20 4f 50 5f 54 6f 54 65 78 74 3b 0a 20 20 20  + OP_ToText;.   
14080 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70     assert( to_op
14090 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 20 20 20 7c  ==OP_ToText    |
140a0 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46  | aff!=SQLITE_AF
140b0 46 5f 54 45 58 54 20 20 20 20 29 3b 0a 20 20 20  F_TEXT    );.   
140c0 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70     assert( to_op
140d0 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 20 20 20 7c  ==OP_ToBlob    |
140e0 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46  | aff!=SQLITE_AF
140f0 46 5f 4e 4f 4e 45 20 20 20 20 29 3b 0a 20 20 20  F_NONE    );.   
14100 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70     assert( to_op
14110 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20 7c  ==OP_ToNumeric |
14120 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46  | aff!=SQLITE_AF
14130 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20  F_NUMERIC );.   
14140 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70     assert( to_op
14150 3d 3d 4f 50 5f 54 6f 49 6e 74 20 20 20 20 20 7c  ==OP_ToInt     |
14160 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46  | aff!=SQLITE_AF
14170 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20  F_INTEGER );.   
14180 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70     assert( to_op
14190 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 20 20 20 7c  ==OP_ToReal    |
141a0 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46  | aff!=SQLITE_AF
141b0 46 5f 52 45 41 4c 20 20 20 20 29 3b 0a 20 20 20  F_REAL    );.   
141c0 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f     testcase( to_
141d0 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 29 3b  op==OP_ToText );
141e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
141f0 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f   to_op==OP_ToBlo
14200 62 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  b );.      testc
14210 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ase( to_op==OP_T
14220 6f 4e 75 6d 65 72 69 63 20 29 3b 0a 20 20 20 20  oNumeric );.    
14230 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f    testcase( to_o
14240 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 29 3b 0a 20  p==OP_ToInt );. 
14250 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74       testcase( t
14260 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20  o_op==OP_ToReal 
14270 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52  );.      if( inR
14280 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20  eg!=target ){.  
14290 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
142a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
142b0 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  opy, inReg, targ
142c0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52  et);.        inR
142d0 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
142e0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
142f0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
14300 74 6f 5f 6f 70 2c 20 69 6e 52 65 67 29 3b 0a 20  to_op, inReg);. 
14310 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 75       testcase( u
14320 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65  sedAsColumnCache
14330 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20  (pParse, inReg, 
14340 69 6e 52 65 67 29 20 29 3b 0a 20 20 20 20 20 20  inReg) );.      
14350 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
14360 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
14370 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 31 29  Parse, inReg, 1)
14380 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14390 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
143a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20  QLITE_OMIT_CAST 
143b0 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  */.    case TK_L
143c0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
143d0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
143e0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
143f0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
14400 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
14410 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  Q: {.      asser
14420 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20  t( TK_LT==OP_Lt 
14430 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14440 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b   TK_LE==OP_Le );
14450 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
14460 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  K_GT==OP_Gt );. 
14470 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
14480 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20  GE==OP_Ge );.   
14490 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51     assert( TK_EQ
144a0 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20  ==OP_Eq );.     
144b0 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d   assert( TK_NE==
144c0 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 74  OP_Ne );.      t
144d0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
144e0 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LT );.      test
144f0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20  case( op==TK_LE 
14500 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14510 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a  e( op==TK_GT );.
14520 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14530 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20  op==TK_GE );.   
14540 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14550 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20  =TK_EQ );.      
14560 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
14570 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 72 31 20  _NE );.      r1 
14580 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
14590 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
145a0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
145b0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
145c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
145d0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
145e0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
145f0 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
14600 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
14610 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
14620 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
14630 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
14640 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69         r1, r2, i
14650 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f  nReg, SQLITE_STO
14660 52 45 50 32 29 3b 0a 20 20 20 20 20 20 74 65 73  REP2);.      tes
14670 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
14680 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
14690 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
146a0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
146b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
146c0 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65   TK_IS:.    case
146d0 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20   TK_ISNOT: {.   
146e0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
146f0 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
14700 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
14710 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  _ISNOT );.      
14720 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
14730 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
14740 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
14750 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
14760 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
14770 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
14780 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
14790 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
147a0 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f     op = (op==TK_
147b0 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b  IS) ? TK_EQ : TK
147c0 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  _NE;.      codeC
147d0 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
147e0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
147f0 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
14800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14810 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c    r1, r2, inReg,
14820 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20   SQLITE_STOREP2 
14830 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  | SQLITE_NULLEQ)
14840 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14850 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
14860 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14870 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
14880 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14890 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
148a0 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
148b0 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
148c0 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  PLUS:.    case T
148d0 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65  K_STAR:.    case
148e0 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63   TK_MINUS:.    c
148f0 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20  ase TK_REM:.    
14900 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a  case TK_BITAND:.
14910 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f      case TK_BITO
14920 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  R:.    case TK_S
14930 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54  LASH:.    case T
14940 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61  K_LSHIFT:.    ca
14950 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20  se TK_RSHIFT: . 
14960 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41     case TK_CONCA
14970 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
14980 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e  t( TK_AND==OP_An
14990 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
149a0 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20  t( TK_OR==OP_Or 
149b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
149c0 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64   TK_PLUS==OP_Add
149d0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
149e0 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53  ( TK_MINUS==OP_S
149f0 75 62 74 72 61 63 74 20 29 3b 0a 20 20 20 20 20  ubtract );.     
14a00 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d   assert( TK_REM=
14a10 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b  =OP_Remainder );
14a20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
14a30 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74  K_BITAND==OP_Bit
14a40 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  And );.      ass
14a50 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f  ert( TK_BITOR==O
14a60 50 5f 42 69 74 4f 72 20 29 3b 0a 20 20 20 20 20  P_BitOr );.     
14a70 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53   assert( TK_SLAS
14a80 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 0a  H==OP_Divide );.
14a90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14aa0 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66  _LSHIFT==OP_Shif
14ab0 74 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 61  tLeft );.      a
14ac0 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54  ssert( TK_RSHIFT
14ad0 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20  ==OP_ShiftRight 
14ae0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14af0 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43   TK_CONCAT==OP_C
14b00 6f 6e 63 61 74 20 29 3b 0a 20 20 20 20 20 20 74  oncat );.      t
14b10 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
14b20 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73  AND );.      tes
14b30 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52  tcase( op==TK_OR
14b40 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14b50 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20  se( op==TK_PLUS 
14b60 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14b70 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20  e( op==TK_MINUS 
14b80 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14b90 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b  e( op==TK_REM );
14ba0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14bb0 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29   op==TK_BITAND )
14bc0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14bd0 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29  ( op==TK_BITOR )
14be0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14bf0 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29  ( op==TK_SLASH )
14c00 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14c10 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20  ( op==TK_LSHIFT 
14c20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14c30 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54  e( op==TK_RSHIFT
14c40 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14c50 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41  se( op==TK_CONCA
14c60 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
14c70 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
14c80 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
14c90 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
14ca0 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
14cb0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
14cc0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
14cd0 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
14ce0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71  Free2);.      sq
14cf0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
14d00 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74  v, op, r2, r1, t
14d10 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65  arget);.      te
14d20 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
14d30 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
14d40 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
14d50 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
14d60 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
14d70 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
14d80 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
14d90 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
14da0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14db0 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66  Left );.      if
14dc0 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
14dd0 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20  INTEGER ){.     
14de0 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70     codeInteger(p
14df0 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c  Parse, pLeft, 1,
14e00 20 74 61 72 67 65 74 29 3b 0a 23 69 66 6e 64 65   target);.#ifnde
14e10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
14e20 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
14e30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65     }else if( pLe
14e40 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54  ft->op==TK_FLOAT
14e50 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
14e60 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
14e70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
14e80 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
14e90 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
14ea0 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pLeft->u.zToken,
14eb0 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23 65 6e   1, target);.#en
14ec0 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  dif.      }else{
14ed0 0a 20 20 20 20 20 20 20 20 72 65 67 46 72 65 65  .        regFree
14ee0 31 20 3d 20 72 31 20 3d 20 73 71 6c 69 74 65 33  1 = r1 = sqlite3
14ef0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
14f00 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
14f10 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14f20 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
14f30 72 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20  r1);.        r2 
14f40 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
14f50 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
14f60 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
14f70 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20  Free2);.        
14f80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14f90 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74  3(v, OP_Subtract
14fa0 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74  , r2, r1, target
14fb0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
14fc0 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
14fd0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
14fe0 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74    inReg = target
14ff0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
15000 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
15010 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73  _BITNOT:.    cas
15020 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
15030 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
15040 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29  NOT==OP_BitNot )
15050 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15060 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29  TK_NOT==OP_Not )
15070 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
15080 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20  ( op==TK_BITNOT 
15090 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
150a0 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b  e( op==TK_NOT );
150b0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
150c0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
150d0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
150e0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
150f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
15100 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
15110 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74  .      inReg = t
15120 61 72 67 65 74 3b 0a 20 20 20 20 20 20 73 71 6c  arget;.      sql
15130 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15140 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65 67 29  , op, r1, inReg)
15150 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
15160 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
15170 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
15180 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
15190 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
151a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
151b0 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75  _ISNULL==OP_IsNu
151c0 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ll );.      asse
151d0 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d  rt( TK_NOTNULL==
151e0 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20  OP_NotNull );.  
151f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
15200 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==TK_ISNULL );. 
15210 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
15220 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b  p==TK_NOTNULL );
15230 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15240 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
15250 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
15260 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  t);.      r1 = s
15270 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
15280 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
15290 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
152a0 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e1);.      testc
152b0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
152c0 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d   );.      addr =
152d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
152e0 70 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20  p1(v, op, r1);. 
152f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15300 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
15310 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 2d 31 29  Imm, target, -1)
15320 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
15330 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
15340 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ddr);.      brea
15350 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
15360 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
15370 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e  N: {.      AggIn
15380 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70  fo *pInfo = pExp
15390 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
153a0 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20     if( pInfo==0 
153b0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
153c0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
153d0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
153e0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
153f0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15400 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75  sg(pParse, "misu
15410 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 3a  se of aggregate:
15420 20 25 73 28 29 22 2c 20 70 45 78 70 72 2d 3e 75   %s()", pExpr->u
15430 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
15440 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
15450 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d 3e 61 46  nReg = pInfo->aF
15460 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d  unc[pExpr->iAgg]
15470 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  .iMem;.      }. 
15480 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15490 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
154a0 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61  NST_FUNC:.    ca
154b0 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
154c0 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
154d0 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f   *pFarg;       /
154e0 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69  * List of functi
154f0 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
15500 20 20 20 20 20 20 69 6e 74 20 6e 46 61 72 67 3b        int nFarg;
15510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15520 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e 63 74 69  Number of functi
15530 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
15540 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
15550 44 65 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Def;         /* 
15560 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66  The function def
15570 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a  inition object *
15580 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b  /.      int nId;
15590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
155a0 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  * Length of the 
155b0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 69 6e  function name in
155c0 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20   bytes */.      
155d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b  const char *zId;
155e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75         /* The fu
155f0 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
15600 20 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 4d 61       int constMa
15610 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d  sk = 0;     /* M
15620 61 73 6b 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ask of function 
15630 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74 20 61  arguments that a
15640 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20  re constant */. 
15650 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
15660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
15670 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
15680 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e       u8 enc = EN
15690 43 28 64 62 29 3b 20 20 20 20 20 20 2f 2a 20 54  C(db);      /* T
156a0 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  he text encoding
156b0 20 75 73 65 64 20 62 79 20 74 68 69 73 20 64 61   used by this da
156c0 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  tabase */.      
156d0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
156e0 20 30 3b 20 20 20 20 2f 2a 20 41 20 63 6f 6c 6c   0;    /* A coll
156f0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a  ating sequence *
15700 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  /..      assert(
15710 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
15720 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
15730 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
15740 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
15750 5f 43 4f 4e 53 54 5f 46 55 4e 43 20 29 3b 0a 20  _CONST_FUNC );. 
15760 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
15770 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p==TK_FUNCTION )
15780 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
15790 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
157a0 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
157b0 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ly) ){.        p
157c0 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  Farg = 0;.      
157d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
157e0 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Farg = pExpr->x.
157f0 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pList;.      }. 
15800 20 20 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61       nFarg = pFa
15810 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70  rg ? pFarg->nExp
15820 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73  r : 0;.      ass
15830 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
15840 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
15850 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
15860 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e     zId = pExpr->
15870 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
15880 6e 49 64 20 3d 20 73 71 6c 69 74 65 33 53 74 72  nId = sqlite3Str
15890 6c 65 6e 33 30 28 7a 49 64 29 3b 0a 20 20 20 20  len30(zId);.    
158a0 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
158b0 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
158c0 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 46 61 72 67   zId, nId, nFarg
158d0 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
158e0 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a   if( pDef==0 ){.
158f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
15900 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
15910 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f  "unknown functio
15920 6e 3a 20 25 2e 2a 73 28 29 22 2c 20 6e 49 64 2c  n: %.*s()", nId,
15930 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 62   zId);.        b
15940 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
15950 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20       /* Attempt 
15960 61 20 64 69 72 65 63 74 20 69 6d 70 6c 65 6d 65  a direct impleme
15970 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62  ntation of the b
15980 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53 43 45  uilt-in COALESCE
15990 28 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  () and.      ** 
159a0 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69 6f  IFNULL() functio
159b0 6e 73 2e 20 20 54 68 69 73 20 61 76 6f 69 64 73  ns.  This avoids
159c0 20 75 6e 6e 65 63 65 73 73 61 72 79 20 65 76 61   unnecessary eva
159d0 6c 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20  lation of.      
159e0 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  ** arguments pas
159f0 74 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d  t the first non-
15a00 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20  NULL argument.. 
15a10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
15a20 28 20 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20  ( pDef->flags & 
15a30 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c  SQLITE_FUNC_COAL
15a40 45 53 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20  ESCE ){.        
15a50 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20  int endCoalesce 
15a60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
15a70 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
15a80 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67     assert( nFarg
15a90 3e 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73  >=2 );.        s
15aa0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
15ab0 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
15ac0 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  0].pExpr, target
15ad0 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
15ae0 3d 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b  =1; i<nFarg; i++
15af0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
15b00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15b10 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61  , OP_NotNull, ta
15b20 72 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63  rget, endCoalesc
15b30 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
15b40 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
15b50 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 74 61 72  move(pParse, tar
15b60 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  get, 1);.       
15b70 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
15b80 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
15b90 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
15ba0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
15bb0 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70  e, pFarg->a[i].p
15bc0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
15bd0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15be0 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
15bf0 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  rse, 1);.       
15c00 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
15c10 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
15c20 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63  el(v, endCoalesc
15c30 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
15c40 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20  k;.      }...   
15c50 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a     if( pFarg ){.
15c60 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
15c70 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
15c80 28 70 50 61 72 73 65 2c 20 6e 46 61 72 67 29 3b  (pParse, nFarg);
15c90 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  ..        /* For
15ca0 20 6c 65 6e 67 74 68 28 29 20 61 6e 64 20 74 79   length() and ty
15cb0 70 65 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 73  peof() functions
15cc0 20 77 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61   with a column a
15cd0 72 67 75 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20  rgument,.       
15ce0 20 2a 2a 20 73 65 74 20 74 68 65 20 50 35 20 70   ** set the P5 p
15cf0 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 65 20  arameter to the 
15d00 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65  OP_Column opcode
15d10 20 74 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54   to OPFLAG_LENGT
15d20 48 41 52 47 0a 20 20 20 20 20 20 20 20 2a 2a 20  HARG.        ** 
15d30 6f 72 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  or OPFLAG_TYPEOF
15d40 41 52 47 20 72 65 73 70 65 63 74 69 76 65 6c 79  ARG respectively
15d50 2c 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63  , to avoid unnec
15d60 65 73 73 61 72 79 20 64 61 74 61 0a 20 20 20 20  essary data.    
15d70 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a      ** loading..
15d80 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
15d90 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 6c     if( (pDef->fl
15da0 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46 55  ags & (SQLITE_FU
15db0 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45  NC_LENGTH|SQLITE
15dc0 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d  _FUNC_TYPEOF))!=
15dd0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
15de0 38 20 65 78 70 72 4f 70 3b 0a 20 20 20 20 20 20  8 exprOp;.      
15df0 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72      assert( nFar
15e00 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  g==1 );.        
15e10 20 20 61 73 73 65 72 74 28 20 70 46 61 72 67 2d    assert( pFarg-
15e20 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29  >a[0].pExpr!=0 )
15e30 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 72  ;.          expr
15e40 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d  Op = pFarg->a[0]
15e50 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20  .pExpr->op;.    
15e60 20 20 20 20 20 20 69 66 28 20 65 78 70 72 4f 70        if( exprOp
15e70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65  ==TK_COLUMN || e
15e80 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  xprOp==TK_AGG_CO
15e90 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
15ea0 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49      assert( SQLI
15eb0 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d  TE_FUNC_LENGTH==
15ec0 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
15ed0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
15ee0 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46  assert( SQLITE_F
15ef0 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c  UNC_TYPEOF==OPFL
15f00 41 47 5f 54 59 50 45 4f 46 41 52 47 20 29 3b 0a  AG_TYPEOFARG );.
15f10 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
15f20 63 61 73 65 28 20 70 44 65 66 2d 3e 66 6c 61 67  case( pDef->flag
15f30 73 3d 3d 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c  s==SQLITE_FUNC_L
15f40 45 4e 47 54 48 20 29 3b 0a 20 20 20 20 20 20 20  ENGTH );.       
15f50 20 20 20 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d       pFarg->a[0]
15f60 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 70 44  .pExpr->op2 = pD
15f70 65 66 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20  ef->flags;.     
15f80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
15f90 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
15fa0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
15fb0 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 54  Parse);     /* T
15fc0 69 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34  icket 2ea2425d34
15fd0 62 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  be */.        sq
15fe0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
15ff0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 46  rList(pParse, pF
16000 61 72 67 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20  arg, r1, 1);.   
16010 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
16020 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c  CachePop(pParse,
16030 20 31 29 3b 20 20 20 2f 2a 20 54 69 63 6b 65 74   1);   /* Ticket
16040 20 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f   2ea2425d34be */
16050 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16060 20 20 20 20 20 20 72 31 20 3d 20 30 3b 0a 20 20        r1 = 0;.  
16070 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
16080 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
16090 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20  LTABLE.      /* 
160a0 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61  Possibly overloa
160b0 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  d the function i
160c0 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  f the first argu
160d0 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a  ment is.      **
160e0 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
160f0 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a   column..      *
16100 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69  *.      ** For i
16110 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28  nfix functions (
16120 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45  LIKE, GLOB, REGE
16130 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75  XP, and MATCH) u
16140 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  se the.      ** 
16150 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
16160 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20   not the first, 
16170 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  as the argument 
16180 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20  to test to.     
16190 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
161a0 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76   a column in a v
161b0 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54  irtual table.  T
161c0 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61  his is done beca
161d0 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  use.      ** the
161e0 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66   left operand of
161f0 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
16200 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65   (the operand we
16210 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a   want to.      *
16220 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f  * control overlo
16230 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61  ading) ends up a
16240 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
16250 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20  ument to the.   
16260 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20     ** function. 
16270 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
16280 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71  "A glob B" is eq
16290 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20  uivalent to .   
162a0 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29     ** "glob(B,A)
162b0 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73  .  We want to us
162c0 65 20 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c  e the A in "A gl
162d0 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20  ob B" to test.  
162e0 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74      ** for funct
162f0 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e  ion overloading.
16300 20 20 42 75 74 20 77 65 20 75 73 65 20 74 68 65    But we use the
16310 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62   B term in "glob
16320 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f  (B,A)"..      */
16330 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67  .      if( nFarg
16340 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d 3e 66  >=2 && (pExpr->f
16350 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69 78 46  lags & EP_InfixF
16360 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  unc) ){.        
16370 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74  pDef = sqlite3Vt
16380 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69  abOverloadFuncti
16390 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61  on(db, pDef, nFa
163a0 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e  rg, pFarg->a[1].
163b0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65  pExpr);.      }e
163c0 6c 73 65 20 69 66 28 20 6e 46 61 72 67 3e 30 20  lse if( nFarg>0 
163d0 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
163e0 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65  = sqlite3VtabOve
163f0 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62  rloadFunction(db
16400 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70  , pDef, nFarg, p
16410 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
16420 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
16430 66 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  f.      for(i=0;
16440 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a   i<nFarg; i++){.
16450 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 33 32          if( i<32
16460 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
16470 73 43 6f 6e 73 74 61 6e 74 28 70 46 61 72 67 2d  sConstant(pFarg-
16480 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
16490 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d            constM
164a0 61 73 6b 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20  ask |= (1<<i);. 
164b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
164c0 20 69 66 28 20 28 70 44 65 66 2d 3e 66 6c 61 67   if( (pDef->flag
164d0 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
164e0 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20  NEEDCOLL)!=0 && 
164f0 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
16500 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
16510 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
16520 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
16530 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
16540 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
16550 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 6c 61     if( pDef->fla
16560 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
16570 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20  _NEEDCOLL ){.   
16580 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
16590 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
165a0 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20  fltColl; .      
165b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
165c0 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
165d0 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  q, 0, 0, 0, (cha
165e0 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
165f0 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a  LLSEQ);.      }.
16600 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16610 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75  eAddOp4(v, OP_Fu
16620 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73  nction, constMas
16630 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c 0a 20  k, r1, target,. 
16640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16650 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 44         (char*)pD
16660 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  ef, P4_FUNCDEF);
16670 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16680 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75  beChangeP5(v, (u
16690 38 29 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20  8)nFarg);.      
166a0 69 66 28 20 6e 46 61 72 67 20 29 7b 0a 20 20 20  if( nFarg ){.   
166b0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
166c0 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
166d0 72 73 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b  rse, r1, nFarg);
166e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
166f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
16700 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16710 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
16720 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20  e TK_EXISTS:.   
16730 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
16740 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
16750 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  e( op==TK_EXISTS
16760 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
16770 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  se( op==TK_SELEC
16780 54 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67  T );.      inReg
16790 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75   = sqlite3CodeSu
167a0 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
167b0 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20  pExpr, 0, 0);.  
167c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
167d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
167e0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73   {.      int des
167f0 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74  tIfFalse = sqlit
16800 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
16810 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  v);.      int de
16820 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  stIfNull = sqlit
16830 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
16840 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
16850 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16860 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
16870 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
16880 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
16890 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49  se, pExpr, destI
168a0 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75  fFalse, destIfNu
168b0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
168c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
168d0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
168e0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
168f0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
16900 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46  Label(v, destIfF
16910 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  alse);.      sql
16920 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16930 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72  , OP_AddImm, tar
16940 67 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  get, 0);.      s
16950 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
16960 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
16970 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
16980 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
16990 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
169a0 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20  SUBQUERY */...  
169b0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78    /*.    **    x
169c0 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
169d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
169e0 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e  his is equivalen
169f0 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t to.    **.    
16a00 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78  **    x>=y AND x
16a10 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  <=z.    **.    *
16a20 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * X is stored in
16a30 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20   pExpr->pLeft.. 
16a40 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65     ** Y is store
16a50 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  d in pExpr->pLis
16a60 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20  t->a[0].pExpr.. 
16a70 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65     ** Z is store
16a80 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  d in pExpr->pLis
16a90 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20  t->a[1].pExpr.. 
16aa0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
16ab0 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
16ac0 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
16ad0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
16ae0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
16af0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65  List_item *pLIte
16b00 6d 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  m = pExpr->x.pLi
16b10 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78 70  st->a;.      Exp
16b20 72 20 2a 70 52 69 67 68 74 20 3d 20 70 4c 49 74  r *pRight = pLIt
16b30 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20  em->pExpr;..    
16b40 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
16b50 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
16b60 65 2c 20 70 4c 65 66 74 2c 20 26 72 65 67 46 72  e, pLeft, &regFr
16b70 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
16b80 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16b90 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69  Temp(pParse, pRi
16ba0 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
16bb0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16bc0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
16bd0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16be0 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
16bf0 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65       r3 = sqlite
16c00 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
16c10 73 65 29 3b 0a 20 20 20 20 20 20 72 34 20 3d 20  se);.      r4 = 
16c20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
16c30 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
16c40 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
16c50 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
16c60 68 74 2c 20 4f 50 5f 47 65 2c 0a 20 20 20 20 20  ht, OP_Ge,.     
16c70 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
16c80 20 72 32 2c 20 72 33 2c 20 53 51 4c 49 54 45 5f   r2, r3, SQLITE_
16c90 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20  STOREP2);.      
16ca0 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  pLItem++;.      
16cb0 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d  pRight = pLItem-
16cc0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >pExpr;.      sq
16cd0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
16ce0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
16cf0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 72 32 20  ree2);.      r2 
16d00 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
16d10 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52  eTemp(pParse, pR
16d20 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
16d30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
16d40 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
16d50 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
16d60 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
16d70 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c  , pRight, OP_Le,
16d80 20 72 31 2c 20 72 32 2c 20 72 34 2c 20 53 51 4c   r1, r2, r4, SQL
16d90 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20  ITE_STOREP2);.  
16da0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16db0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 6e 64 2c  ddOp3(v, OP_And,
16dc0 20 72 33 2c 20 72 34 2c 20 74 61 72 67 65 74 29   r3, r4, target)
16dd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
16de0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
16df0 61 72 73 65 2c 20 72 33 29 3b 0a 20 20 20 20 20  arse, r3);.     
16e00 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
16e10 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
16e20 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
16e30 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
16e40 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20  TK_UPLUS: {.    
16e50 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
16e60 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
16e70 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
16e80 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  Left, target);. 
16e90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16ea0 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54  }..    case TK_T
16eb0 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  RIGGER: {.      
16ec0 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65  /* If the opcode
16ed0 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20   is TK_TRIGGER, 
16ee0 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
16ef0 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e  ion is a referen
16f00 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  ce.      ** to a
16f10 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e   column in the n
16f20 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73  ew.* or old.* ps
16f30 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69  eudo-tables avai
16f40 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a  lable to.      *
16f50 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  * trigger progra
16f60 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ms. In this case
16f70 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20   Expr.iTable is 
16f80 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65  set to 1 for the
16f90 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20  .      ** new.* 
16fa0 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72  pseudo-table, or
16fb0 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a   0 for the old.*
16fc0 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45   pseudo-table. E
16fd0 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20  xpr.iColumn.    
16fe0 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74    ** is set to t
16ff0 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  he column of the
17000 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f   pseudo-table to
17010 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20   read, or to -1 
17020 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64  to.      ** read
17030 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64   the rowid field
17040 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
17050 20 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   ** The expressi
17060 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
17070 64 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61  d using an OP_Pa
17080 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65 20  ram opcode. The 
17090 70 31 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 61  p1.      ** para
170a0 6d 65 74 65 72 20 69 73 20 73 65 74 20 74 6f 20  meter is set to 
170b0 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77  0 for an old.row
170c0 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 6f 72  id reference, or
170d0 20 74 6f 20 28 69 2b 31 29 0a 20 20 20 20 20 20   to (i+1).      
170e0 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e 63 65 20  ** to reference 
170f0 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f  another column o
17100 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75  f the old.* pseu
17110 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72 65 20  do-table, where 
17120 0a 20 20 20 20 20 20 2a 2a 20 69 20 69 73 20 74  .      ** i is t
17130 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
17140 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65  column. For a ne
17150 77 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63  w.rowid referenc
17160 65 2c 20 70 31 20 69 73 0a 20 20 20 20 20 20 2a  e, p1 is.      *
17170 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20  * set to (n+1), 
17180 77 68 65 72 65 20 6e 20 69 73 20 74 68 65 20 6e  where n is the n
17190 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
171a0 20 69 6e 20 65 61 63 68 20 70 73 65 75 64 6f 2d   in each pseudo-
171b0 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20  table..      ** 
171c0 46 6f 72 20 61 20 72 65 66 65 72 65 6e 63 65 20  For a reference 
171d0 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c  to any other col
171e0 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a  umn in the new.*
171f0 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70   pseudo-table, p
17200 31 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65  1.      ** is se
17210 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68  t to (n+2+i), wh
17220 65 72 65 20 6e 20 61 6e 64 20 69 20 61 72 65 20  ere n and i are 
17230 61 73 20 64 65 66 69 6e 65 64 20 70 72 65 76 69  as defined previ
17240 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20  ously. For.     
17250 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20   ** example, if 
17260 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 77 68 69  the table on whi
17270 63 68 20 74 72 69 67 67 65 72 73 20 61 72 65 20  ch triggers are 
17280 62 65 69 6e 67 20 66 69 72 65 64 20 69 73 0a 20  being fired is. 
17290 20 20 20 20 20 2a 2a 20 64 65 63 6c 61 72 65 64       ** declared
172a0 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20   as:.      **.  
172b0 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
172c0 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
172d0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
172e0 2a 20 54 68 65 6e 20 70 31 20 69 73 20 69 6e 74  * Then p1 is int
172f0 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c  erpreted as foll
17300 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ows:.      **.  
17310 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20      **   p1==0  
17320 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64   ->    old.rowid
17330 20 20 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20       p1==3   -> 
17340 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20     new.rowid.   
17350 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20     **   p1==1   
17360 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20 20 20  ->    old.a     
17370 20 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20      p1==4   ->  
17380 20 20 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a    new.a.      **
17390 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20     p1==2   ->   
173a0 20 6f 6c 64 2e 62 20 20 20 20 20 20 20 20 20 70   old.b         p
173b0 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==5   ->    new
173c0 2e 62 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .b       .      
173d0 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
173e0 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
173f0 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 31  ab;.      int p1
17400 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
17410 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31   * (pTab->nCol+1
17420 29 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e 69  ) + 1 + pExpr->i
17430 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61  Column;..      a
17440 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54  ssert( pExpr->iT
17450 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72  able==0 || pExpr
17460 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  ->iTable==1 );. 
17470 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
17480 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20  pr->iColumn>=-1 
17490 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
174a0 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  n<pTab->nCol );.
174b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
174c0 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70  ab->iPKey<0 || p
174d0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  Expr->iColumn!=p
174e0 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20  Tab->iPKey );.  
174f0 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d      assert( p1>=
17500 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e  0 && p1<(pTab->n
17510 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20  Col*2+2) );..   
17520 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17530 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d  dOp2(v, OP_Param
17540 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  , p1, target);. 
17550 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
17560 28 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e 20 24  ((v, "%s.%s -> $
17570 25 64 22 2c 0a 20 20 20 20 20 20 20 20 28 70 45  %d",.        (pE
17580 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e  xpr->iTable ? "n
17590 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20  ew" : "old"),.  
175a0 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 43        (pExpr->iC
175b0 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64  olumn<0 ? "rowid
175c0 22 20 3a 20 70 45 78 70 72 2d 3e 70 54 61 62 2d  " : pExpr->pTab-
175d0 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f  >aCol[pExpr->iCo
175e0 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20  lumn].zName),.  
175f0 20 20 20 20 20 20 74 61 72 67 65 74 0a 20 20 20        target.   
17600 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20     ));..#ifndef 
17610 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
17620 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20  TING_POINT.     
17630 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
17640 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66 69 6e  n has REAL affin
17650 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75 72 72  ity, it may curr
17660 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20  ently be stored 
17670 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69  as an.      ** i
17680 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50 5f 52  nteger. Use OP_R
17690 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f 20 6d  ealAffinity to m
176a0 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 72  ake sure it is r
176b0 65 61 6c 6c 79 20 72 65 61 6c 2e 20 20 2a 2f 0a  eally real.  */.
176c0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
176d0 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20  >iColumn>=0 .   
176e0 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43 6f      && pTab->aCo
176f0 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  l[pExpr->iColumn
17700 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ].affinity==SQLI
17710 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20 20  TE_AFF_REAL.    
17720 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
17730 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
17740 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74  , OP_RealAffinit
17750 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  y, target);.    
17760 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
17770 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a   break;.    }...
17780 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f      /*.    ** Fo
17790 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43  rm A:.    **   C
177a0 41 53 45 20 78 20 57 48 45 4e 20 65 31 20 54 48  ASE x WHEN e1 TH
177b0 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48  EN r1 WHEN e2 TH
177c0 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65  EN r2 ... WHEN e
177d0 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
177e0 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
177f0 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a  ** Form B:.    *
17800 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 65 31  *   CASE WHEN e1
17810 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32   THEN r1 WHEN e2
17820 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45   THEN r2 ... WHE
17830 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  N eN THEN rN ELS
17840 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
17850 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20     ** Form A is 
17860 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72 6d  can be transform
17870 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75 69  ed into the equi
17880 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61 73  valent form B as
17890 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a   follows:.    **
178a0 20 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d 65     CASE WHEN x=e
178b0 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 78  1 THEN r1 WHEN x
178c0 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a  =e2 THEN r2 ....
178d0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57 48      **        WH
178e0 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20  EN x=eN THEN rN 
178f0 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
17900 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20 69  *.    ** X (if i
17910 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 20  t exists) is in 
17920 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20  pExpr->pLeft..  
17930 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 70 45 78    ** Y is in pEx
17940 70 72 2d 3e 70 52 69 67 68 74 2e 20 20 54 68 65  pr->pRight.  The
17950 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f   Y is also optio
17960 6e 61 6c 2e 20 20 49 66 20 74 68 65 72 65 20 69  nal.  If there i
17970 73 20 6e 6f 0a 20 20 20 20 2a 2a 20 45 4c 53 45  s no.    ** ELSE
17980 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 20 6f   clause and no o
17990 74 68 65 72 20 74 65 72 6d 20 6d 61 74 63 68 65  ther term matche
179a0 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  s, then the resu
179b0 6c 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  lt of the.    **
179c0 20 65 78 70 72 73 73 69 6f 6e 20 69 73 20 4e 55   exprssion is NU
179d0 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69 73  LL..    ** Ei is
179e0 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
179f0 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20  ->a[i*2] and Ri 
17a00 69 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  is pExpr->pList-
17a10 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a  >a[i*2+1]..    *
17a20 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73  *.    ** The res
17a30 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72 65  ult of the expre
17a40 73 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69 20  ssion is the Ri 
17a50 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d 61  for the first ma
17a60 74 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a  tching Ei,.    *
17a70 2a 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73  * or if there is
17a80 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69 2c   no matching Ei,
17a90 20 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20 59   the ELSE term Y
17aa0 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73  , or if there is
17ab0 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20  .    ** no ELSE 
17ac0 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20  term, NULL..    
17ad0 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  */.    default: 
17ae0 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43  assert( op==TK_C
17af0 41 53 45 20 29 3b 20 7b 0a 20 20 20 20 20 20 69  ASE ); {.      i
17b00 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20  nt endLabel;    
17b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66   /* GOTO label f
17b30 6f 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73  or end of CASE s
17b40 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tmt */.      int
17b50 20 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20 20   nextCase;      
17b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17b70 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72  * GOTO label for
17b80 20 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73   next WHEN claus
17b90 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  e */.      int n
17ba0 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
17bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17bc0 32 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45  2x number of WHE
17bd0 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
17be0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
17bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c00 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
17c10 65 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  er */.      Expr
17c20 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
17c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17c40 20 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65   List of WHEN te
17c50 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72  rms */.      str
17c60 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
17c70 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f  m *aListelem;  /
17c80 2a 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20  * Array of WHEN 
17c90 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45  terms */.      E
17ca0 78 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20  xpr opCompare;  
17cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cc0 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78   /* The X==Ei ex
17cd0 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
17ce0 20 20 45 78 70 72 20 63 61 63 68 65 58 3b 20 20    Expr cacheX;  
17cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d00 20 20 20 20 2f 2a 20 43 61 63 68 65 64 20 65 78      /* Cached ex
17d10 70 72 65 73 73 69 6f 6e 20 58 20 2a 2f 0a 20 20  pression X */.  
17d20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20      Expr *pX;   
17d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65        /* The X e
17d50 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
17d60 20 20 20 45 78 70 72 20 2a 70 54 65 73 74 20 3d     Expr *pTest =
17d70 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
17d80 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66       /* X==Ei (f
17d90 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45  orm A) or just E
17da0 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20  i (form B) */.  
17db0 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e      VVA_ONLY( in
17dc0 74 20 69 43 61 63 68 65 4c 65 76 65 6c 20 3d 20  t iCacheLevel = 
17dd0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
17de0 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61 73  vel; )..      as
17df0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
17e00 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
17e10 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26 20 70  _xIsSelect) && p
17e20 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b  Expr->x.pList );
17e30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 28 70  .      assert((p
17e40 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
17e50 45 78 70 72 20 25 20 32 29 20 3d 3d 20 30 29 3b  Expr % 2) == 0);
17e60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45  .      assert(pE
17e70 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
17e80 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20  xpr > 0);.      
17e90 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
17ea0 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61  x.pList;.      a
17eb0 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73  Listelem = pELis
17ec0 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70  t->a;.      nExp
17ed0 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  r = pEList->nExp
17ee0 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65  r;.      endLabe
17ef0 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
17f00 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
17f10 20 20 20 69 66 28 20 28 70 58 20 3d 20 70 45 78     if( (pX = pEx
17f20 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b  pr->pLeft)!=0 ){
17f30 0a 20 20 20 20 20 20 20 20 63 61 63 68 65 58 20  .        cacheX 
17f40 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74  = *pX;.        t
17f50 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d  estcase( pX->op=
17f60 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
17f70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17f80 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  pX->op==TK_REGIS
17f90 54 45 52 20 29 3b 0a 20 20 20 20 20 20 20 20 63  TER );.        c
17fa0 61 63 68 65 58 2e 69 54 61 62 6c 65 20 3d 20 73  acheX.iTable = s
17fb0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
17fc0 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2c 20 26  mp(pParse, pX, &
17fd0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
17fe0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
17ff0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
18000 20 20 20 20 63 61 63 68 65 58 2e 6f 70 20 3d 20      cacheX.op = 
18010 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20  TK_REGISTER;.   
18020 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f       opCompare.o
18030 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20  p = TK_EQ;.     
18040 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65     opCompare.pLe
18050 66 74 20 3d 20 26 63 61 63 68 65 58 3b 0a 20 20  ft = &cacheX;.  
18060 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f        pTest = &o
18070 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20  pCompare;.      
18080 20 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35 31    /* Ticket b351
18090 64 39 35 66 39 63 64 35 65 66 31 37 65 39 64 39  d95f9cd5ef17e9d9
180a0 64 62 61 65 31 38 66 35 63 61 38 36 31 31 31 39  dbae18f5ca861119
180b0 30 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a  0001:.        **
180c0 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   The value in re
180d0 67 46 72 65 65 31 20 6d 69 67 68 74 20 67 65 74  gFree1 might get
180e0 20 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74   SCopy-ed into t
180f0 68 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a  he file result..
18100 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61          ** So ma
18110 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
18120 20 72 65 67 46 72 65 65 31 20 72 65 67 69 73 74   regFree1 regist
18130 65 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65 64  er is not reused
18140 20 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20 20   for other.     
18150 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20 61     ** purposes a
18160 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65 72  nd possibly over
18170 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20  written.  */.   
18180 20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20       regFree1 = 
18190 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
181a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
181b0 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20  r; i=i+2){.     
181c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
181d0 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
181e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 58 20  .        if( pX 
181f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
18200 65 72 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b  ert( pTest!=0 );
18210 0a 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  .          opCom
18220 70 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c  pare.pRight = aL
18230 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72  istelem[i].pExpr
18240 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
18250 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 73 74  .          pTest
18260 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e   = aListelem[i].
18270 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d  pExpr;.        }
18280 0a 20 20 20 20 20 20 20 20 6e 65 78 74 43 61 73  .        nextCas
18290 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
182a0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
182b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
182c0 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Test->op==TK_COL
182d0 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73  UMN );.        s
182e0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
182f0 65 28 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c  e(pParse, pTest,
18300 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54   nextCase, SQLIT
18310 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
18320 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
18330 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
18340 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
18350 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
18360 74 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65  testcase( aListe
18370 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e  lem[i+1].pExpr->
18380 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
18390 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
183a0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
183b0 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31  e, aListelem[i+1
183c0 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
183d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
183e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
183f0 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 4c 61  P_Goto, 0, endLa
18400 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  bel);.        sq
18410 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
18420 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20  p(pParse, 1);.  
18430 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18440 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
18450 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20   nextCase);.    
18460 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
18470 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
18480 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
18490 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
184a0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
184b0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
184c0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
184d0 68 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ht, target);.   
184e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
184f0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c  CachePop(pParse,
18500 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   1);.      }else
18510 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
18520 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18530 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
18540 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
18550 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
18560 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
18570 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20  arse->nErr>0 .  
18580 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
18590 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d  se->iCacheLevel=
185a0 3d 69 43 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a  =iCacheLevel );.
185b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
185c0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
185d0 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20   endLabel);.    
185e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
185f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18600 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63  IT_TRIGGER.    c
18610 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a  ase TK_RAISE: {.
18620 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
18630 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
18640 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20  E_Rollback .    
18650 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
18660 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62  >affinity==OE_Ab
18670 6f 72 74 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ort.           |
18680 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  | pExpr->affinit
18690 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20  y==OE_Fail.     
186a0 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
186b0 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e  affinity==OE_Ign
186c0 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ore.      );.   
186d0 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e     if( !pParse->
186e0 70 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20  pTriggerTab ){. 
186f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
18700 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
18710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18720 20 20 20 20 20 20 22 52 41 49 53 45 28 29 20 6d        "RAISE() m
18730 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  ay only be used 
18740 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72  within a trigger
18750 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20  -program");.    
18760 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
18770 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
18780 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
18790 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
187a0 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41       sqlite3MayA
187b0 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20  bort(pParse);.  
187c0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
187d0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
187e0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
187f0 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
18800 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66    if( pExpr->aff
18810 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65  inity==OE_Ignore
18820 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
18830 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20  te3VdbeAddOp4(. 
18840 20 20 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50             v, OP
18850 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b  _Halt, SQLITE_OK
18860 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20  , OE_Ignore, 0, 
18870 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
18880 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0);.      }else{
18890 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
188a0 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70  HaltConstraint(p
188b0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 61 66  Parse, pExpr->af
188c0 66 69 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e 75  finity, pExpr->u
188d0 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20  .zToken, 0);.   
188e0 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72 65 61     }..      brea
188f0 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
18900 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
18910 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
18920 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
18930 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
18940 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
18950 65 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74 75  egFree2);.  retu
18960 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a  rn inReg;.}../*.
18970 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
18980 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20   to evaluate an 
18990 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73  expression and s
189a0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
189b0 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73  .** into a regis
189c0 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ter.  Return the
189d0 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
189e0 20 77 68 65 72 65 20 74 68 65 20 72 65 73 75 6c   where the resul
189f0 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64  ts.** are stored
18a00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
18a10 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d  egister is a tem
18a20 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
18a30 74 68 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c  that can be deal
18a40 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e  located,.** then
18a50 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65   write its numbe
18a60 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49  r into *pReg.  I
18a70 66 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 67  f the result reg
18a80 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20  ister is not.** 
18a90 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65  a temporary, the
18aa0 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a  n set *pReg to z
18ab0 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ero..*/.int sqli
18ac0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
18ad0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
18ae0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
18af0 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 31  *pReg){.  int r1
18b00 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
18b10 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
18b20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
18b30 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
18b40 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31  Parse, pExpr, r1
18b50 29 3b 0a 20 20 69 66 28 20 72 32 3d 3d 72 31 20  );.  if( r2==r1 
18b60 29 7b 0a 20 20 20 20 2a 70 52 65 67 20 3d 20 72  ){.    *pReg = r
18b70 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
18b80 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
18b90 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
18ba0 29 3b 0a 20 20 20 20 2a 70 52 65 67 20 3d 20 30  );.    *pReg = 0
18bb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
18bc0 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  2;.}../*.** Gene
18bd0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
18be0 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70  ill evaluate exp
18bf0 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e  ression pExpr an
18c00 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72  d store the.** r
18c10 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
18c20 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  er target.  The 
18c30 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72  results are guar
18c40 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72  anteed to appear
18c50 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20  .** in register 
18c60 74 61 72 67 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73  target..*/.int s
18c70 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50  qlite3ExprCode(P
18c80 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
18c90 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
18ca0 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e  arget){.  int in
18cb0 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Reg;..  assert( 
18cc0 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67  target>0 && targ
18cd0 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  et<=pParse->nMem
18ce0 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20   );.  if( pExpr 
18cf0 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  && pExpr->op==TK
18d00 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20  _REGISTER ){.   
18d10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18d20 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
18d30 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70 72  , OP_Copy, pExpr
18d40 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74  ->iTable, target
18d50 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
18d60 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
18d70 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
18d80 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
18d90 67 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74  get);.    assert
18da0 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  ( pParse->pVdbe 
18db0 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
18dc0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
18dd0 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61     if( inReg!=ta
18de0 72 67 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e  rget && pParse->
18df0 70 56 64 62 65 20 29 7b 0a 20 20 20 20 20 20 73  pVdbe ){.      s
18e00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18e10 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
18e20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c  OP_SCopy, inReg,
18e30 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a   target);.    }.
18e40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 74 61 72    }.  return tar
18e50 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  get;.}../*.** Ge
18e60 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
18e70 20 65 76 61 6c 75 74 65 73 20 74 68 65 20 67 69   evalutes the gi
18e80 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ven expression a
18e90 6e 64 20 70 75 74 73 20 74 68 65 20 72 65 73 75  nd puts the resu
18ea0 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  lt.** in registe
18eb0 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20  r target..**.** 
18ec0 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79  Also make a copy
18ed0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
18ee0 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20  on results into 
18ef0 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22 20  another "cache" 
18f00 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20  register.** and 
18f10 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70 72 65  modify the expre
18f20 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68  ssion so that th
18f30 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69  e next time it i
18f40 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20  s evaluated,.** 
18f50 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20  the result is a 
18f60 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63 68  copy of the cach
18f70 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a  e register..**.*
18f80 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
18f90 73 20 75 73 65 64 20 66 6f 72 20 65 78 70 72 65  s used for expre
18fa0 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ssions that are 
18fb0 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a  used multiple .*
18fc0 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61  * times.  They a
18fd0 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63  re evaluated onc
18fe0 65 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74  e and the result
18ff0 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  s of the express
19000 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65  ion.** are reuse
19010 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
19020 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68  3ExprCodeAndCach
19030 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
19040 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
19050 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62  t target){.  Vdb
19060 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
19070 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 6e 52 65  Vdbe;.  int inRe
19080 67 3b 0a 20 20 69 6e 52 65 67 20 3d 20 73 71 6c  g;.  inReg = sql
19090 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
190a0 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
190b0 65 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  et);.  assert( t
190c0 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 2f 2a 20  arget>0 );.  /* 
190d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
190e0 63 61 6c 6c 65 64 20 66 6f 72 20 74 65 72 6d 73  called for terms
190f0 20 74 6f 20 49 4e 53 45 52 54 20 6f 72 20 55 50   to INSERT or UP
19100 44 41 54 45 2e 20 20 41 6e 64 20 74 68 65 20 6f  DATE.  And the o
19110 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72 20 70  nly.  ** other p
19120 6c 61 63 65 20 77 68 65 72 65 20 65 78 70 72 65  lace where expre
19130 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 63 6f  ssions can be co
19140 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f  nverted into TK_
19150 52 45 47 49 53 54 45 52 20 69 73 0a 20 20 2a 2a  REGISTER is.  **
19160 20 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65   in WHERE clause
19170 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f   processing.  So
19180 20 61 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6d   as currently im
19190 70 6c 65 6d 65 6e 74 65 64 2c 20 74 68 65 72 65  plemented, there
191a0 20 69 73 0a 20 20 2a 2a 20 6e 6f 20 77 61 79 20   is.  ** no way 
191b0 66 6f 72 20 61 20 54 4b 5f 52 45 47 49 53 54 45  for a TK_REGISTE
191c0 52 20 74 6f 20 65 78 69 73 74 20 68 65 72 65 2e  R to exist here.
191d0 20 20 42 75 74 20 69 74 20 73 65 65 6d 73 20 70    But it seems p
191e0 72 75 64 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6b  rudent to.  ** k
191f0 65 65 70 20 74 68 65 20 41 4c 57 41 59 53 28 29  eep the ALWAYS()
19200 20 69 6e 20 63 61 73 65 20 74 68 65 20 63 6f 6e   in case the con
19210 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 63 68  ditions above ch
19220 61 6e 67 65 20 77 69 74 68 20 66 75 74 75 72 65  ange with future
19230 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69  .  ** modificati
19240 6f 6e 73 20 6f 72 20 65 6e 68 61 6e 63 65 6d 65  ons or enhanceme
19250 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 28 20 41 4c  nts. */.  if( AL
19260 57 41 59 53 28 70 45 78 70 72 2d 3e 6f 70 21 3d  WAYS(pExpr->op!=
19270 54 4b 5f 52 45 47 49 53 54 45 52 29 20 29 7b 20  TK_REGISTER) ){ 
19280 20 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 3b 0a   .    int iMem;.
19290 20 20 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61      iMem = ++pPa
192a0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
192b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
192c0 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 69 6e 52  (v, OP_Copy, inR
192d0 65 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 70  eg, iMem);.    p
192e0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Expr->iTable = i
192f0 4d 65 6d 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  Mem;.    pExpr->
19300 6f 70 32 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b  op2 = pExpr->op;
19310 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  .    pExpr->op =
19320 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20   TK_REGISTER;.  
19330 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67  }.  return inReg
19340 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
19350 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54  (SQLITE_ENABLE_T
19360 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a  REE_EXPLAIN)./*.
19370 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68 75  ** Generate a hu
19380 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 78 70  man-readable exp
19390 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65  lanation of an e
193a0 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a  xpression tree..
193b0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
193c0 78 70 6c 61 69 6e 45 78 70 72 28 56 64 62 65 20  xplainExpr(Vdbe 
193d0 2a 70 4f 75 74 2c 20 45 78 70 72 20 2a 70 45 78  *pOut, Expr *pEx
193e0 70 72 29 7b 0a 20 20 69 6e 74 20 6f 70 3b 20 20  pr){.  int op;  
193f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19400 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62   /* The opcode b
19410 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
19420 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 69 6e  const char *zBin
19430 4f 70 20 3d 20 30 3b 20 20 20 2f 2a 20 42 69 6e  Op = 0;   /* Bin
19440 61 72 79 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  ary operator */.
19450 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
19460 6e 69 4f 70 20 3d 20 30 3b 20 20 20 2f 2a 20 55  niOp = 0;   /* U
19470 6e 61 72 79 20 6f 70 65 72 61 74 6f 72 20 2a 2f  nary operator */
19480 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
19490 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e  ){.    op = TK_N
194a0 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ULL;.  }else{.  
194b0 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70    op = pExpr->op
194c0 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
194d0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
194e0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  K_AGG_COLUMN: {.
194f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
19500 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
19510 20 22 41 47 47 7b 25 64 3a 25 64 7d 22 2c 0a 20   "AGG{%d:%d}",. 
19520 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
19530 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72 2d  ->iTable, pExpr-
19540 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
19550 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
19560 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
19570 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
19580 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b  xpr->iTable<0 ){
19590 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
195a0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68   only happens wh
195b0 65 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b 20  en coding check 
195c0 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
195d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
195e0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
195f0 2c 20 22 43 4f 4c 55 4d 4e 28 25 64 29 22 2c 20  , "COLUMN(%d)", 
19600 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
19610 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
19620 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
19630 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
19640 20 22 7b 25 64 3a 25 64 7d 22 2c 0a 20 20 20 20   "{%d:%d}",.    
19650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19660 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
19670 69 54 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69  iTable, pExpr->i
19680 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d  Column);.      }
19690 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
196a0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
196b0 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
196c0 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
196d0 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  s & EP_IntValue 
196e0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
196f0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
19700 70 4f 75 74 2c 20 22 25 64 22 2c 20 70 45 78 70  pOut, "%d", pExp
19710 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b 0a 20 20  r->u.iValue);.  
19720 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19730 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
19740 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25  nPrintf(pOut, "%
19750 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  s", pExpr->u.zTo
19760 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ken);.      }.  
19770 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19780 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19790 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
197a0 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  INT.    case TK_
197b0 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 73  FLOAT: {.      s
197c0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
197d0 6e 74 66 28 70 4f 75 74 2c 22 25 73 22 2c 20 70  ntf(pOut,"%s", p
197e0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
197f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19800 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
19810 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
19820 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
19830 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
19840 2c 22 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e  ,"%Q", pExpr->u.
19850 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62  zToken);.      b
19860 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
19870 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a  case TK_NULL: {.
19880 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
19890 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
198a0 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 62  "NULL");.      b
198b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
198c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
198d0 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20  BLOB_LITERAL.   
198e0 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b   case TK_BLOB: {
198f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
19900 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
19910 2c 22 25 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e  ,"%s", pExpr->u.
19920 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62  zToken);.      b
19930 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
19940 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56  if.    case TK_V
19950 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20  ARIABLE: {.     
19960 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
19970 72 69 6e 74 66 28 70 4f 75 74 2c 22 56 41 52 49  rintf(pOut,"VARI
19980 41 42 4c 45 28 25 73 2c 25 64 29 22 2c 0a 20 20  ABLE(%s,%d)",.  
19990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199a0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
199b0 75 2e 7a 54 6f 6b 65 6e 2c 20 70 45 78 70 72 2d  u.zToken, pExpr-
199c0 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
199d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
199e0 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54    case TK_REGIST
199f0 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ER: {.      sqli
19a00 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
19a10 28 70 4f 75 74 2c 22 52 45 47 49 53 54 45 52 28  (pOut,"REGISTER(
19a20 25 64 29 22 2c 20 70 45 78 70 72 2d 3e 69 54 61  %d)", pExpr->iTa
19a30 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ble);.      brea
19a40 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
19a50 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20  e TK_AS: {.     
19a60 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
19a70 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d  xpr(pOut, pExpr-
19a80 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 62  >pLeft);.      b
19a90 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
19aa0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19ab0 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b  CAST.    case TK
19ac0 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f  _CAST: {.      /
19ad0 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  * Expressions of
19ae0 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53   the form:   CAS
19af0 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e  T(pLeft AS token
19b00 29 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74  ) */.      const
19b10 20 63 68 61 72 20 2a 7a 41 66 66 20 3d 20 22 75   char *zAff = "u
19b20 6e 6b 22 3b 0a 20 20 20 20 20 20 73 77 69 74 63  nk";.      switc
19b30 68 28 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69  h( sqlite3Affini
19b40 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e  tyType(pExpr->u.
19b50 7a 54 6f 6b 65 6e 29 20 29 7b 0a 20 20 20 20 20  zToken) ){.     
19b60 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
19b70 46 46 5f 54 45 58 54 3a 20 20 20 20 7a 41 66 66  FF_TEXT:    zAff
19b80 20 3d 20 22 54 45 58 54 22 3b 20 20 20 20 20 62   = "TEXT";     b
19b90 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
19ba0 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  se SQLITE_AFF_NO
19bb0 4e 45 3a 20 20 20 20 7a 41 66 66 20 3d 20 22 4e  NE:    zAff = "N
19bc0 4f 4e 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  ONE";     break;
19bd0 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
19be0 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
19bf0 3a 20 7a 41 66 66 20 3d 20 22 4e 55 4d 45 52 49  : zAff = "NUMERI
19c00 43 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  C";  break;.    
19c10 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
19c20 41 46 46 5f 49 4e 54 45 47 45 52 3a 20 7a 41 66  AFF_INTEGER: zAf
19c30 66 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 20 20  f = "INTEGER";  
19c40 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
19c50 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  ase SQLITE_AFF_R
19c60 45 41 4c 3a 20 20 20 20 7a 41 66 66 20 3d 20 22  EAL:    zAff = "
19c70 52 45 41 4c 22 3b 20 20 20 20 20 62 72 65 61 6b  REAL";     break
19c80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19c90 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
19ca0 69 6e 74 66 28 70 4f 75 74 2c 20 22 43 41 53 54  intf(pOut, "CAST
19cb0 2d 25 73 28 22 2c 20 7a 41 66 66 29 3b 0a 20 20  -%s(", zAff);.  
19cc0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
19cd0 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78  inExpr(pOut, pEx
19ce0 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
19cf0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
19d00 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22  Printf(pOut, ")"
19d10 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
19d20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
19d30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
19d40 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
19d50 4c 54 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20  LT:      zBinOp 
19d60 3d 20 22 4c 54 22 3b 20 20 20 20 20 62 72 65 61  = "LT";     brea
19d70 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  k;.    case TK_L
19d80 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d  E:      zBinOp =
19d90 20 22 4c 45 22 3b 20 20 20 20 20 62 72 65 61 6b   "LE";     break
19da0 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  ;.    case TK_GT
19db0 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  :      zBinOp = 
19dc0 22 47 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  "GT";     break;
19dd0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
19de0 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22        zBinOp = "
19df0 47 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  GE";     break;.
19e00 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20      case TK_NE: 
19e10 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4e       zBinOp = "N
19e20 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  E";     break;. 
19e30 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20     case TK_EQ:  
19e40 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 45 51      zBinOp = "EQ
19e50 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
19e60 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 20 20 20    case TK_IS:   
19e70 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 49 53 22     zBinOp = "IS"
19e80 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
19e90 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20   case TK_ISNOT: 
19ea0 20 20 7a 42 69 6e 4f 70 20 3d 20 22 49 53 4e 4f    zBinOp = "ISNO
19eb0 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  T";  break;.    
19ec0 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20  case TK_AND:    
19ed0 20 7a 42 69 6e 4f 70 20 3d 20 22 41 4e 44 22 3b   zBinOp = "AND";
19ee0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
19ef0 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20  ase TK_OR:      
19f00 7a 42 69 6e 4f 70 20 3d 20 22 4f 52 22 3b 20 20  zBinOp = "OR";  
19f10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
19f20 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20 20 7a  se TK_PLUS:    z
19f30 42 69 6e 4f 70 20 3d 20 22 41 44 44 22 3b 20 20  BinOp = "ADD";  
19f40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
19f50 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 7a 42  e TK_STAR:    zB
19f60 69 6e 4f 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20  inOp = "MUL";   
19f70 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
19f80 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a 42 69   TK_MINUS:   zBi
19f90 6e 4f 70 20 3d 20 22 53 55 42 22 3b 20 20 20 20  nOp = "SUB";    
19fa0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
19fb0 54 4b 5f 52 45 4d 3a 20 20 20 20 20 7a 42 69 6e  TK_REM:     zBin
19fc0 4f 70 20 3d 20 22 52 45 4d 22 3b 20 20 20 20 62  Op = "REM";    b
19fd0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
19fe0 4b 5f 42 49 54 41 4e 44 3a 20 20 7a 42 69 6e 4f  K_BITAND:  zBinO
19ff0 70 20 3d 20 22 42 49 54 41 4e 44 22 3b 20 62 72  p = "BITAND"; br
1a000 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1a010 5f 42 49 54 4f 52 3a 20 20 20 7a 42 69 6e 4f 70  _BITOR:   zBinOp
1a020 20 3d 20 22 42 49 54 4f 52 22 3b 20 20 62 72 65   = "BITOR";  bre
1a030 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1a040 53 4c 41 53 48 3a 20 20 20 7a 42 69 6e 4f 70 20  SLASH:   zBinOp 
1a050 3d 20 22 44 49 56 22 3b 20 20 20 20 62 72 65 61  = "DIV";    brea
1a060 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  k;.    case TK_L
1a070 53 48 49 46 54 3a 20 20 7a 42 69 6e 4f 70 20 3d  SHIFT:  zBinOp =
1a080 20 22 4c 53 48 49 46 54 22 3b 20 62 72 65 61 6b   "LSHIFT"; break
1a090 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53  ;.    case TK_RS
1a0a0 48 49 46 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20  HIFT:  zBinOp = 
1a0b0 22 52 53 48 49 46 54 22 3b 20 62 72 65 61 6b 3b  "RSHIFT"; break;
1a0c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
1a0d0 43 41 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22  CAT:  zBinOp = "
1a0e0 43 4f 4e 43 41 54 22 3b 20 62 72 65 61 6b 3b 0a  CONCAT"; break;.
1a0f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
1a100 4e 55 53 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22  NUS:  zUniOp = "
1a110 55 4d 49 4e 55 53 22 3b 20 62 72 65 61 6b 3b 0a  UMINUS"; break;.
1a120 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55      case TK_UPLU
1a130 53 3a 20 20 20 7a 55 6e 69 4f 70 20 3d 20 22 55  S:   zUniOp = "U
1a140 50 4c 55 53 22 3b 20 20 62 72 65 61 6b 3b 0a 20  PLUS";  break;. 
1a150 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f     case TK_BITNO
1a160 54 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22 42 49  T:  zUniOp = "BI
1a170 54 4e 4f 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20  TNOT"; break;.  
1a180 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20    case TK_NOT:  
1a190 20 20 20 7a 55 6e 69 4f 70 20 3d 20 22 4e 4f 54     zUniOp = "NOT
1a1a0 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
1a1b0 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
1a1c0 20 20 7a 55 6e 69 4f 70 20 3d 20 22 49 53 4e 55    zUniOp = "ISNU
1a1d0 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LL"; break;.    
1a1e0 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
1a1f0 20 7a 55 6e 69 4f 70 20 3d 20 22 4e 4f 54 4e 55   zUniOp = "NOTNU
1a200 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20  LL"; break;..   
1a210 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
1a220 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20  CTION:.    case 
1a230 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20  TK_CONST_FUNC:. 
1a240 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
1a250 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  ION: {.      Exp
1a260 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20  rList *pFarg;   
1a270 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
1a280 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
1a290 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45  s */.      if( E
1a2a0 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
1a2b0 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
1a2c0 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  nOnly) ){.      
1a2d0 20 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20    pFarg = 0;.   
1a2e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a2f0 20 20 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d    pFarg = pExpr-
1a300 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
1a310 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
1a320 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1a330 74 2c 20 22 25 73 46 55 4e 43 54 49 4f 4e 3a 25  t, "%sFUNCTION:%
1a340 73 28 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  s(",.           
1a350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a360 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
1a370 49 4f 4e 20 3f 20 22 41 47 47 5f 22 20 3a 20 22  ION ? "AGG_" : "
1a380 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1a390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1a3a0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1a3b0 20 20 20 20 20 20 69 66 28 20 70 46 61 72 67 20        if( pFarg 
1a3c0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1a3d0 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73  e3ExplainExprLis
1a3e0 74 28 70 4f 75 74 2c 20 70 46 61 72 67 29 3b 0a  t(pOut, pFarg);.
1a3f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1a400 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1a410 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20  tf(pOut, ")");. 
1a420 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a430 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1a440 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1a450 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
1a460 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  S: {.      sqlit
1a470 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1a480 70 4f 75 74 2c 20 22 45 58 49 53 54 53 28 22 29  pOut, "EXISTS(")
1a490 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1a4a0 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 70 4f 75  xplainSelect(pOu
1a4b0 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  t, pExpr->x.pSel
1a4c0 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ect);.      sqli
1a4d0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1a4e0 28 70 4f 75 74 2c 22 29 22 29 3b 0a 20 20 20 20  (pOut,")");.    
1a4f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1a500 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
1a510 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
1a520 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1a530 70 4f 75 74 2c 20 22 28 22 29 3b 0a 20 20 20 20  pOut, "(");.    
1a540 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1a550 53 65 6c 65 63 74 28 70 4f 75 74 2c 20 70 45 78  Select(pOut, pEx
1a560 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a  pr->x.pSelect);.
1a570 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a580 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1a590 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65   ")");.      bre
1a5a0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1a5b0 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
1a5c0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1a5d0 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 49 4e  Printf(pOut, "IN
1a5e0 28 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (");.      sqlit
1a5f0 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f  e3ExplainExpr(pO
1a600 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ut, pExpr->pLeft
1a610 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a620 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1a630 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20  ut, ",");.      
1a640 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
1a650 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
1a660 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
1a670 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1a680 69 6e 53 65 6c 65 63 74 28 70 4f 75 74 2c 20 70  inSelect(pOut, p
1a690 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29  Expr->x.pSelect)
1a6a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1a6b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1a6c0 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70 4f  plainExprList(pO
1a6d0 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  ut, pExpr->x.pLi
1a6e0 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
1a6f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1a700 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 29  nPrintf(pOut, ")
1a710 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
1a720 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
1a730 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
1a740 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a  QUERY */..    /*
1a750 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54  .    **    x BET
1a760 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20  WEEN y AND z.   
1a770 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
1a780 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
1a790 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1a7a0 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
1a7b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20      **.    ** X 
1a7c0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
1a7d0 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
1a7e0 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Y is stored in
1a7f0 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
1a800 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [0].pExpr..    *
1a810 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Z is stored in
1a820 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
1a830 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [1].pExpr..    *
1a840 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  /.    case TK_BE
1a850 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45  TWEEN: {.      E
1a860 78 70 72 20 2a 70 58 20 3d 20 70 45 78 70 72 2d  xpr *pX = pExpr-
1a870 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78  >pLeft;.      Ex
1a880 70 72 20 2a 70 59 20 3d 20 70 45 78 70 72 2d 3e  pr *pY = pExpr->
1a890 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  x.pList->a[0].pE
1a8a0 78 70 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20  xpr;.      Expr 
1a8b0 2a 70 5a 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  *pZ = pExpr->x.p
1a8c0 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
1a8d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1a8e0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1a8f0 74 2c 20 22 42 45 54 57 45 45 4e 28 22 29 3b 0a  t, "BETWEEN(");.
1a900 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a910 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70  lainExpr(pOut, p
1a920 58 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  X);.      sqlite
1a930 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1a940 4f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20  Out, ",");.     
1a950 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1a960 78 70 72 28 70 4f 75 74 2c 20 70 59 29 3b 0a 20  xpr(pOut, pY);. 
1a970 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1a980 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1a990 22 2c 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ",");.      sqli
1a9a0 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
1a9b0 4f 75 74 2c 20 70 5a 29 3b 0a 20 20 20 20 20 20  Out, pZ);.      
1a9c0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1a9d0 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b  intf(pOut, ")");
1a9e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1a9f0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1aa00 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20  TRIGGER: {.     
1aa10 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64   /* If the opcod
1aa20 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c  e is TK_TRIGGER,
1aa30 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
1aa40 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65  sion is a refere
1aa50 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  nce.      ** to 
1aa60 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  a column in the 
1aa70 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70  new.* or old.* p
1aa80 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61  seudo-tables ava
1aa90 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20  ilable to.      
1aaa0 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  ** trigger progr
1aab0 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ams. In this cas
1aac0 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73  e Expr.iTable is
1aad0 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68   set to 1 for th
1aae0 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a  e.      ** new.*
1aaf0 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f   pseudo-table, o
1ab00 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e  r 0 for the old.
1ab10 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20  * pseudo-table. 
1ab20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20  Expr.iColumn.   
1ab30 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20     ** is set to 
1ab40 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  the column of th
1ab50 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74  e pseudo-table t
1ab60 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31  o read, or to -1
1ab70 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   to.      ** rea
1ab80 64 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c  d the rowid fiel
1ab90 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
1aba0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1abb0 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 73  Printf(pOut, "%s
1abc0 28 25 64 29 22 2c 20 0a 20 20 20 20 20 20 20 20  (%d)", .        
1abd0 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
1abe0 3f 20 22 4e 45 57 22 20 3a 20 22 4f 4c 44 22 2c  ? "NEW" : "OLD",
1abf0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29   pExpr->iColumn)
1ac00 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1ac10 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1ac20 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 73  _CASE: {.      s
1ac30 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1ac40 6e 74 66 28 70 4f 75 74 2c 20 22 43 41 53 45 28  ntf(pOut, "CASE(
1ac50 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
1ac60 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75  3ExplainExpr(pOu
1ac70 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
1ac80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1ac90 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1aca0 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 73  t, ",");.      s
1acb0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1acc0 72 4c 69 73 74 28 70 4f 75 74 2c 20 70 45 78 70  rList(pOut, pExp
1acd0 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
1ace0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1acf0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ad00 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20  MIT_TRIGGER.    
1ad10 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b  case TK_RAISE: {
1ad20 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1ad30 72 20 2a 7a 54 79 70 65 20 3d 20 22 75 6e 6b 22  r *zType = "unk"
1ad40 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  ;.      switch( 
1ad50 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20  pExpr->affinity 
1ad60 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
1ad70 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 20 20 20 7a  OE_Rollback:   z
1ad80 54 79 70 65 20 3d 20 22 72 6f 6c 6c 62 61 63 6b  Type = "rollback
1ad90 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
1ada0 20 20 20 63 61 73 65 20 4f 45 5f 41 62 6f 72 74     case OE_Abort
1adb0 3a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  :      zType = "
1adc0 61 62 6f 72 74 22 3b 20 20 20 20 20 62 72 65 61  abort";     brea
1add0 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
1ade0 4f 45 5f 46 61 69 6c 3a 20 20 20 20 20 20 20 7a  OE_Fail:       z
1adf0 54 79 70 65 20 3d 20 22 66 61 69 6c 22 3b 20 20  Type = "fail";  
1ae00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1ae10 20 20 20 63 61 73 65 20 4f 45 5f 49 67 6e 6f 72     case OE_Ignor
1ae20 65 3a 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  e:     zType = "
1ae30 69 67 6e 6f 72 65 22 3b 20 20 20 20 62 72 65 61  ignore";    brea
1ae40 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1ae50 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1ae60 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 52 41 49  rintf(pOut, "RAI
1ae70 53 45 2d 25 73 28 25 73 29 22 2c 20 7a 54 79 70  SE-%s(%s)", zTyp
1ae80 65 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  e, pExpr->u.zTok
1ae90 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  en);.      break
1aea0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1aeb0 20 7d 0a 20 20 69 66 28 20 7a 42 69 6e 4f 70 20   }.  if( zBinOp 
1aec0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
1aed0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1aee0 2c 22 25 73 28 22 2c 20 7a 42 69 6e 4f 70 29 3b  ,"%s(", zBinOp);
1aef0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
1af00 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45  ainExpr(pOut, pE
1af10 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
1af20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1af30 72 69 6e 74 66 28 70 4f 75 74 2c 22 2c 22 29 3b  rintf(pOut,",");
1af40 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
1af50 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45  ainExpr(pOut, pE
1af60 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
1af70 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1af80 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 29 22 29  Printf(pOut,")")
1af90 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 55  ;.  }else if( zU
1afa0 6e 69 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  niOp ){.    sqli
1afb0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1afc0 28 70 4f 75 74 2c 22 25 73 28 22 2c 20 7a 55 6e  (pOut,"%s(", zUn
1afd0 69 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iOp);.    sqlite
1afe0 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75  3ExplainExpr(pOu
1aff0 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
1b000 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1b010 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1b020 22 29 22 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  ")");.  }.}.#end
1b030 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
1b040 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
1b050 5f 45 58 50 4c 41 49 4e 29 20 2a 2f 0a 0a 23 69  _EXPLAIN) */..#i
1b060 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1b070 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50  _ENABLE_TREE_EXP
1b080 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  LAIN)./*.** Gene
1b090 72 61 74 65 20 61 20 68 75 6d 61 6e 2d 72 65 61  rate a human-rea
1b0a0 64 61 62 6c 65 20 65 78 70 6c 61 6e 61 74 69 6f  dable explanatio
1b0b0 6e 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  n of an expressi
1b0c0 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64  on list..*/.void
1b0d0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1b0e0 78 70 72 4c 69 73 74 28 56 64 62 65 20 2a 70 4f  xprList(Vdbe *pO
1b0f0 75 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  ut, ExprList *pL
1b100 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
1b110 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c   if( pList==0 ||
1b120 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30   pList->nExpr==0
1b130 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1b140 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1b150 74 2c 20 22 28 65 6d 70 74 79 2d 6c 69 73 74 29  t, "(empty-list)
1b160 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ");.    return;.
1b170 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 69 73    }else if( pLis
1b180 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20  t->nExpr==1 ){. 
1b190 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1b1a0 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 4c 69 73  nExpr(pOut, pLis
1b1b0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
1b1c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1b1d0 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28  ite3ExplainPush(
1b1e0 70 4f 75 74 29 3b 0a 20 20 20 20 66 6f 72 28 69  pOut);.    for(i
1b1f0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
1b200 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
1b210 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1b220 69 6e 74 66 28 70 4f 75 74 2c 20 22 69 74 65 6d  intf(pOut, "item
1b230 5b 25 64 5d 20 3d 20 22 2c 20 69 29 3b 0a 20 20  [%d] = ", i);.  
1b240 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1b250 69 6e 50 75 73 68 28 70 4f 75 74 29 3b 0a 20 20  inPush(pOut);.  
1b260 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1b270 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 4c 69  inExpr(pOut, pLi
1b280 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
1b290 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1b2a0 70 6c 61 69 6e 50 6f 70 28 70 4f 75 74 29 3b 0a  plainPop(pOut);.
1b2b0 20 20 20 20 20 20 69 66 28 20 69 3c 70 4c 69 73        if( i<pLis
1b2c0 74 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20  t->nExpr-1 ){.  
1b2d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b2e0 6c 61 69 6e 4e 4c 28 70 4f 75 74 29 3b 0a 20 20  lainNL(pOut);.  
1b2f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1b300 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f  sqlite3ExplainPo
1b310 70 28 70 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 23  p(pOut);.  }.}.#
1b320 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1b330 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1b340 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 70  Return TRUE if p
1b350 45 78 70 72 20 69 73 20 61 6e 20 63 6f 6e 73 74  Expr is an const
1b360 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ant expression t
1b370 68 61 74 20 69 73 20 61 70 70 72 6f 70 72 69 61  hat is appropria
1b380 74 65 0a 2a 2a 20 66 6f 72 20 66 61 63 74 6f 72  te.** for factor
1b390 69 6e 67 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f  ing out of a loo
1b3a0 70 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65 20  p.  Appropriate 
1b3b0 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 3a  expressions are:
1b3c0 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79  .**.**    *  Any
1b3d0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
1b3e0 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74 77   evaluates to tw
1b3f0 6f 20 6f 72 20 6d 6f 72 65 20 6f 70 63 6f 64 65  o or more opcode
1b400 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41  s..**.**    *  A
1b410 6e 79 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 4f  ny OP_Integer, O
1b420 50 5f 52 65 61 6c 2c 20 4f 50 5f 53 74 72 69 6e  P_Real, OP_Strin
1b430 67 2c 20 4f 50 5f 42 6c 6f 62 2c 20 4f 50 5f 4e  g, OP_Blob, OP_N
1b440 75 6c 6c 2c 20 0a 2a 2a 20 20 20 20 20 20 20 6f  ull, .**       o
1b450 72 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 74 68  r OP_Variable th
1b460 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
1b470 20 74 6f 20 62 65 20 70 6c 61 63 65 64 20 69 6e   to be placed in
1b480 20 61 20 0a 2a 2a 20 20 20 20 20 20 20 73 70 65   a .**       spe
1b490 63 69 66 69 63 20 72 65 67 69 73 74 65 72 2e 0a  cific register..
1b4a0 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6e  **.** There is n
1b4b0 6f 20 70 6f 69 6e 74 20 69 6e 20 66 61 63 74 6f  o point in facto
1b4c0 72 69 6e 67 20 6f 75 74 20 73 69 6e 67 6c 65 2d  ring out single-
1b4d0 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73  instruction cons
1b4e0 74 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73 69  tant.** expressi
1b4f0 6f 6e 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ons that need to
1b500 20 62 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20   be placed in a 
1b510 70 61 72 74 69 63 75 6c 61 72 20 72 65 67 69 73  particular regis
1b520 74 65 72 2e 20 20 0a 2a 2a 20 57 65 20 63 6f 75  ter.  .** We cou
1b530 6c 64 20 66 61 63 74 6f 72 20 74 68 65 6d 20 6f  ld factor them o
1b540 75 74 2c 20 62 75 74 20 74 68 65 6e 20 77 65 20  ut, but then we 
1b550 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 61 64 64  would end up add
1b560 69 6e 67 20 61 6e 0a 2a 2a 20 4f 50 5f 53 43 6f  ing an.** OP_SCo
1b570 70 79 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  py instruction t
1b580 6f 20 6d 6f 76 65 20 74 68 65 20 76 61 6c 75 65  o move the value
1b590 20 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65 63   into the correc
1b5a0 74 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 6c 61  t register.** la
1b5b0 74 65 72 2e 20 20 57 65 20 6d 69 67 68 74 20 61  ter.  We might a
1b5c0 73 20 77 65 6c 6c 20 6a 75 73 74 20 75 73 65 20  s well just use 
1b5d0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e 73  the original ins
1b5e0 74 72 75 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  truction and.** 
1b5f0 61 76 6f 69 64 20 74 68 65 20 4f 50 5f 53 43 6f  avoid the OP_SCo
1b600 70 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  py..*/.static in
1b610 74 20 69 73 41 70 70 72 6f 70 72 69 61 74 65 46  t isAppropriateF
1b620 6f 72 46 61 63 74 6f 72 69 6e 67 28 45 78 70 72  orFactoring(Expr
1b630 20 2a 70 29 7b 0a 20 20 69 66 28 20 21 73 71 6c   *p){.  if( !sql
1b640 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
1b650 6e 74 4e 6f 74 4a 6f 69 6e 28 70 29 20 29 7b 0a  ntNotJoin(p) ){.
1b660 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
1b670 2a 20 4f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20  * Only constant 
1b680 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
1b690 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
1b6a0 66 61 63 74 6f 72 69 6e 67 20 2a 2f 0a 20 20 7d  factoring */.  }
1b6b0 0a 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73  .  if( (p->flags
1b6c0 20 26 20 45 50 5f 46 69 78 65 64 44 65 73 74 29   & EP_FixedDest)
1b6d0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1b6e0 6e 20 31 3b 20 20 2f 2a 20 41 6e 79 20 63 6f 6e  n 1;  /* Any con
1b6f0 73 74 61 6e 74 20 77 69 74 68 6f 75 74 20 61 20  stant without a 
1b700 66 69 78 65 64 20 64 65 73 74 69 6e 61 74 69 6f  fixed destinatio
1b710 6e 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  n is appropriate
1b720 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28   */.  }.  while(
1b730 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   p->op==TK_UPLUS
1b740 20 29 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b   ) p = p->pLeft;
1b750 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
1b760 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
1b770 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54  TE_OMIT_BLOB_LIT
1b780 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b  ERAL.    case TK
1b790 5f 42 4c 4f 42 3a 0a 23 65 6e 64 69 66 0a 20 20  _BLOB:.#endif.  
1b7a0 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
1b7b0 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
1b7c0 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73  INTEGER:.    cas
1b7d0 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20  e TK_FLOAT:.    
1b7e0 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20  case TK_NULL:.  
1b7f0 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
1b800 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1b810 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 42 4c  se( p->op==TK_BL
1b820 4f 42 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  OB );.      test
1b830 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
1b840 56 41 52 49 41 42 4c 45 20 29 3b 0a 20 20 20 20  VARIABLE );.    
1b850 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
1b860 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 3b  p==TK_INTEGER );
1b870 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1b880 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54   p->op==TK_FLOAT
1b890 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1b8a0 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55  se( p->op==TK_NU
1b8b0 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LL );.      test
1b8c0 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
1b8d0 53 54 52 49 4e 47 20 29 3b 0a 20 20 20 20 20 20  STRING );.      
1b8e0 2f 2a 20 53 69 6e 67 6c 65 2d 69 6e 73 74 72 75  /* Single-instru
1b8f0 63 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 20  ction constants 
1b900 77 69 74 68 20 61 20 66 69 78 65 64 20 64 65 73  with a fixed des
1b910 74 69 6e 61 74 69 6f 6e 20 61 72 65 0a 20 20 20  tination are.   
1b920 20 20 20 2a 2a 20 62 65 74 74 65 72 20 64 6f 6e     ** better don
1b930 65 20 69 6e 2d 6c 69 6e 65 2e 20 20 49 66 20 77  e in-line.  If w
1b940 65 20 66 61 63 74 6f 72 20 74 68 65 6d 2c 20 74  e factor them, t
1b950 68 65 79 20 77 69 6c 6c 20 6a 75 73 74 20 65 6e  hey will just en
1b960 64 0a 20 20 20 20 20 20 2a 2a 20 75 70 20 67 65  d.      ** up ge
1b970 6e 65 72 61 74 69 6e 67 20 61 6e 20 4f 50 5f 53  nerating an OP_S
1b980 43 6f 70 79 20 74 6f 20 6d 6f 76 65 20 74 68 65  Copy to move the
1b990 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20 64 65   value to the de
1b9a0 73 74 69 6e 61 74 69 6f 6e 0a 20 20 20 20 20 20  stination.      
1b9b0 2a 2a 20 72 65 67 69 73 74 65 72 2e 20 2a 2f 0a  ** register. */.
1b9c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1b9d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1b9e0 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20  K_UMINUS: {.    
1b9f0 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 2d 3e    if( p->pLeft->
1ba00 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20  op==TK_FLOAT || 
1ba10 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  p->pLeft->op==TK
1ba20 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
1ba30 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1ba40 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
1ba50 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
1ba60 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 62 72  ault: {.      br
1ba70 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
1ba80 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
1ba90 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20  .** If pExpr is 
1baa0 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  a constant expre
1bab0 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 61 70  ssion that is ap
1bac0 70 72 6f 70 72 69 61 74 65 20 66 6f 72 0a 2a 2a  propriate for.**
1bad0 20 66 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f   factoring out o
1bae0 66 20 61 20 6c 6f 6f 70 2c 20 74 68 65 6e 20 65  f a loop, then e
1baf0 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72  valuate the expr
1bb00 65 73 73 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 61  ession.** into a
1bb10 20 72 65 67 69 73 74 65 72 20 61 6e 64 20 63 6f   register and co
1bb20 6e 76 65 72 74 20 74 68 65 20 65 78 70 72 65 73  nvert the expres
1bb30 73 69 6f 6e 20 69 6e 74 6f 20 61 20 54 4b 5f 52  sion into a TK_R
1bb40 45 47 49 53 54 45 52 0a 2a 2a 20 65 78 70 72 65  EGISTER.** expre
1bb50 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssion..*/.static
1bb60 20 69 6e 74 20 65 76 61 6c 43 6f 6e 73 74 45 78   int evalConstEx
1bb70 70 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  pr(Walker *pWalk
1bb80 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
1bb90 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
1bba0 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
1bbb0 72 73 65 3b 0a 20 20 73 77 69 74 63 68 28 20 70  rse;.  switch( p
1bbc0 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
1bbd0 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20 20  case TK_IN:.    
1bbe0 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52  case TK_REGISTER
1bbf0 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
1bc00 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
1bc10 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  }.    case TK_FU
1bc20 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65  NCTION:.    case
1bc30 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
1bc40 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
1bc50 4e 53 54 5f 46 55 4e 43 3a 20 7b 0a 20 20 20 20  NST_FUNC: {.    
1bc60 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e    /* The argumen
1bc70 74 73 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  ts to a function
1bc80 20 68 61 76 65 20 61 20 66 69 78 65 64 20 64 65   have a fixed de
1bc90 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 20 20 20  stination..     
1bca0 20 2a 2a 20 4d 61 72 6b 20 74 68 65 6d 20 74 68   ** Mark them th
1bcb0 69 73 20 77 61 79 20 74 6f 20 61 76 6f 69 64 20  is way to avoid 
1bcc0 67 65 6e 65 72 61 74 65 64 20 75 6e 6e 65 65 64  generated unneed
1bcd0 65 64 20 4f 50 5f 53 43 6f 70 79 0a 20 20 20 20  ed OP_SCopy.    
1bce0 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
1bcf0 73 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  s. .      */.   
1bd00 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
1bd10 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
1bd20 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ist;.      asser
1bd30 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1bd40 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
1bd50 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
1bd60 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
1bd70 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 70         int i = p
1bd80 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
1bd90 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
1bda0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1bdb0 20 3d 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20   = pList->a;.   
1bdc0 20 20 20 20 20 66 6f 72 28 3b 20 69 3e 30 3b 20       for(; i>0; 
1bdd0 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i--, pItem++){. 
1bde0 20 20 20 20 20 20 20 20 20 69 66 28 20 41 4c 57           if( ALW
1bdf0 41 59 53 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  AYS(pItem->pExpr
1be00 29 20 29 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  ) ) pItem->pExpr
1be10 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46 69  ->flags |= EP_Fi
1be20 78 65 64 44 65 73 74 3b 0a 20 20 20 20 20 20 20  xedDest;.       
1be30 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1be40 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1be50 7d 0a 20 20 69 66 28 20 69 73 41 70 70 72 6f 70  }.  if( isApprop
1be60 72 69 61 74 65 46 6f 72 46 61 63 74 6f 72 69 6e  riateForFactorin
1be70 67 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  g(pExpr) ){.    
1be80 69 6e 74 20 72 31 20 3d 20 2b 2b 70 50 61 72 73  int r1 = ++pPars
1be90 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 74  e->nMem;.    int
1bea0 20 72 32 3b 0a 20 20 20 20 72 32 20 3d 20 73 71   r2;.    r2 = sq
1beb0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
1bec0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
1bed0 72 2c 20 72 31 29 3b 0a 20 20 20 20 69 66 28 20  r, r1);.    if( 
1bee0 4e 45 56 45 52 28 72 31 21 3d 72 32 29 20 29 20  NEVER(r1!=r2) ) 
1bef0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1bf00 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
1bf10 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  );.    pExpr->op
1bf20 32 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  2 = pExpr->op;. 
1bf30 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
1bf40 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20  K_REGISTER;.    
1bf50 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
1bf60 72 32 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57  r2;.    return W
1bf70 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20  RC_Prune;.  }.  
1bf80 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
1bf90 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  nue;.}../*.** Pr
1bfa0 65 65 76 61 6c 75 61 74 65 20 63 6f 6e 73 74 61  eevaluate consta
1bfb0 6e 74 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  nt subexpression
1bfc0 73 20 77 69 74 68 69 6e 20 70 45 78 70 72 20 61  s within pExpr a
1bfd0 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20  nd store the.** 
1bfe0 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73  results in regis
1bff0 74 65 72 73 2e 20 20 4d 6f 64 69 66 79 20 70 45  ters.  Modify pE
1c000 78 70 72 20 73 6f 20 74 68 61 74 20 74 68 65 20  xpr so that the 
1c010 63 6f 6e 73 74 61 6e 74 20 73 75 62 65 78 70 72  constant subexpr
1c020 65 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 54 4b  esions.** are TK
1c030 5f 52 45 47 49 53 54 45 52 20 6f 70 63 6f 64 65  _REGISTER opcode
1c040 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
1c050 74 68 65 20 70 72 65 63 6f 6d 70 75 74 65 64 20  the precomputed 
1c060 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  values..**.** Th
1c070 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
1c080 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 75 6d  no-op if the jum
1c090 70 20 74 6f 20 74 68 65 20 63 6f 6f 6b 69 65 2d  p to the cookie-
1c0a0 63 68 65 63 6b 20 63 6f 64 65 20 68 61 73 0a 2a  check code has.*
1c0b0 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 2e  * already occur.
1c0c0 20 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6f 6b    Since the cook
1c0d0 69 65 2d 63 68 65 63 6b 20 6a 75 6d 70 20 69 73  ie-check jump is
1c0e0 20 67 65 6e 65 72 61 74 65 64 20 70 72 69 6f 72   generated prior
1c0f0 20 74 6f 0a 2a 2a 20 61 6e 79 20 6f 74 68 65 72   to.** any other
1c100 20 73 65 72 69 6f 75 73 20 70 72 6f 63 65 73 73   serious process
1c110 69 6e 67 2c 20 74 68 69 73 20 63 68 65 63 6b 20  ing, this check 
1c120 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
1c130 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 77 61 79 20  re is no.** way 
1c140 74 6f 20 61 63 63 69 64 65 6e 74 6c 79 20 62 79  to accidently by
1c150 70 61 73 73 20 74 68 65 20 63 6f 6e 73 74 61 6e  pass the constan
1c160 74 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  t initialization
1c170 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
1c180 75 74 69 6e 65 20 69 73 20 61 6c 73 6f 20 61 20  utine is also a 
1c190 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 53 51 4c  no-op if the SQL
1c1a0 49 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e  ITE_FactorOutCon
1c1b0 73 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  st optimization.
1c1c0 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 20 76  ** is disabled v
1c1d0 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74  ia the sqlite3_t
1c1e0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1c1f0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
1c200 4d 49 5a 41 54 49 4f 4e 53 29 0a 2a 2a 20 69 6e  MIZATIONS).** in
1c210 74 65 72 66 61 63 65 2e 20 20 54 68 69 73 20 61  terface.  This a
1c220 6c 6c 6f 77 73 20 74 65 73 74 20 6c 6f 67 69 63  llows test logic
1c230 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
1c240 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72 20  the same answer 
1c250 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66  is.** obtained f
1c260 6f 72 20 71 75 65 72 69 65 73 20 72 65 67 61 72  or queries regar
1c270 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
1c280 20 6f 72 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74   or not constant
1c290 73 20 61 72 65 0a 2a 2a 20 70 72 65 63 6f 6d 70  s are.** precomp
1c2a0 75 74 65 64 20 69 6e 74 6f 20 72 65 67 69 73 74  uted into regist
1c2b0 65 72 73 20 6f 72 20 69 66 20 74 68 65 79 20 61  ers or if they a
1c2c0 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 2d 6c  re inserted in-l
1c2d0 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ine..*/.void sql
1c2e0 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73  ite3ExprCodeCons
1c2f0 74 61 6e 74 73 28 50 61 72 73 65 20 2a 70 50 61  tants(Parse *pPa
1c300 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1c310 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
1c320 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f   if( pParse->coo
1c330 6b 69 65 47 6f 74 6f 20 29 20 72 65 74 75 72 6e  kieGoto ) return
1c340 3b 0a 20 20 69 66 28 20 28 70 50 61 72 73 65 2d  ;.  if( (pParse-
1c350 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
1c360 49 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e  ITE_FactorOutCon
1c370 73 74 29 21 3d 30 20 29 20 72 65 74 75 72 6e 3b  st)!=0 ) return;
1c380 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
1c390 63 6b 20 3d 20 65 76 61 6c 43 6f 6e 73 74 45 78  ck = evalConstEx
1c3a0 70 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  pr;.  w.xSelectC
1c3b0 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77  allback = 0;.  w
1c3c0 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
1c3d0 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
1c3e0 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a  xpr(&w, pExpr);.
1c3f0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
1c400 74 65 20 63 6f 64 65 20 74 68 61 74 20 70 75 73  te code that pus
1c410 68 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hes the value of
1c420 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f   every element o
1c430 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65  f the given.** e
1c440 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69  xpression list i
1c450 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f  nto a sequence o
1c460 66 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69  f registers begi
1c470 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e  nning at target.
1c480 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
1c490 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
1c4a0 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64 2e 0a  ents evaluated..
1c4b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
1c4c0 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a  prCodeExprList(.
1c4d0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1c4e0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1c4f0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
1c500 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
1c510 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
1c520 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64  n list to be cod
1c530 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67  ed */.  int targ
1c540 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68  et,        /* Wh
1c550 65 72 65 20 74 6f 20 77 72 69 74 65 20 72 65 73  ere to write res
1c560 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f  ults */.  int do
1c570 48 61 72 64 43 6f 70 79 20 20 20 20 20 2f 2a 20  HardCopy     /* 
1c580 4d 61 6b 65 20 61 20 68 61 72 64 20 63 6f 70 79  Make a hard copy
1c590 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e   of every elemen
1c5a0 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  t */.){.  struct
1c5b0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
1c5c0 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20  pItem;.  int i, 
1c5d0 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  n;.  assert( pLi
1c5e0 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  st!=0 );.  asser
1c5f0 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20  t( target>0 );. 
1c600 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1c610 3e 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a  >pVdbe!=0 );  /*
1c620 20 4e 65 76 65 72 20 67 65 74 73 20 74 68 69 73   Never gets this
1c630 20 66 61 72 20 6f 74 68 65 72 77 69 73 65 20 2a   far otherwise *
1c640 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  /.  n = pList->n
1c650 45 78 70 72 3b 0a 20 20 66 6f 72 28 70 49 74 65  Expr;.  for(pIte
1c660 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
1c670 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d   i<n; i++, pItem
1c680 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
1c690 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45  Expr = pItem->pE
1c6a0 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 6e 52  xpr;.    int inR
1c6b0 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
1c6c0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
1c6d0 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
1c6e0 2b 69 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 52  +i);.    if( inR
1c6f0 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a  eg!=target+i ){.
1c700 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1c710 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e  eAddOp2(pParse->
1c720 70 56 64 62 65 2c 20 64 6f 48 61 72 64 43 6f 70  pVdbe, doHardCop
1c730 79 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50  y ? OP_Copy : OP
1c740 5f 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20  _SCopy,.        
1c750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c760 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29  inReg, target+i)
1c770 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1c780 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
1c790 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
1c7a0 6f 72 20 61 20 42 45 54 57 45 45 4e 20 6f 70 65  or a BETWEEN ope
1c7b0 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  rator..**.**    
1c7c0 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20  x BETWEEN y AND 
1c7d0 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76  z.**.** The abov
1c7e0 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
1c7f0 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d  to .**.**    x>=
1c800 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a  y AND x<=z.**.**
1c810 20 43 6f 64 65 20 69 74 20 61 73 20 73 75 63 68   Code it as such
1c820 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f  , taking care to
1c830 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73   do the common s
1c840 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  ubexpression.** 
1c850 65 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  elementation of 
1c860 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
1c870 64 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65  d exprCodeBetwee
1c880 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
1c890 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
1c8a0 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
1c8b0 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
1c8c0 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
1c8d0 20 20 20 20 20 2f 2a 20 54 68 65 20 42 45 54 57       /* The BETW
1c8e0 45 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  EEN expression *
1c8f0 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20  /.  int dest,   
1c900 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
1c910 72 65 20 69 66 20 74 68 65 20 6a 75 6d 70 20 69  re if the jump i
1c920 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74  s taken */.  int
1c930 20 6a 75 6d 70 49 66 54 72 75 65 2c 20 20 20 2f   jumpIfTrue,   /
1c940 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  * Take the jump 
1c950 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69  if the BETWEEN i
1c960 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20  s true */.  int 
1c970 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a  jumpIfNull    /*
1c980 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   Take the jump i
1c990 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73  f the BETWEEN is
1c9a0 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 45 78   NULL */.){.  Ex
1c9b0 70 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20  pr exprAnd;     
1c9c0 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61  /* The AND opera
1c9d0 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44  tor in  x>=y AND
1c9e0 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72   x<=z  */.  Expr
1c9f0 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a   compLeft;    /*
1ca00 20 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d   The  x>=y  term
1ca10 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52   */.  Expr compR
1ca20 69 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20  ight;   /* The  
1ca30 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20  x<=z  term */.  
1ca40 45 78 70 72 20 65 78 70 72 58 3b 20 20 20 20 20  Expr exprX;     
1ca50 20 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62    /* The  x  sub
1ca60 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
1ca70 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
1ca80 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75  ; /* Temporary u
1ca90 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a  se register */..
1caa0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1cab0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1cac0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1cad0 29 3b 0a 20 20 65 78 70 72 58 20 3d 20 2a 70 45  );.  exprX = *pE
1cae0 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78  xpr->pLeft;.  ex
1caf0 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e  prAnd.op = TK_AN
1cb00 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65  D;.  exprAnd.pLe
1cb10 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a  ft = &compLeft;.
1cb20 20 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74    exprAnd.pRight
1cb30 20 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20   = &compRight;. 
1cb40 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54   compLeft.op = T
1cb50 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74  K_GE;.  compLeft
1cb60 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b  .pLeft = &exprX;
1cb70 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67  .  compLeft.pRig
1cb80 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ht = pExpr->x.pL
1cb90 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
1cba0 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20  .  compRight.op 
1cbb0 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52  = TK_LE;.  compR
1cbc0 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78  ight.pLeft = &ex
1cbd0 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  prX;.  compRight
1cbe0 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  .pRight = pExpr-
1cbf0 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  >x.pList->a[1].p
1cc00 45 78 70 72 3b 0a 20 20 65 78 70 72 58 2e 69 54  Expr;.  exprX.iT
1cc10 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 45 78  able = sqlite3Ex
1cc20 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1cc30 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46  e, &exprX, &regF
1cc40 72 65 65 31 29 3b 0a 20 20 65 78 70 72 58 2e 6f  ree1);.  exprX.o
1cc50 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
1cc60 0a 20 20 69 66 28 20 6a 75 6d 70 49 66 54 72 75  .  if( jumpIfTru
1cc70 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1cc80 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
1cc90 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73  e, &exprAnd, des
1cca0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1ccb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1ccc0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1ccd0 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64  pParse, &exprAnd
1cce0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1ccf0 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ll);.  }.  sqlit
1cd00 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1cd10 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
1cd20 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65  1);..  /* Ensure
1cd30 20 61 64 65 71 75 61 74 65 20 74 65 73 74 20 63   adequate test c
1cd40 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74 65 73  overage */.  tes
1cd50 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
1cd60 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e==0 && jumpIfNu
1cd70 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
1cd80 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
1cd90 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d  se( jumpIfTrue==
1cda0 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  0 && jumpIfNull=
1cdb0 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
1cdc0 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
1cdd0 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26   jumpIfTrue==0 &
1cde0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
1cdf0 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
1ce00 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
1ce10 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a  mpIfTrue==0 && j
1ce20 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
1ce30 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
1ce40 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1ce50 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70  fTrue!=0 && jump
1ce60 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
1ce70 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
1ce80 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
1ce90 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue!=0 && jumpIfN
1cea0 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
1ceb0 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
1cec0 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21  ase( jumpIfTrue!
1ced0 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
1cee0 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  !=0 && regFree1=
1cef0 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
1cf00 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20  ( jumpIfTrue!=0 
1cf10 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
1cf20 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
1cf30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
1cf40 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
1cf50 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69  boolean expressi
1cf60 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a  on such that a j
1cf70 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74  ump is made.** t
1cf80 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73  o the label "des
1cf90 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73  t" if the expres
1cfa0 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74  sion is true but
1cfb0 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f   execution.** co
1cfc0 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74  ntinues straight
1cfd0 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70   thru if the exp
1cfe0 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65  ression is false
1cff0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
1d000 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61  xpression evalua
1d010 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69  tes to NULL (nei
1d020 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61  ther true nor fa
1d030 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61  lse), then.** ta
1d040 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74  ke the jump if t
1d050 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c  he jumpIfNull fl
1d060 61 67 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d  ag is SQLITE_JUM
1d070 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  PIFNULL..**.** T
1d080 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73  his code depends
1d090 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61   on the fact tha
1d0a0 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20  t certain token 
1d0b0 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45  values (ex: TK_E
1d0c0 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61  Q).** are the sa
1d0d0 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c  me as opcode val
1d0e0 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20  ues (ex: OP_Eq) 
1d0f0 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74  that implement t
1d100 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
1d110 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  .** operation.  
1d120 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73  Special comments
1d130 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74   in vdbe.c and t
1d140 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b  he mkopcodeh.awk
1d150 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68   script in.** th
1d160 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63  e make process c
1d170 61 75 73 65 20 74 68 65 73 65 20 76 61 6c 75 65  ause these value
1d180 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73  s to align.  Ass
1d190 65 72 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f  ert()s in the co
1d1a0 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69  de.** below veri
1d1b0 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  fy that the numb
1d1c0 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20  ers are aligned 
1d1d0 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f  correctly..*/.vo
1d1e0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  id sqlite3ExprIf
1d1f0 54 72 75 65 28 50 61 72 73 65 20 2a 70 50 61 72  True(Parse *pPar
1d200 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
1d210 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a   int dest, int j
1d220 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64  umpIfNull){.  Vd
1d230 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1d240 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20  pVdbe;.  int op 
1d250 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
1d260 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee1 = 0;.  int r
1d270 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69  egFree2 = 0;.  i
1d280 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73  nt r1, r2;..  as
1d290 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  sert( jumpIfNull
1d2a0 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  ==SQLITE_JUMPIFN
1d2b0 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c  ULL || jumpIfNul
1d2c0 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45  l==0 );.  if( NE
1d2d0 56 45 52 28 76 3d 3d 30 29 20 29 20 20 20 20 20  VER(v==0) )     
1d2e0 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73  return;  /* Exis
1d2f0 74 61 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68  tance of VDBE ch
1d300 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20  ecked by caller 
1d310 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
1d320 45 78 70 72 3d 3d 30 29 20 29 20 72 65 74 75 72  Expr==0) ) retur
1d330 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68  n;  /* No way th
1d340 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f  is can happen */
1d350 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f  .  op = pExpr->o
1d360 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  p;.  switch( op 
1d370 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
1d380 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ND: {.      int 
1d390 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
1d3a0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1d3b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1d3c0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1d3d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1d3e0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
1d3f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1d400 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1d410 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1d420 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e  , d2,jumpIfNull^
1d430 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1d440 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
1d450 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
1d460 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1d470 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1d480 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
1d490 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1d4a0 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20  bel(v, d2);.    
1d4b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1d4c0 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
1d4d0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1d4e0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1d4f0 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  _OR: {.      tes
1d500 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1d510 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
1d520 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
1d530 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1d540 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
1d550 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
1d560 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
1d570 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1d580 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
1d590 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1d5a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1d5b0 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
1d5c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d5d0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1d5e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1d5f0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1d600 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1d610 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1d620 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
1d630 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1d640 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
1d650 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
1d660 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
1d670 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
1d680 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
1d690 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61  TK_EQ: {.      a
1d6a0 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50  ssert( TK_LT==OP
1d6b0 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Lt );.      ass
1d6c0 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  ert( TK_LE==OP_L
1d6d0 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
1d6e0 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20  t( TK_GT==OP_Gt 
1d6f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1d700 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b   TK_GE==OP_Ge );
1d710 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1d720 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20  K_EQ==OP_Eq );. 
1d730 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1d740 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20  NE==OP_Ne );.   
1d750 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1d760 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20  =TK_LT );.      
1d770 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1d780 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LE );.      tes
1d790 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54  tcase( op==TK_GT
1d7a0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1d7b0 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b  se( op==TK_GE );
1d7c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d7d0 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20   op==TK_EQ );.  
1d7e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1d7f0 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20  ==TK_NE );.     
1d800 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1d810 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1d820 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1d830 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1d840 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1d850 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1d860 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
1d870 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1d880 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1d890 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
1d8a0 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
1d8b0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1d8c0 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
1d8d0 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
1d8e0 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
1d8f0 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r2, dest, jumpIf
1d900 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 74 65 73  Null);.      tes
1d910 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1d920 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1d930 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1d940 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1d950 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1d960 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65   TK_IS:.    case
1d970 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20   TK_ISNOT: {.   
1d980 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1d990 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
1d9a0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1d9b0 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  _ISNOT );.      
1d9c0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1d9d0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1d9e0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1d9f0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1da00 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1da10 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1da20 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1da30 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1da40 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f     op = (op==TK_
1da50 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b  IS) ? TK_EQ : TK
1da60 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  _NE;.      codeC
1da70 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
1da80 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
1da90 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
1daa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dab0 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20    r1, r2, dest, 
1dac0 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
1dad0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1dae0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1daf0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1db00 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
1db10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1db20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
1db30 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
1db40 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
1db50 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
1db60 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
1db70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1db80 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e  TK_NOTNULL==OP_N
1db90 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20  otNull );.      
1dba0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1dbb0 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
1dbc0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1dbd0 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20  K_NOTNULL );.   
1dbe0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1dbf0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1dc00 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1dc10 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1dc20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1dc30 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
1dc40 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65   dest);.      te
1dc50 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1dc60 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1dc70 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1dc80 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
1dc90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1dca0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1dcb0 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65  ;.      exprCode
1dcc0 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20  Between(pParse, 
1dcd0 70 45 78 70 72 2c 20 64 65 73 74 2c 20 31 2c 20  pExpr, dest, 1, 
1dce0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1dcf0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1dd00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1dd10 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
1dd20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
1dd30 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46       int destIfF
1dd40 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  alse = sqlite3Vd
1dd50 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1dd60 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
1dd70 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c  Null = jumpIfNul
1dd80 6c 20 3f 20 64 65 73 74 20 3a 20 64 65 73 74 49  l ? dest : destI
1dd90 66 46 61 6c 73 65 3b 0a 20 20 20 20 20 20 73 71  fFalse;.      sq
1dda0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
1ddb0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
1ddc0 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74  estIfFalse, dest
1ddd0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
1dde0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1ddf0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
1de00 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dest);.      sql
1de10 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1de20 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61  abel(v, destIfFa
1de30 6c 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  lse);.      brea
1de40 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
1de50 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
1de60 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1de70 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1de80 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65  arse, pExpr, &re
1de90 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
1dea0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1deb0 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64  (v, OP_If, r1, d
1dec0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  est, jumpIfNull!
1ded0 3d 30 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  =0);.      testc
1dee0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1def0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1df00 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1df10 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1df20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
1df30 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1df40 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
1df50 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
1df60 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1df70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
1df80 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ;  .}../*.** Gen
1df90 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
1dfa0 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
1dfb0 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
1dfc0 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
1dfd0 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
1dfe0 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
1dff0 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62  ssion is false b
1e000 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
1e010 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
1e020 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
1e030 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
1e040 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
1e050 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
1e060 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
1e070 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
1e080 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75  alse) then.** ju
1e090 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c  mp if jumpIfNull
1e0a0 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49   is SQLITE_JUMPI
1e0b0 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68  FNULL or fall th
1e0c0 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e  rough if jumpIfN
1e0d0 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a  ull.** is 0..*/.
1e0e0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1e0f0 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70  IfFalse(Parse *p
1e100 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
1e110 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
1e120 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
1e130 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1e140 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
1e150 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  op = 0;.  int re
1e160 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e  gFree1 = 0;.  in
1e170 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  t regFree2 = 0;.
1e180 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20    int r1, r2;.. 
1e190 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e   assert( jumpIfN
1e1a0 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50  ull==SQLITE_JUMP
1e1b0 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66  IFNULL || jumpIf
1e1c0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Null==0 );.  if(
1e1d0 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
1e1e0 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 61  eturn; /* Exista
1e1f0 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63  nce of VDBE chec
1e200 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f  ked by caller */
1e210 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
1e220 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  )    return;..  
1e230 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  /* The value of 
1e240 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70  pExpr->op and op
1e250 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20   are related as 
1e260 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
1e270 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  **       pExpr->
1e280 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70  op            op
1e290 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d  .  **       ----
1e2a0 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d  -----          -
1e2b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20  ---------.  **  
1e2c0 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20       TK_ISNULL  
1e2d0 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75          OP_NotNu
1e2e0 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  ll.  **       TK
1e2f0 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20  _NOTNULL        
1e300 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20   OP_IsNull.  ** 
1e310 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20        TK_NE     
1e320 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20           OP_Eq. 
1e330 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20   **       TK_EQ 
1e340 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
1e350 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Ne.  **       TK
1e360 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _GT             
1e370 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Le.  **     
1e380 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20    TK_LE         
1e390 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20       OP_Gt.  ** 
1e3a0 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20        TK_GE     
1e3b0 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20           OP_Lt. 
1e3c0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20   **       TK_LT 
1e3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
1e3e0 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  Ge.  **.  ** For
1e3f0 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   other values of
1e400 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69   pExpr->op, op i
1e410 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20  s undefined and 
1e420 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65  unused..  ** The
1e430 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e   value of TK_ an
1e440 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20  d OP_ constants 
1e450 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63  are arranged suc
1e460 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63  h that we.  ** c
1e470 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d  an compute the m
1e480 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69  apping above usi
1e490 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
1e4a0 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a   expression..  *
1e4b0 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69  * Assert()s veri
1e4c0 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70  fy that the comp
1e4d0 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65  utation is corre
1e4e0 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  ct..  */.  op = 
1e4f0 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f  ((pExpr->op+(TK_
1e500 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54  ISNULL&1))^1)-(T
1e510 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20  K_ISNULL&1);..  
1e520 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63  /* Verify correc
1e530 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54  t alignment of T
1e540 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
1e550 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ants.  */.  asse
1e560 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1e570 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  K_ISNULL || op==
1e580 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20  OP_NotNull );.  
1e590 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1e5a0 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c  p!=TK_NOTNULL ||
1e5b0 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29   op==OP_IsNull )
1e5c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1e5d0 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20  r->op!=TK_NE || 
1e5e0 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61  op==OP_Eq );.  a
1e5f0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1e600 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_EQ || op==O
1e610 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ne );.  assert
1e620 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1e630 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20  LT || op==OP_Ge 
1e640 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
1e650 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c  pr->op!=TK_LE ||
1e660 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20   op==OP_Gt );.  
1e670 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1e680 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_GT || op==
1e690 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Le );.  asser
1e6a0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1e6b0 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74  _GE || op==OP_Lt
1e6c0 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   );..  switch( p
1e6d0 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
1e6e0 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
1e6f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1e700 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1e710 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1e720 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
1e730 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
1e740 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1e750 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1e760 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1e770 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1e780 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1e790 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
1e7a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e7b0 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
1e7c0 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
1e7d0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1e7e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e7f0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1e800 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e810 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
1e820 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
1e830 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
1e840 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1e850 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e  eft, d2, jumpIfN
1e860 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ull^SQLITE_JUMPI
1e870 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  FNULL);.      sq
1e880 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1e890 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1e8a0 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
1e8b0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1e8c0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1e8d0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b  lveLabel(v, d2);
1e8e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1e8f0 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
1e900 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65  e, 1);.      bre
1e910 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1e920 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
1e930 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1e940 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1e950 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1e960 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
1e970 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
1e980 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1e990 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e9a0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
1e9b0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
1e9c0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
1e9d0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
1e9e0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
1e9f0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
1ea00 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1ea10 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b  se( op==TK_LT );
1ea20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ea30 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20   op==TK_LE );.  
1ea40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1ea50 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20  ==TK_GT );.     
1ea60 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1ea70 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_GE );.      te
1ea80 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45  stcase( op==TK_E
1ea90 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Q );.      testc
1eaa0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29  ase( op==TK_NE )
1eab0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1eac0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1ead0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1eae0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1eaf0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1eb00 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1eb10 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
1eb20 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1eb30 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1eb40 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
1eb50 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
1eb60 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
1eb70 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
1eb80 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
1eb90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1eba0 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
1ebb0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1ebc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1ebd0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1ebe0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1ebf0 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
1ec00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1ec10 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20     case TK_IS:. 
1ec20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
1ec30 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1ec40 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
1ec50 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65  K_IS );.      te
1ec60 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
1ec70 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20  p==TK_ISNOT );. 
1ec80 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1ec90 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1eca0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1ecb0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1ecc0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
1ecd0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1ece0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1ecf0 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
1ed00 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 70 45  ;.      op = (pE
1ed10 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20  xpr->op==TK_IS) 
1ed20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b  ? TK_NE : TK_EQ;
1ed30 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
1ed40 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
1ed50 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
1ed60 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
1ed70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
1ed80 2c 20 72 32 2c 20 64 65 73 74 2c 20 53 51 4c 49  , r2, dest, SQLI
1ed90 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
1eda0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1edb0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1edc0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1edd0 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1ede0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1edf0 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
1ee00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
1ee10 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 74 65  NULL: {.      te
1ee20 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
1ee30 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74  SNULL );.      t
1ee40 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1ee50 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  NOTNULL );.     
1ee60 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1ee70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1ee80 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1ee90 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1eea0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1eeb0 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64  Op2(v, op, r1, d
1eec0 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
1eed0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1eee0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1eef0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1ef00 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
1ef10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1ef20 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1ef30 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65        exprCodeBe
1ef40 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45  tween(pParse, pE
1ef50 78 70 72 2c 20 64 65 73 74 2c 20 30 2c 20 6a 75  xpr, dest, 0, ju
1ef60 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1ef70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
1ef80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ef90 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
1efa0 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
1efb0 20 20 20 69 66 28 20 6a 75 6d 70 49 66 4e 75 6c     if( jumpIfNul
1efc0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
1efd0 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
1efe0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
1eff0 73 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  st, dest);.     
1f000 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f010 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d  int destIfNull =
1f020 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1f030 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
1f040 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1f050 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  eIN(pParse, pExp
1f060 72 2c 20 64 65 73 74 2c 20 64 65 73 74 49 66 4e  r, dest, destIfN
1f070 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ull);.        sq
1f080 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1f090 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e  Label(v, destIfN
1f0a0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ull);.      }.  
1f0b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f0c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61  .#endif.    defa
1f0d0 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 31 20  ult: {.      r1 
1f0e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1f0f0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1f100 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b  xpr, &regFree1);
1f110 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1f120 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
1f130 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20  fNot, r1, dest, 
1f140 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
1f150 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f160 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1f170 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1f180 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1f190 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f1a0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
1f1b0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1f1c0 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
1f1d0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
1f1e0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1f1f0 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a  , regFree2);.}..
1f200 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20  /*.** Do a deep 
1f210 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77  comparison of tw
1f220 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  o expression tre
1f230 65 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  es.  Return 0 if
1f240 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72   the two.** expr
1f250 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70  essions are comp
1f260 6c 65 74 65 6c 79 20 69 64 65 6e 74 69 63 61 6c  letely identical
1f270 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
1f280 68 65 79 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a  hey differ only.
1f290 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54 45 20  ** by a COLLATE 
1f2a0 6f 70 65 72 61 74 6f 72 20 61 74 20 74 68 65 20  operator at the 
1f2b0 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65 74 75  top level.  Retu
1f2c0 72 6e 20 32 20 69 66 20 74 68 65 72 65 20 61 72  rn 2 if there ar
1f2d0 65 20 64 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a  e differences.**
1f2e0 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
1f2f0 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54  top-level COLLAT
1f300 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a  E operator..**.*
1f310 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73  * Sometimes this
1f320 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
1f330 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20 74  turn 2 even if t
1f340 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  he two expressio
1f350 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65  ns.** really are
1f360 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66   equivalent.  If
1f370 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65   we cannot prove
1f380 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
1f390 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65  sions are.** ide
1f3a0 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72  ntical, we retur
1f3b0 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20 73  n 2 just to be s
1f3c0 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73  afe.  So if this
1f3d0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
1f3e0 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75 20  rns 2, then you 
1f3f0 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e  do not really kn
1f400 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69  ow for certain i
1f410 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70  f the two.** exp
1f420 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65  ressions are the
1f430 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79   same.  But if y
1f440 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20 31 20  ou get a 0 or 1 
1f450 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75  return, then you
1f460 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20  .** can be sure 
1f470 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
1f480 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49  are the same.  I
1f490 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68 65  n the places whe
1f4a0 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
1f4b0 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20 64  ne is used, it d
1f4c0 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20  oes not hurt to 
1f4d0 67 65 74 20 61 6e 20 65 78 74 72 61 20 32 20 2d  get an extra 2 -
1f4e0 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69   that.** just mi
1f4f0 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f  ght result in so
1f500 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77  me slightly slow
1f510 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65  er code.  But re
1f520 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e  turning.** an in
1f530 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20 63  correct 0 or 1 c
1f540 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d  ould lead to a m
1f550 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  alfunction..*/.i
1f560 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
1f570 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20  mpare(Expr *pA, 
1f580 45 78 70 72 20 2a 70 42 29 7b 0a 20 20 69 66 28  Expr *pB){.  if(
1f590 20 70 41 3d 3d 30 7c 7c 70 42 3d 3d 30 20 29 7b   pA==0||pB==0 ){
1f5a0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d  .    return pB==
1f5b0 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a  pA ? 0 : 2;.  }.
1f5c0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1f5d0 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 41  asAnyProperty(pA
1f5e0 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
1f5f0 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
1f600 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1f610 41 6e 79 50 72 6f 70 65 72 74 79 28 70 42 2c 20  AnyProperty(pB, 
1f620 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
1f630 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 69 66  Reduced) );.  if
1f640 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1f650 79 28 70 41 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pA, EP_xIsSele
1f660 63 74 29 20 7c 7c 20 45 78 70 72 48 61 73 50 72  ct) || ExprHasPr
1f670 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f 78 49  operty(pB, EP_xI
1f680 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
1f690 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20  return 2;.  }.  
1f6a0 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26  if( (pA->flags &
1f6b0 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28   EP_Distinct)!=(
1f6c0 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pB->flags & EP_D
1f6d0 69 73 74 69 6e 63 74 29 20 29 20 72 65 74 75 72  istinct) ) retur
1f6e0 6e 20 32 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6f  n 2;.  if( pA->o
1f6f0 70 21 3d 70 42 2d 3e 6f 70 20 29 20 72 65 74 75  p!=pB->op ) retu
1f700 72 6e 20 32 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 2;.  if( sqli
1f710 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
1f720 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c  A->pLeft, pB->pL
1f730 65 66 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b  eft) ) return 2;
1f740 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
1f750 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52  prCompare(pA->pR
1f760 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74  ight, pB->pRight
1f770 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
1f780 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
1f790 69 73 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78  istCompare(pA->x
1f7a0 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c  .pList, pB->x.pL
1f7b0 69 73 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b  ist) ) return 2;
1f7c0 0a 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c  .  if( pA->iTabl
1f7d0 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c  e!=pB->iTable ||
1f7e0 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42   pA->iColumn!=pB
1f7f0 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75  ->iColumn ) retu
1f800 72 6e 20 32 3b 0a 20 20 69 66 28 20 45 78 70 72  rn 2;.  if( Expr
1f810 48 61 73 50 72 6f 70 65 72 74 79 28 70 41 2c 20  HasProperty(pA, 
1f820 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 7b 0a  EP_IntValue) ){.
1f830 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
1f840 50 72 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f  Property(pB, EP_
1f850 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70 41 2d  IntValue) || pA-
1f860 3e 75 2e 69 56 61 6c 75 65 21 3d 70 42 2d 3e 75  >u.iValue!=pB->u
1f870 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20  .iValue ){.     
1f880 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
1f890 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 2d  .  }else if( pA-
1f8a0 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op!=TK_COLUMN &
1f8b0 26 20 41 4c 57 41 59 53 28 70 41 2d 3e 6f 70 21  & ALWAYS(pA->op!
1f8c0 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20  =TK_AGG_COLUMN) 
1f8d0 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  && pA->u.zToken)
1f8e0 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  {.    if( ExprHa
1f8f0 73 50 72 6f 70 65 72 74 79 28 70 42 2c 20 45 50  sProperty(pB, EP
1f900 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 4e 45  _IntValue) || NE
1f910 56 45 52 28 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e  VER(pB->u.zToken
1f920 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 32 3b  ==0) ) return 2;
1f930 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
1f940 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d  pA->u.zToken,pB-
1f950 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b  >u.zToken)!=0 ){
1f960 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b  .      return 2;
1f970 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1f980 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50   (pA->flags & EP
1f990 5f 45 78 70 43 6f 6c 6c 61 74 65 29 21 3d 28 70  _ExpCollate)!=(p
1f9a0 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  B->flags & EP_Ex
1f9b0 70 43 6f 6c 6c 61 74 65 29 20 29 20 72 65 74 75  pCollate) ) retu
1f9c0 72 6e 20 31 3b 0a 20 20 69 66 28 20 28 70 41 2d  rn 1;.  if( (pA-
1f9d0 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
1f9e0 6f 6c 6c 61 74 65 29 21 3d 30 20 26 26 20 70 41  ollate)!=0 && pA
1f9f0 2d 3e 70 43 6f 6c 6c 21 3d 70 42 2d 3e 70 43 6f  ->pColl!=pB->pCo
1fa00 6c 6c 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  ll ) return 2;. 
1fa10 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1fa20 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  .** Compare two 
1fa30 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73  ExprList objects
1fa40 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  .  Return 0 if t
1fa50 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61  hey are identica
1fa60 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65  l and .** non-ze
1fa70 72 6f 20 69 66 20 74 68 65 79 20 64 69 66 66 65  ro if they diffe
1fa80 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a  r in any way..**
1fa90 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1faa0 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 6e 6f   might return no
1fab0 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75 69 76  n-zero for equiv
1fac0 61 6c 65 6e 74 20 45 78 70 72 4c 69 73 74 73 2e  alent ExprLists.
1fad0 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f    The.** only co
1fae0 6e 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 62  nsequence will b
1faf0 65 20 64 69 73 61 62 6c 65 64 20 6f 70 74 69 6d  e disabled optim
1fb00 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74 20 74  izations.  But t
1fb10 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d  his routine.** m
1fb20 75 73 74 20 6e 65 76 65 72 20 72 65 74 75 72 6e  ust never return
1fb30 20 30 20 69 66 20 74 68 65 20 74 77 6f 20 45 78   0 if the two Ex
1fb40 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 20 61  prList objects a
1fb50 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 6f 72  re different, or
1fb60 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f  .** a malfunctio
1fb70 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a  n will result..*
1fb80 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 70 6f  *.** Two NULL po
1fb90 69 6e 74 65 72 73 20 61 72 65 20 63 6f 6e 73 69  inters are consi
1fba0 64 65 72 65 64 20 74 6f 20 62 65 20 74 68 65 20  dered to be the 
1fbb0 73 61 6d 65 2e 20 20 42 75 74 20 61 20 4e 55 4c  same.  But a NUL
1fbc0 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c 77  L pointer.** alw
1fbd0 61 79 73 20 64 69 66 66 65 72 73 20 66 72 6f 6d  ays differs from
1fbe0 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e   a non-NULL poin
1fbf0 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
1fc00 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
1fc10 72 65 28 45 78 70 72 4c 69 73 74 20 2a 70 41 2c  re(ExprList *pA,
1fc20 20 45 78 70 72 4c 69 73 74 20 2a 70 42 29 7b 0a   ExprList *pB){.
1fc30 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1fc40 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20  A==0 && pB==0 ) 
1fc50 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
1fc60 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29  pA==0 || pB==0 )
1fc70 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
1fc80 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e   pA->nExpr!=pB->
1fc90 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 31  nExpr ) return 1
1fca0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1fcb0 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  A->nExpr; i++){.
1fcc0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 41      Expr *pExprA
1fcd0 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70   = pA->a[i].pExp
1fce0 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  r;.    Expr *pEx
1fcf0 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70  prB = pB->a[i].p
1fd00 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41  Expr;.    if( pA
1fd10 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
1fd20 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  !=pB->a[i].sortO
1fd30 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b  rder ) return 1;
1fd40 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1fd50 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70  ExprCompare(pExp
1fd60 72 41 2c 20 70 45 78 70 72 42 29 20 29 20 72 65  rA, pExprB) ) re
1fd70 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
1fd80 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1fd90 20 54 68 69 73 20 69 73 20 74 68 65 20 65 78 70   This is the exp
1fda0 72 65 73 73 69 6f 6e 20 63 61 6c 6c 62 61 63 6b  ression callback
1fdb0 20 66 6f 72 20 73 71 6c 69 74 65 33 46 75 6e 63   for sqlite3Func
1fdc0 74 69 6f 6e 55 73 65 73 4f 74 68 65 72 53 72 63  tionUsesOtherSrc
1fdd0 28 29 2e 0a 2a 2a 0a 2a 2a 20 44 65 74 65 72 6d  ()..**.** Determ
1fde0 69 6e 65 20 69 66 20 61 6e 20 65 78 70 72 65 73  ine if an expres
1fdf0 73 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 73 20  sion references 
1fe00 61 6e 79 20 74 61 62 6c 65 20 6f 74 68 65 72 20  any table other 
1fe10 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 0a  than one of the.
1fe20 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 70 57 61  ** tables in pWa
1fe30 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 4c 69 73 74  lker->u.pSrcList
1fe40 20 61 6e 64 20 61 62 6f 72 74 20 69 66 20 69 74   and abort if it
1fe50 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   does..*/.static
1fe60 20 69 6e 74 20 65 78 70 72 55 73 65 73 4f 74 68   int exprUsesOth
1fe70 65 72 53 72 63 28 57 61 6c 6b 65 72 20 2a 70 57  erSrc(Walker *pW
1fe80 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
1fe90 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  pr){.  if( pExpr
1fea0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
1feb0 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1fec0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  _AGG_COLUMN ){. 
1fed0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 53 72     int i;.    Sr
1fee0 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 57  cList *pSrc = pW
1fef0 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 4c 69 73  alker->u.pSrcLis
1ff00 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
1ff10 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
1ff20 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  +){.      if( pE
1ff30 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72  xpr->iTable==pSr
1ff40 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20  c->a[i].iCursor 
1ff50 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
1ff60 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
1ff70 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
1ff80 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
1ff90 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
1ffa0 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  nue;.  }.}../*.*
1ffb0 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61  * Determine if a
1ffc0 6e 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65  ny of the argume
1ffd0 6e 74 73 20 74 6f 20 74 68 65 20 70 45 78 70 72  nts to the pExpr
1ffe0 20 46 75 6e 63 74 69 6f 6e 20 72 65 66 65 72 65   Function refere
1fff0 6e 63 65 73 0a 2a 2a 20 61 6e 79 20 53 72 63 4c  nces.** any SrcL
20000 69 73 74 20 6f 74 68 65 72 20 74 68 61 6e 20 70  ist other than p
20010 53 72 63 4c 69 73 74 2e 20 20 52 65 74 75 72 6e  SrcList.  Return
20020 20 74 72 75 65 20 69 66 20 74 68 65 79 20 64 6f   true if they do
20030 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 66 61 6c  .  Return.** fal
20040 73 65 20 69 66 20 70 45 78 70 72 20 68 61 73 20  se if pExpr has 
20050 6e 6f 20 61 72 67 75 6d 65 6e 74 20 6f 72 20 68  no argument or h
20060 61 73 20 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74  as only constant
20070 20 61 72 67 75 6d 65 6e 74 73 20 6f 72 0a 2a 2a   arguments or.**
20080 20 6f 6e 6c 79 20 72 65 66 65 72 65 6e 63 65 73   only references
20090 20 74 61 62 6c 65 73 20 6e 61 6d 65 64 20 69 6e   tables named in
200a0 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 73 74   pSrcList..*/.st
200b0 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
200c0 46 75 6e 63 74 69 6f 6e 55 73 65 73 4f 74 68 65  FunctionUsesOthe
200d0 72 53 72 63 28 45 78 70 72 20 2a 70 45 78 70 72  rSrc(Expr *pExpr
200e0 2c 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c  , SrcList *pSrcL
200f0 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  ist){.  Walker w
20100 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
20110 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  r->op==TK_AGG_FU
20120 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 6d 65 6d 73  NCTION );.  mems
20130 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&w, 0, sizeof
20140 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43  (w));.  w.xExprC
20150 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 55 73  allback = exprUs
20160 65 73 4f 74 68 65 72 53 72 63 3b 0a 20 20 77 2e  esOtherSrc;.  w.
20170 75 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 72  u.pSrcList = pSr
20180 63 4c 69 73 74 3b 0a 20 20 69 66 28 20 73 71 6c  cList;.  if( sql
20190 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74  ite3WalkExprList
201a0 28 26 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  (&w, pExpr->x.pL
201b0 69 73 74 29 21 3d 57 52 43 5f 43 6f 6e 74 69 6e  ist)!=WRC_Contin
201c0 75 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ue ) return 1;. 
201d0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
201e0 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
201f0 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
20200 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72  gInfo->aCol[] ar
20210 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
20220 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
20230 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
20240 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
20250 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
20260 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
20270 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
20280 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20  oColumn(sqlite3 
20290 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49  *db, AggInfo *pI
202a0 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nfo){.  int i;. 
202b0 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73   pInfo->aCol = s
202c0 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
202d0 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a  ate(.       db,.
202e0 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43         pInfo->aC
202f0 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f  ol,.       sizeo
20300 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d  f(pInfo->aCol[0]
20310 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f  ),.       &pInfo
20320 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ->nColumn,.     
20330 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
20340 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
20350 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
20360 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67  ment to the pAgg
20370 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72  Info->aFunc[] ar
20380 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
20390 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
203a0 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
203b0 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
203c0 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
203d0 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
203e0 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
203f0 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64  oFunc(sqlite3 *d
20400 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66  b, AggInfo *pInf
20410 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70  o){.  int i;.  p
20420 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71  Info->aFunc = sq
20430 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
20440 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a  te(.       db, .
20450 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46         pInfo->aF
20460 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65  unc,.       size
20470 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  of(pInfo->aFunc[
20480 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e  0]),.       &pIn
20490 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20  fo->nFunc,.     
204a0 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
204b0 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
204c0 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
204d0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72  ExprCallback for
204e0 20 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20   a tree walker. 
204f0 20 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a   It is used to.*
20500 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69  * implement sqli
20510 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
20520 67 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65  gregates().  See
20530 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
20540 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a  yzeAggregates.**
20550 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
20560 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
20570 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
20580 7a 65 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b  zeAggregate(Walk
20590 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
205a0 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
205b0 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
205c0 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72  t *pNC = pWalker
205d0 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65  ->u.pNC;.  Parse
205e0 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e   *pParse = pNC->
205f0 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73  pParse;.  SrcLis
20600 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e  t *pSrcList = pN
20610 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41  C->pSrcList;.  A
20620 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
20630 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f   = pNC->pAggInfo
20640 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ;..  switch( pEx
20650 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
20660 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
20670 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
20680 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  LUMN: {.      te
20690 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
206a0 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
206b0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
206c0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
206d0 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
206e0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
206f0 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e if the column 
20700 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  is in one of the
20710 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
20720 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61  ROM.      ** cla
20730 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65  use of the aggre
20740 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  gate query */.  
20750 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
20760 53 72 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20  SrcList!=0) ){. 
20770 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
20780 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
20790 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b  m = pSrcList->a;
207a0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
207b0 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
207c0 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
207d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
207e0 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
207f0 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  *pCol;.         
20800 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
20810 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78  sAnyProperty(pEx
20820 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
20830 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
20840 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
20850 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
20860 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20  em->iCursor ){. 
20870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
20880 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
20890 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74  oint, it means t
208a0 68 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73  hat pExpr refers
208b0 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20   to a table.    
208c0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
208d0 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  is in the FROM c
208e0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67  lause of the agg
208f0 72 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a  regate query.  .
20900 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20              **. 
20910 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61             ** Ma
20920 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ke an entry for 
20930 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41  the column in pA
20940 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69  ggInfo->aCol[] i
20950 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20  f there.        
20960 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e      ** is not an
20970 20 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72   entry there alr
20980 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20  eady..          
20990 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
209a0 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20   int k;.        
209b0 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49      pCol = pAggI
209c0 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  nfo->aCol;.     
209d0 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20         for(k=0; 
209e0 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  k<pAggInfo->nCol
209f0 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b  umn; k++, pCol++
20a00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
20a10 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c   if( pCol->iTabl
20a20 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
20a30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
20a40 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
20a50 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
20a60 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
20a70 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
20a80 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
20a90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
20aa0 20 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d          if( (k>=
20ab0 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
20ac0 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n).             
20ad0 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e  && (k = addAggIn
20ae0 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d  foColumn(pParse-
20af0 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e  >db, pAggInfo))>
20b00 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
20b10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
20b20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66   pCol = &pAggInf
20b30 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20  o->aCol[k];.    
20b40 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
20b50 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
20b60 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab;.            
20b70 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d    pCol->iTable =
20b80 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
20b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
20ba0 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  ol->iColumn = pE
20bb0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
20bc0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
20bd0 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  ->iMem = ++pPars
20be0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
20bf0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
20c00 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  rterColumn = -1;
20c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
20c20 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  Col->pExpr = pEx
20c30 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
20c40 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e    if( pAggInfo->
20c50 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
20c60 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
20c70 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  j, n;.          
20c80 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
20c90 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  pGB = pAggInfo->
20ca0 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  pGroupBy;.      
20cb0 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
20cc0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
20cd0 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a  pTerm = pGB->a;.
20ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cf0 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a  n = pGB->nExpr;.
20d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d10 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b  for(j=0; j<n; j+
20d20 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
20d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
20d40 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d  xpr *pE = pTerm-
20d50 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
20d60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
20d70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
20d80 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70  && pE->iTable==p
20d90 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a  Expr->iTable &&.
20da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20db0 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d        pE->iColum
20dc0 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
20dd0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
20de0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
20df0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a  SorterColumn = j
20e00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
20e10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
20e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20e40 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
20e50 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
20e60 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74   if( pCol->iSort
20e70 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  erColumn<0 ){.  
20e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
20e90 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
20ea0 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53  n = pAggInfo->nS
20eb0 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a  ortingColumn++;.
20ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
20ed0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
20ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
20ef0 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74  re is now an ent
20f00 72 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20  ry for pExpr in 
20f10 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
20f20 20 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20   (either.       
20f30 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20       ** because 
20f40 69 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66  it was there bef
20f50 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77  ore or because w
20f60 65 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69  e just created i
20f70 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  t)..            
20f80 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70  ** Convert the p
20f90 45 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f  Expr to be a TK_
20fa0 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72  AGG_COLUMN refer
20fb0 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20  ring to that.   
20fc0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67           ** pAgg
20fd0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74  Info->aCol[] ent
20fe0 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
20ff0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  */.            E
21000 78 70 72 53 65 74 49 72 72 65 64 75 63 69 62 6c  xprSetIrreducibl
21010 65 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  e(pExpr);.      
21020 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67        pExpr->pAg
21030 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f  gInfo = pAggInfo
21040 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
21050 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
21060 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
21070 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
21080 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20   = (i16)k;.     
21090 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
210a0 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
210b0 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  if pExpr->iTable
210c0 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
210d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a   */.        } /*
210e0 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70   end loop over p
210f0 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20  SrcList */.     
21100 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
21110 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d  WRC_Prune;.    }
21120 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
21130 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
21140 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46     if( (pNC->ncF
21150 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41 67 67 46  lags & NC_InAggF
21160 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20 20 26  unc)==0.       &
21170 26 20 21 73 71 6c 69 74 65 33 46 75 6e 63 74 69  & !sqlite3Functi
21180 6f 6e 55 73 65 73 4f 74 68 65 72 53 72 63 28 70  onUsesOtherSrc(p
21190 45 78 70 72 2c 20 70 53 72 63 4c 69 73 74 29 0a  Expr, pSrcList).
211a0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
211b0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
211c0 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64   if pExpr is a d
211d0 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74  uplicate of anot
211e0 68 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20  her aggregate . 
211f0 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
21200 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61  on that is alrea
21210 64 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e  dy in the pAggIn
21220 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20  fo structure.   
21230 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
21240 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
21250 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67  unc *pItem = pAg
21260 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20  gInfo->aFunc;.  
21270 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
21280 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
21290 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
212a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
212b0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
212c0 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20  e(pItem->pExpr, 
212d0 70 45 78 70 72 29 3d 3d 30 20 29 7b 0a 20 20 20  pExpr)==0 ){.   
212e0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
212f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21300 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
21310 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e  ( i>=pAggInfo->n
21320 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Func ){.        
21330 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72    /* pExpr is or
21340 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20  iginal.  Make a 
21350 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67  new entry in pAg
21360 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20  gInfo->aFunc[]. 
21370 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
21380 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45        u8 enc = E
21390 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  NC(pParse->db);.
213a0 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 61 64            i = ad
213b0 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61  dAggInfoFunc(pPa
213c0 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66  rse->db, pAggInf
213d0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  o);.          if
213e0 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( i>=0 ){.      
213f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
21400 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
21410 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
21420 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ct) );.         
21430 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67     pItem = &pAgg
21440 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a  Info->aFunc[i];.
21450 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
21460 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
21470 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
21480 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50  tem->iMem = ++pP
21490 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
214a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
214b0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
214c0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
214d0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
214e0 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63      pItem->pFunc
214f0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
21500 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
21510 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
21520 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a        pExpr->u.z
21530 54 6f 6b 65 6e 2c 20 73 71 6c 69 74 65 33 53 74  Token, sqlite3St
21540 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e  rlen30(pExpr->u.
21550 7a 54 6f 6b 65 6e 29 2c 0a 20 20 20 20 20 20 20  zToken),.       
21560 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
21570 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45 78  r->x.pList ? pEx
21580 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
21590 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b  pr : 0, enc, 0);
215a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
215b0 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
215c0 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  EP_Distinct ){. 
215d0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
215e0 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  em->iDistinct = 
215f0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
21600 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
21610 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
21620 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63   pItem->iDistinc
21630 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  t = -1;.        
21640 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21650 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
21660 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70      /* Make pExp
21670 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61  r point to the a
21680 70 70 72 6f 70 72 69 61 74 65 20 70 41 67 67 49  ppropriate pAggI
21690 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74  nfo->aFunc[] ent
216a0 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ry.        */.  
216b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
216c0 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
216d0 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
216e0 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
216f0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70  ) );.        Exp
21700 72 53 65 74 49 72 72 65 64 75 63 69 62 6c 65 28  rSetIrreducible(
21710 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
21720 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69  pExpr->iAgg = (i
21730 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70 45  16)i;.        pE
21740 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20  xpr->pAggInfo = 
21750 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
21760 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  }.      return W
21770 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a  RC_Prune;.    }.
21780 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
21790 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61  _Continue;.}.sta
217a0 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41  tic int analyzeA
217b0 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63  ggregatesInSelec
217c0 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
217d0 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  r, Select *pSele
217e0 63 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ct){.  UNUSED_PA
217f0 52 41 4d 45 54 45 52 28 70 57 61 6c 6b 65 72 29  RAMETER(pWalker)
21800 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
21810 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20  ETER(pSelect);. 
21820 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
21830 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  inue;.}../*.** A
21840 6e 61 6c 79 7a 65 20 74 68 65 20 67 69 76 65 6e  nalyze the given
21850 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b   expression look
21860 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
21870 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a  e functions and.
21880 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73  ** for variables
21890 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
218a0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 50   added to the pP
218b0 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72  arse->aAgg[] arr
218c0 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61 64 64 69  ay..** Make addi
218d0 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 74  tional entries t
218e0 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41  o the pParse->aA
218f0 67 67 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65  gg[] array as ne
21900 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  cessary..**.** T
21910 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
21920 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
21930 64 20 61 66 74 65 72 20 74 68 65 20 65 78 70 72  d after the expr
21940 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a  ession has been.
21950 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73  ** analyzed by s
21960 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
21970 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69  rNames()..*/.voi
21980 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  d sqlite3ExprAna
21990 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e  lyzeAggregates(N
219a0 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
219b0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
219c0 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d   Walker w;.  mem
219d0 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
219e0 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72  f(w));.  w.xExpr
219f0 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79  Callback = analy
21a00 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77  zeAggregate;.  w
21a10 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
21a20 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67   = analyzeAggreg
21a30 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20  atesInSelect;.  
21a40 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20  w.u.pNC = pNC;. 
21a50 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53   assert( pNC->pS
21a60 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73  rcList!=0 );.  s
21a70 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
21a80 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  w, pExpr);.}../*
21a90 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  .** Call sqlite3
21aa0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
21ab0 67 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72  gates() for ever
21ac0 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
21ad0 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  an.** expression
21ae0 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74   list.  Return t
21af0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
21b00 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ors..**.** If an
21b10 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c   error is found,
21b20 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73   the analysis is
21b30 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76   cut short..*/.v
21b40 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
21b50 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61  nalyzeAggList(Na
21b60 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
21b70 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
21b80 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
21b90 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
21ba0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
21bb0 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
21bc0 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
21bd0 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e   i=0; i<pList->n
21be0 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
21bf0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
21c00 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
21c10 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74  regates(pNC, pIt
21c20 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
21c30 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
21c40 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65  llocate a single
21c50 20 6e 65 77 20 72 65 67 69 73 74 65 72 20 66 6f   new register fo
21c60 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f  r use to hold so
21c70 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  me intermediate 
21c80 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73  result..*/.int s
21c90 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
21ca0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
21cb0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
21cc0 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20  TempReg==0 ){.  
21cd0 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73    return ++pPars
21ce0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72  e->nMem;.  }.  r
21cf0 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54  eturn pParse->aT
21d00 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d  empReg[--pParse-
21d10 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f  >nTempReg];.}../
21d20 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
21d30 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69  a register, maki
21d40 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ng available for
21d50 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20   reuse for some 
21d60 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65  other.** purpose
21d70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67  ..**.** If a reg
21d80 69 73 74 65 72 20 69 73 20 63 75 72 72 65 6e 74  ister is current
21d90 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20 62 79  ly being used by
21da0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
21db0 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64  e, then.** the d
21dc0 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64 65  allocation is de
21dd0 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65  ferred until the
21de0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69   column cache li
21df0 6e 65 20 74 68 61 74 20 75 73 65 73 0a 2a 2a 20  ne that uses.** 
21e00 74 68 65 20 72 65 67 69 73 74 65 72 20 62 65 63  the register bec
21e10 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76  omes stale..*/.v
21e20 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61  oid sqlite3Relea
21e30 73 65 54 65 6d 70 52 65 67 28 50 61 72 73 65 20  seTempReg(Parse 
21e40 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
21e50 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26  g){.  if( iReg &
21e60 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  & pParse->nTempR
21e70 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61  eg<ArraySize(pPa
21e80 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29  rse->aTempReg) )
21e90 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
21ea0 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
21eb0 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d  e *p;.    for(i=
21ec0 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
21ed0 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
21ee0 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
21ef0 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  , p++){.      if
21f00 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20  ( p->iReg==iReg 
21f10 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 65  ){.        p->te
21f20 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20  mpReg = 1;.     
21f30 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
21f40 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61   }.    }.    pPa
21f50 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50  rse->aTempReg[pP
21f60 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b  arse->nTempReg++
21f70 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a  ] = iReg;.  }.}.
21f80 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
21f90 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20  or deallocate a 
21fa0 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f  block of nReg co
21fb0 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74  nsecutive regist
21fc0 65 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ers.*/.int sqlit
21fd0 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50  e3GetTempRange(P
21fe0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
21ff0 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t nReg){.  int i
22000 2c 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72 73  , n;.  i = pPars
22010 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20  e->iRangeReg;.  
22020 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e  n = pParse->nRan
22030 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65  geReg;.  if( nRe
22040 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  g<=n ){.    asse
22050 72 74 28 20 21 75 73 65 64 41 73 43 6f 6c 75 6d  rt( !usedAsColum
22060 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69  nCache(pParse, i
22070 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20  , i+n-1) );.    
22080 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
22090 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70  g += nReg;.    p
220a0 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
220b0 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73   -= nReg;.  }els
220c0 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73  e{.    i = pPars
220d0 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
220e0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
220f0 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Reg;.  }.  retur
22100 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  n i;.}.void sqli
22110 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
22120 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
22130 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74  e, int iReg, int
22140 20 6e 52 65 67 29 7b 0a 20 20 73 71 6c 69 74 65   nReg){.  sqlite
22150 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
22160 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e  (pParse, iReg, n
22170 52 65 67 29 3b 0a 20 20 69 66 28 20 6e 52 65 67  Reg);.  if( nReg
22180 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52  >pParse->nRangeR
22190 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  eg ){.    pParse
221a0 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52  ->nRangeReg = nR
221b0 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  eg;.    pParse->
221c0 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67  iRangeReg = iReg
221d0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
221e0 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72  ark all temporar
221f0 79 20 72 65 67 69 73 74 65 72 73 20 61 73 20 62  y registers as b
22200 65 69 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c 65  eing unavailable
22210 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76   for reuse..*/.v
22220 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72  oid sqlite3Clear
22230 54 65 6d 70 52 65 67 43 61 63 68 65 28 50 61 72  TempRegCache(Par
22240 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70  se *pParse){.  p
22250 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20  Parse->nTempReg 
22260 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
22270 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a  RangeReg = 0;.}.