/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 7490fc3b16414d1a45d5acadf559317f9244891f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 73   clause expresss
0370: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0380: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0390: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
03a0: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
03b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
03c0: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
03d0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
03e0: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
03f0: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0400: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
0410: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
0420: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
0430: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
0440: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
0450: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
0460: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
0470: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  .  if( op==TK_SE
0480: 4c 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65  LECT ){.    asse
0490: 72 74 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  rt( pExpr->flags
04a0: 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b  &EP_xIsSelect );
04b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
04c0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
04d0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
04e0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
04f0: 45 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  Expr);.  }.#ifnd
0500: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
0510: 41 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  AST.  if( op==TK
0520: 5f 43 41 53 54 20 29 7b 0a 20 20 20 20 61 73 73  _CAST ){.    ass
0530: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
0540: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
0550: 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
0560: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41   return sqlite3A
0570: 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70  ffinityType(pExp
0580: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
0590: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 28  }.#endif.  if( (
05a0: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
05b0: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  N || op==TK_COLU
05c0: 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47  MN || op==TK_REG
05d0: 49 53 54 45 52 29 20 0a 20 20 20 26 26 20 70 45  ISTER) .   && pE
05e0: 78 70 72 2d 3e 70 54 61 62 21 3d 30 0a 20 20 29  xpr->pTab!=0.  )
05f0: 7b 0a 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f  {.    /* op==TK_
0600: 52 45 47 49 53 54 45 52 20 26 26 20 70 45 78 70  REGISTER && pExp
0610: 72 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65  r->pTab!=0 happe
0620: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
0630: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
0640: 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20   ** a TK_COLUMN 
0650: 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  but was previous
0660: 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  ly evaluated and
0670: 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67   cached in a reg
0680: 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  ister */.    int
0690: 20 6a 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c   j = pExpr->iCol
06a0: 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30  umn;.    if( j<0
06b0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
06c0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
06d0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
06e0: 3e 70 54 61 62 20 26 26 20 6a 3c 70 45 78 70 72  >pTab && j<pExpr
06f0: 2d 3e 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  ->pTab->nCol );.
0700: 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
0710: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
0720: 61 66 66 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20  affinity;.  }.  
0730: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66  return pExpr->af
0740: 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  finity;.}../*.**
0750: 20 53 65 74 20 74 68 65 20 65 78 70 6c 69 63 69   Set the explici
0760: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
0770: 65 6e 63 65 20 66 6f 72 20 61 6e 20 65 78 70 72  ence for an expr
0780: 65 73 73 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a  ession to the.**
0790: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
07a0: 6e 63 65 20 73 75 70 70 6c 69 65 64 20 69 6e 20  nce supplied in 
07b0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
07c0: 65 6e 74 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ent..*/.Expr *sq
07d0: 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f 6c 6c  lite3ExprSetColl
07e0: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 43 6f  (Expr *pExpr, Co
07f0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
0800: 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70 43   if( pExpr && pC
0810: 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 45 78 70 72  oll ){.    pExpr
0820: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b  ->pColl = pColl;
0830: 0a 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67  .    pExpr->flag
0840: 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61  s |= EP_ExpColla
0850: 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  te;.  }.  return
0860: 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pExpr;.}../*.**
0870: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
0880: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
0890: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
08a0: 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61   to be the colla
08b0: 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
08c0: 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e   named by pToken
08d0: 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .   Return a poi
08e0: 6e 74 65 72 20 74 6f 20 74 68 65 20 72 65 76 69  nter to the revi
08f0: 73 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  sed expression..
0900: 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** The collating
0910: 20 73 65 71 75 65 6e 63 65 20 69 73 20 6d 61 72   sequence is mar
0920: 6b 65 64 20 61 73 20 22 65 78 70 6c 69 63 69 74  ked as "explicit
0930: 22 20 75 73 69 6e 67 20 74 68 65 20 45 50 5f 45  " using the EP_E
0940: 78 70 43 6f 6c 6c 61 74 65 0a 2a 2a 20 66 6c 61  xpCollate.** fla
0950: 67 2e 20 20 41 6e 20 65 78 70 6c 69 63 69 74 20  g.  An explicit 
0960: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0970: 63 65 20 77 69 6c 6c 20 6f 76 65 72 72 69 64 65  ce will override
0980: 20 69 6d 70 6c 69 63 69 74 0a 2a 2a 20 63 6f 6c   implicit.** col
0990: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
09a0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
09b0: 65 33 45 78 70 72 53 65 74 43 6f 6c 6c 42 79 54  e3ExprSetCollByT
09c0: 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72  oken(Parse *pPar
09d0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
09e0: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d   Token *pCollNam
09f0: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c  e){.  char *zCol
0a00: 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
0a10: 20 20 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61    /* Dequoted na
0a20: 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20  me of collation 
0a30: 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 43 6f  sequence */.  Co
0a40: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
0a50: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
0a60: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c  arse->db;.  zCol
0a70: 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
0a80: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 43 6f  romToken(db, pCo
0a90: 6c 6c 4e 61 6d 65 29 3b 0a 20 20 70 43 6f 6c 6c  llName);.  pColl
0aa0: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
0ab0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
0ac0: 7a 43 6f 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65  zColl);.  sqlite
0ad0: 33 45 78 70 72 53 65 74 43 6f 6c 6c 28 70 45 78  3ExprSetColl(pEx
0ae0: 70 72 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 73 71  pr, pColl);.  sq
0af0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
0b00: 7a 43 6f 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e  zColl);.  return
0b10: 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pExpr;.}../*.**
0b20: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66 61   Return the defa
0b30: 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ult collation se
0b40: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65  quence for the e
0b50: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
0b60: 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20   If.** there is 
0b70: 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  no default colla
0b80: 74 69 6f 6e 20 74 79 70 65 2c 20 72 65 74 75 72  tion type, retur
0b90: 6e 20 30 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  n 0..*/.CollSeq 
0ba0: 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c  *sqlite3ExprColl
0bb0: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
0bc0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
0bd0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
0be0: 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 70  l = 0;.  Expr *p
0bf0: 20 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69 6c   = pExpr;.  whil
0c00: 65 28 20 41 4c 57 41 59 53 28 70 29 20 29 7b 0a  e( ALWAYS(p) ){.
0c10: 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20 20 20      int op;.    
0c20: 70 43 6f 6c 6c 20 3d 20 70 2d 3e 70 43 6f 6c 6c  pColl = p->pColl
0c30: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
0c40: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6f 70 20  ) break;.    op 
0c50: 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69 66 28  = p->op;.    if(
0c60: 20 70 2d 3e 70 54 61 62 21 3d 30 20 26 26 20 28   p->pTab!=0 && (
0c70: 0a 20 20 20 20 20 20 20 20 6f 70 3d 3d 54 4b 5f  .        op==TK_
0c80: 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70  AGG_COLUMN || op
0c90: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f  ==TK_COLUMN || o
0ca0: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 7c  p==TK_REGISTER |
0cb0: 7c 20 6f 70 3d 3d 54 4b 5f 54 52 49 47 47 45 52  | op==TK_TRIGGER
0cc0: 0a 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20 2f  .    )){.      /
0cd0: 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  * op==TK_REGISTE
0ce0: 52 20 26 26 20 70 2d 3e 70 54 61 62 21 3d 30 20  R && p->pTab!=0 
0cf0: 68 61 70 70 65 6e 73 20 77 68 65 6e 20 70 45 78  happens when pEx
0d00: 70 72 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c  pr was originall
0d10: 79 0a 20 20 20 20 20 20 2a 2a 20 61 20 54 4b 5f  y.      ** a TK_
0d20: 43 4f 4c 55 4d 4e 20 62 75 74 20 77 61 73 20 70  COLUMN but was p
0d30: 72 65 76 69 6f 75 73 6c 79 20 65 76 61 6c 75 61  reviously evalua
0d40: 74 65 64 20 61 6e 64 20 63 61 63 68 65 64 20 69  ted and cached i
0d50: 6e 20 61 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  n a register */.
0d60: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
0d70: 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69   *zColl;.      i
0d80: 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d  nt j = p->iColum
0d90: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d  n;.      if( j>=
0da0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
0db0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
0dc0: 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 7a  e->db;.        z
0dd0: 43 6f 6c 6c 20 3d 20 70 2d 3e 70 54 61 62 2d 3e  Coll = p->pTab->
0de0: 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20  aCol[j].zColl;. 
0df0: 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
0e00: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
0e10: 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a  q(db, ENC(db), z
0e20: 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  Coll, 0);.      
0e30: 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d    pExpr->pColl =
0e40: 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a   pColl;.      }.
0e50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0e60: 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 54   }.    if( op!=T
0e70: 4b 5f 43 41 53 54 20 26 26 20 6f 70 21 3d 54 4b  K_CAST && op!=TK
0e80: 5f 55 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20  _UPLUS ){.      
0e90: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
0ea0: 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20   p = p->pLeft;. 
0eb0: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
0ec0: 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61  CheckCollSeq(pPa
0ed0: 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a  rse, pColl) ){ .
0ee0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20      pColl = 0;. 
0ef0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c   }.  return pCol
0f00: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70  l;.}../*.** pExp
0f10: 72 20 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20  r is an operand 
0f20: 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  of a comparison 
0f30: 6f 70 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20  operator.  aff2 
0f40: 69 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61  is the.** type a
0f50: 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 6f  ffinity of the o
0f60: 74 68 65 72 20 6f 70 65 72 61 6e 64 2e 20 20 54  ther operand.  T
0f70: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
0f80: 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20  rns the.** type 
0f90: 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68  affinity that sh
0fa0: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72  ould be used for
0fb0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
0fc0: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61  operator..*/.cha
0fd0: 72 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  r sqlite3Compare
0fe0: 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70  Affinity(Expr *p
0ff0: 45 78 70 72 2c 20 63 68 61 72 20 61 66 66 32 29  Expr, char aff2)
1000: 7b 0a 20 20 63 68 61 72 20 61 66 66 31 20 3d 20  {.  char aff1 = 
1010: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
1020: 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66  ity(pExpr);.  if
1030: 28 20 61 66 66 31 20 26 26 20 61 66 66 32 20 29  ( aff1 && aff2 )
1040: 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69  {.    /* Both si
1050: 64 65 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  des of the compa
1060: 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e  rison are column
1070: 73 2e 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75  s. If one has nu
1080: 6d 65 72 69 63 0a 20 20 20 20 2a 2a 20 61 66 66  meric.    ** aff
1090: 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e  inity, use that.
10a0: 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20 6e   Otherwise use n
10b0: 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20  o affinity..    
10c0: 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
10d0: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
10e0: 69 74 79 28 61 66 66 31 29 20 7c 7c 20 73 71 6c  ity(aff1) || sql
10f0: 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66  ite3IsNumericAff
1100: 69 6e 69 74 79 28 61 66 66 32 29 20 29 7b 0a 20  inity(aff2) ){. 
1110: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1120: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
1130: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1140: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
1150: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  FF_NONE;.    }. 
1160: 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66 31   }else if( !aff1
1170: 20 26 26 20 21 61 66 66 32 20 29 7b 0a 20 20 20   && !aff2 ){.   
1180: 20 2f 2a 20 4e 65 69 74 68 65 72 20 73 69 64 65   /* Neither side
1190: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
11a0: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20  on is a column. 
11b0: 20 43 6f 6d 70 61 72 65 20 74 68 65 0a 20 20 20   Compare the.   
11c0: 20 2a 2a 20 72 65 73 75 6c 74 73 20 64 69 72 65   ** results dire
11d0: 63 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ctly..    */.   
11e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
11f0: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  FF_NONE;.  }else
1200: 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64  {.    /* One sid
1210: 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74  e is a column, t
1220: 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e  he other is not.
1230: 20 55 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73   Use the columns
1240: 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20   affinity. */.  
1250: 20 20 61 73 73 65 72 74 28 20 61 66 66 31 3d 3d    assert( aff1==
1260: 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a  0 || aff2==0 );.
1270: 20 20 20 20 72 65 74 75 72 6e 20 28 61 66 66 31      return (aff1
1280: 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a   + aff2);.  }.}.
1290: 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20  ./*.** pExpr is 
12a0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
12b0: 72 61 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74  rator.  Return t
12c0: 68 65 20 74 79 70 65 20 61 66 66 69 6e 69 74 79  he type affinity
12d0: 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20   that should.** 
12e0: 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f  be applied to bo
12f0: 74 68 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f  th operands prio
1300: 72 20 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63  r to doing the c
1310: 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74  omparison..*/.st
1320: 61 74 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72  atic char compar
1330: 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70  isonAffinity(Exp
1340: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61  r *pExpr){.  cha
1350: 72 20 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28  r aff;.  assert(
1360: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
1370: 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  Q || pExpr->op==
1380: 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_IN || pExpr->
1390: 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20  op==TK_LT ||.   
13a0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
13b0: 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72  ==TK_GT || pExpr
13c0: 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70  ->op==TK_GE || p
13d0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20  Expr->op==TK_LE 
13e0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ||.          pEx
13f0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c  pr->op==TK_NE ||
1400: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
1410: 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  S || pExpr->op==
1420: 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73  TK_ISNOT );.  as
1430: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
1440: 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20 73 71  ft );.  aff = sq
1450: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
1460: 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  y(pExpr->pLeft);
1470: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52  .  if( pExpr->pR
1480: 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66 66 20  ight ){.    aff 
1490: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
14a0: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
14b0: 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a 20 20  pRight, aff);.  
14c0: 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72 48 61  }else if( ExprHa
14d0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
14e0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
14f0: 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69  {.    aff = sqli
1500: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
1510: 74 79 28 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  ty(pExpr->x.pSel
1520: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  ect->pEList->a[0
1530: 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20  ].pExpr, aff);. 
1540: 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66 20   }else if( !aff 
1550: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c  ){.    aff = SQL
1560: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
1570: 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  }.  return aff;.
1580: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
1590: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65  s a comparison e
15a0: 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27  xpression, eg. '
15b0: 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29  =', '<', IN(...)
15c0: 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66   etc..** idx_aff
15d0: 69 6e 69 74 79 20 69 73 20 74 68 65 20 61 66 66  inity is the aff
15e0: 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65  inity of an inde
15f0: 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75  xed column. Retu
1600: 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68  rn true.** if th
1610: 65 20 69 6e 64 65 78 20 77 69 74 68 20 61 66 66  e index with aff
1620: 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69  inity idx_affini
1630: 74 79 20 6d 61 79 20 62 65 20 75 73 65 64 20 74  ty may be used t
1640: 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74  o implement.** t
1650: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e  he comparison in
1660: 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73   pExpr..*/.int s
1670: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
1680: 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70  ityOk(Expr *pExp
1690: 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66 69  r, char idx_affi
16a0: 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66  nity){.  char af
16b0: 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66  f = comparisonAf
16c0: 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20  finity(pExpr);. 
16d0: 20 73 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a   switch( aff ){.
16e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
16f0: 41 46 46 5f 4e 4f 4e 45 3a 0a 20 20 20 20 20 20  AFF_NONE:.      
1700: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61  return 1;.    ca
1710: 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  se SQLITE_AFF_TE
1720: 58 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  XT:.      return
1730: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53   idx_affinity==S
1740: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
1750: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
1760: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
1770: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
1780: 74 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29  ty(idx_affinity)
1790: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
17a0: 65 74 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c  eturn the P5 val
17b0: 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ue that should b
17c0: 65 20 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e  e used for a bin
17d0: 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a  ary comparison.*
17e0: 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c  * opcode (OP_Eq,
17f0: 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65   OP_Ge etc.) use
1800: 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78  d to compare pEx
1810: 70 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a  pr1 and pExpr2..
1820: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e  */.static u8 bin
1830: 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70  aryCompareP5(Exp
1840: 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20  r *pExpr1, Expr 
1850: 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d  *pExpr2, int jum
1860: 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61  pIfNull){.  u8 a
1870: 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74  ff = (char)sqlit
1880: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
1890: 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20  Expr2);.  aff = 
18a0: 28 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70 61  (u8)sqlite3Compa
18b0: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
18c0: 31 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a 75  1, aff) | (u8)ju
18d0: 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75  mpIfNull;.  retu
18e0: 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aff;.}../*.**
18f0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1900: 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69  r to the collati
1910: 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74  on sequence that
1920: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
1930: 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63  by.** a binary c
1940: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1950: 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65  or comparing pLe
1960: 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a  ft and pRight..*
1970: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74  *.** If the left
1980: 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e   hand expression
1990: 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
19a0: 20 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20   sequence type, 
19b0: 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73  then it is.** us
19c0: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68  ed. Otherwise th
19d0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
19e0: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67  ence for the rig
19f0: 68 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69  ht hand expressi
1a00: 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f  on.** is used, o
1a10: 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42  r the default (B
1a20: 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65  INARY) if neithe
1a30: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  r expression has
1a40: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20   a collating.** 
1a50: 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  type..**.** Argu
1a60: 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62 75 74  ment pRight (but
1a70: 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20   not pLeft) may 
1a80: 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  be a null pointe
1a90: 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  r. In this case,
1aa0: 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f  .** it is not co
1ab0: 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c  nsidered..*/.Col
1ac0: 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e  lSeq *sqlite3Bin
1ad0: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
1ae0: 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  q(.  Parse *pPar
1af0: 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65  se, .  Expr *pLe
1b00: 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69  ft, .  Expr *pRi
1b10: 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  ght.){.  CollSeq
1b20: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72   *pColl;.  asser
1b30: 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66  t( pLeft );.  if
1b40: 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ( pLeft->flags &
1b50: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29   EP_ExpCollate )
1b60: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  {.    assert( pL
1b70: 65 66 74 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20  eft->pColl );.  
1b80: 20 20 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d    pColl = pLeft-
1b90: 3e 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65 20  >pColl;.  }else 
1ba0: 69 66 28 20 70 52 69 67 68 74 20 26 26 20 70 52  if( pRight && pR
1bb0: 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  ight->flags & EP
1bc0: 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20  _ExpCollate ){. 
1bd0: 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68     assert( pRigh
1be0: 74 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20  t->pColl );.    
1bf0: 70 43 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e  pColl = pRight->
1c00: 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pColl;.  }else{.
1c10: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1c20: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
1c30: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
1c40: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
1c50: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  .      pColl = s
1c60: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1c70: 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  q(pParse, pRight
1c80: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1c90: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
1ca0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1cb0: 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72  ode for a compar
1cc0: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  ison operator..*
1cd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64  /.static int cod
1ce0: 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73  eCompare(.  Pars
1cf0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
1d00: 20 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e   The parsing (an
1d10: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
1d20: 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  g) context */.  
1d30: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20  Expr *pLeft,    
1d40: 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70    /* The left op
1d50: 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20  erand */.  Expr 
1d60: 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20  *pRight,     /* 
1d70: 54 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  The right operan
1d80: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64  d */.  int opcod
1d90: 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e,       /* The 
1da0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64  comparison opcod
1db0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20  e */.  int in1, 
1dc0: 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69  int in2, /* Regi
1dd0: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65  ster holding ope
1de0: 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64  rands */.  int d
1df0: 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  est,         /* 
1e00: 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75  Jump here if tru
1e10: 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d  e.  */.  int jum
1e20: 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66  pIfNull    /* If
1e30: 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65   true, jump if e
1e40: 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73  ither operand is
1e50: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e   NULL */.){.  in
1e60: 74 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72  t p5;.  int addr
1e70: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b  ;.  CollSeq *p4;
1e80: 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33  ..  p4 = sqlite3
1e90: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
1ea0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65  lSeq(pParse, pLe
1eb0: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70  ft, pRight);.  p
1ec0: 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72  5 = binaryCompar
1ed0: 65 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68  eP5(pLeft, pRigh
1ee0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1ef0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
1f00: 56 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73  VdbeAddOp4(pPars
1f10: 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65  e->pVdbe, opcode
1f20: 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31  , in2, dest, in1
1f30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
1f50: 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53  id*)p4, P4_COLLS
1f60: 45 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  EQ);.  sqlite3Vd
1f70: 62 65 43 68 61 6e 67 65 50 35 28 70 50 61 72 73  beChangeP5(pPars
1f80: 65 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35  e->pVdbe, (u8)p5
1f90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
1fa0: 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
1fb0: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
1fc0: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61  ./*.** Check tha
1fd0: 74 20 61 72 67 75 6d 65 6e 74 20 6e 48 65 69 67  t argument nHeig
1fe0: 68 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ht is less than 
1ff0: 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
2000: 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78 70 72 65  maximum.** expre
2010: 73 73 69 6f 6e 20 64 65 70 74 68 20 61 6c 6c 6f  ssion depth allo
2020: 77 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  wed. If it is no
2030: 74 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  t, leave an erro
2040: 72 20 6d 65 73 73 61 67 65 20 69 6e 0a 2a 2a 20  r message in.** 
2050: 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  pParse..*/.int s
2060: 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48  qlite3ExprCheckH
2070: 65 69 67 68 74 28 50 61 72 73 65 20 2a 70 50 61  eight(Parse *pPa
2080: 72 73 65 2c 20 69 6e 74 20 6e 48 65 69 67 68 74  rse, int nHeight
2090: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
20a0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6d  LITE_OK;.  int m
20b0: 78 48 65 69 67 68 74 20 3d 20 70 50 61 72 73 65  xHeight = pParse
20c0: 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
20d0: 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44  ITE_LIMIT_EXPR_D
20e0: 45 50 54 48 5d 3b 0a 20 20 69 66 28 20 6e 48 65  EPTH];.  if( nHe
20f0: 69 67 68 74 3e 6d 78 48 65 69 67 68 74 20 29 7b  ight>mxHeight ){
2100: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
2110: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
2120: 20 20 20 20 20 22 45 78 70 72 65 73 73 69 6f 6e       "Expression
2130: 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c 61 72   tree is too lar
2140: 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65 70 74  ge (maximum dept
2150: 68 20 25 64 29 22 2c 20 6d 78 48 65 69 67 68 74  h %d)", mxHeight
2160: 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d  .    );.    rc =
2170: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2180: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2190: 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  }../* The follow
21a0: 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74 69  ing three functi
21b0: 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45 78 70  ons, heightOfExp
21c0: 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45 78 70  r(), heightOfExp
21d0: 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68  rList().** and h
21e0: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 29 2c  eightOfSelect(),
21f0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 65 74   are used to det
2200: 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78 69 6d  ermine the maxim
2210: 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20  um height.** of 
2220: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74  any expression t
2230: 72 65 65 20 72 65 66 65 72 65 6e 63 65 64 20 62  ree referenced b
2240: 79 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  y the structure 
2250: 70 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a  passed as the.**
2260: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
2270: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d  .**.** If this m
2280: 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 69 73  aximum height is
2290: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
22a0: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
22b0: 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79  pointed.** to by
22c0: 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65 20 73   pnHeight, the s
22d0: 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 2c  econd parameter,
22e0: 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48 65 69   then set *pnHei
22f0: 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76  ght to that.** v
2300: 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
2310: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70  void heightOfExp
2320: 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a  r(Expr *p, int *
2330: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28  pnHeight){.  if(
2340: 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d   p ){.    if( p-
2350: 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65 69 67  >nHeight>*pnHeig
2360: 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48  ht ){.      *pnH
2370: 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67  eight = p->nHeig
2380: 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ht;.    }.  }.}.
2390: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
23a0: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45 78 70  htOfExprList(Exp
23b0: 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70  rList *p, int *p
23c0: 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20  nHeight){.  if( 
23d0: 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  p ){.    int i;.
23e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
23f0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
2400: 20 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70       heightOfExp
2410: 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  r(p->a[i].pExpr,
2420: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
2430: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
2440: 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65  oid heightOfSele
2450: 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  ct(Select *p, in
2460: 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20  t *pnHeight){.  
2470: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 68 65 69  if( p ){.    hei
2480: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 57 68  ghtOfExpr(p->pWh
2490: 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ere, pnHeight);.
24a0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
24b0: 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48  (p->pHaving, pnH
24c0: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
24d0: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d  htOfExpr(p->pLim
24e0: 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  it, pnHeight);. 
24f0: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
2500: 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70 6e 48 65  p->pOffset, pnHe
2510: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
2520: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  tOfExprList(p->p
2530: 45 4c 69 73 74 2c 20 70 6e 48 65 69 67 68 74 29  EList, pnHeight)
2540: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
2550: 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70  prList(p->pGroup
2560: 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  By, pnHeight);. 
2570: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
2580: 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ist(p->pOrderBy,
2590: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
25a0: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70  heightOfSelect(p
25b0: 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65 69 67  ->pPrior, pnHeig
25c0: 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ht);.  }.}../*.*
25d0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e  * Set the Expr.n
25e0: 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20  Height variable 
25f0: 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  in the structure
2600: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a 2a   passed as an .*
2610: 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65  * argument. An e
2620: 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 6e  xpression with n
2630: 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70 72  o children, Expr
2640: 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78  .pList or .** Ex
2650: 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62 65  pr.pSelect membe
2660: 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20 6f  r has a height o
2670: 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20 65  f 1. Any other e
2680: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73  xpression.** has
2690: 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c 20   a height equal 
26a0: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  to the maximum h
26b0: 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74 68  eight of any oth
26c0: 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  er .** reference
26d0: 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e  d Expr plus one.
26e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26f0: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 45 78  exprSetHeight(Ex
2700: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48  pr *p){.  int nH
2710: 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69  eight = 0;.  hei
2720: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65  ghtOfExpr(p->pLe
2730: 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ft, &nHeight);. 
2740: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
2750: 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68  >pRight, &nHeigh
2760: 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61  t);.  if( ExprHa
2770: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
2780: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
2790: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
27a0: 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26  (p->x.pSelect, &
27b0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73  nHeight);.  }els
27c0: 65 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  e{.    heightOfE
27d0: 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69  xprList(p->x.pLi
27e0: 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  st, &nHeight);. 
27f0: 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74 20   }.  p->nHeight 
2800: 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a 7d  = nHeight + 1;.}
2810: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
2820: 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72  Expr.nHeight var
2830: 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20  iable using the 
2840: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 29 20  exprSetHeight() 
2850: 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20  function. If.** 
2860: 74 68 65 20 68 65 69 67 68 74 20 69 73 20 67 72  the height is gr
2870: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6d  eater than the m
2880: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 65  aximum allowed e
2890: 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68 2c  xpression depth,
28a0: 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72  .** leave an err
28b0: 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  or in pParse..*/
28c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
28d0: 72 53 65 74 48 65 69 67 68 74 28 50 61 72 73 65  rSetHeight(Parse
28e0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
28f0: 70 29 7b 0a 20 20 65 78 70 72 53 65 74 48 65 69  p){.  exprSetHei
2900: 67 68 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ght(p);.  sqlite
2910: 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74  3ExprCheckHeight
2920: 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69  (pParse, p->nHei
2930: 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ght);.}../*.** R
2940: 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75  eturn the maximu
2950: 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20  m height of any 
2960: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
2970: 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79  referenced.** by
2980: 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   the select stat
2990: 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
29a0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  an argument..*/.
29b0: 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
29c0: 74 45 78 70 72 48 65 69 67 68 74 28 53 65 6c 65  tExprHeight(Sele
29d0: 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48  ct *p){.  int nH
29e0: 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69  eight = 0;.  hei
29f0: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26  ghtOfSelect(p, &
2a00: 6e 48 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75  nHeight);.  retu
2a10: 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65  rn nHeight;.}.#e
2a20: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 65 78  lse.  #define ex
2a30: 70 72 53 65 74 48 65 69 67 68 74 28 79 29 0a 23  prSetHeight(y).#
2a40: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2a50: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
2a60: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
2a70: 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 63  routine is the c
2a80: 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20 66 6f  ore allocator fo
2a90: 72 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a 2a 2a  r Expr nodes..**
2aa0: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
2ab0: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
2ac0: 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ode and return a
2ad0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 20   pointer to it. 
2ae0: 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74   Memory.** for t
2af0: 68 69 73 20 6e 6f 64 65 20 61 6e 64 20 66 6f 72  his node and for
2b00: 20 74 68 65 20 70 54 6f 6b 65 6e 20 61 72 67 75   the pToken argu
2b10: 6d 65 6e 74 20 69 73 20 61 20 73 69 6e 67 6c 65  ment is a single
2b20: 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f   allocation.** o
2b30: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
2b40: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20  ite3DbMalloc(). 
2b50: 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
2b60: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70  ction.** is resp
2b70: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69  onsible for maki
2b80: 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65  ng sure the node
2b90: 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73   eventually gets
2ba0: 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   freed..**.** If
2bb0: 20 64 65 71 75 6f 74 65 20 69 73 20 74 72 75 65   dequote is true
2bc0: 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e  , then the token
2bd0: 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
2be0: 69 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2a 20  is dequoted..** 
2bf0: 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 66 61  If dequote is fa
2c00: 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74 69 6e  lse, no dequotin
2c10: 67 20 69 73 20 70 65 72 66 6f 72 6d 61 6e 63 65  g is performance
2c20: 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65 0a 2a  .  The deQuote.*
2c30: 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69  * parameter is i
2c40: 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b 65 6e  gnored if pToken
2c50: 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   is NULL or if t
2c60: 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f  he token does no
2c70: 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f 20 62  t.** appear to b
2c80: 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20 74 68  e quoted.  If th
2c90: 65 20 71 75 6f 74 65 73 20 77 65 72 65 20 6f 66  e quotes were of
2ca0: 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22 20   the form "..." 
2cb0: 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29 0a  (double-quotes).
2cc0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50 5f 44  ** then the EP_D
2cd0: 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20 69 73  blQuoted flag is
2ce0: 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78 70 72   set on the expr
2cf0: 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a  ession node..**.
2d00: 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  ** Special case:
2d10: 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45    If op==TK_INTE
2d20: 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20 70  GER and pToken p
2d30: 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69 6e  oints to a strin
2d40: 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65  g that.** can be
2d50: 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f   translated into
2d60: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
2d70: 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65  r, then the toke
2d80: 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72  n is not.** stor
2d90: 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20  ed in u.zToken. 
2da0: 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 69 6e   Instead, the in
2db0: 74 65 67 65 72 20 76 61 6c 75 65 73 20 69 73 20  teger values is 
2dc0: 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
2dd0: 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74 68 65  u.iValue and the
2de0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61   EP_IntValue fla
2df0: 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20 65 78  g is set.  No ex
2e00: 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20 69  tra storage.** i
2e10: 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68  s allocated to h
2e20: 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72 20  old the integer 
2e30: 74 65 78 74 20 61 6e 64 20 74 68 65 20 64 65 71  text and the deq
2e40: 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69 67 6e  uote flag is ign
2e50: 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ored..*/.Expr *s
2e60: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
2e70: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
2e80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
2e90: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
2ea0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28  DbMallocZero() (
2eb0: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
2ec0: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
2ed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
2ee0: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
2ef0: 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  /.  const Token 
2f00: 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20 54  *pToken,    /* T
2f10: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20  oken argument.  
2f20: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
2f30: 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20  .  int dequote  
2f40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2f50: 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20 2a 2f  ue to dequote */
2f60: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  .){.  Expr *pNew
2f70: 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d  ;.  int nExtra =
2f80: 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 6c 75 65   0;.  int iValue
2f90: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 54 6f   = 0;..  if( pTo
2fa0: 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 6f  ken ){.    if( o
2fb0: 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c  p!=TK_INTEGER ||
2fc0: 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20   pToken->z==0.  
2fd0: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2fe0: 65 33 47 65 74 49 6e 74 33 32 28 70 54 6f 6b 65  e3GetInt32(pToke
2ff0: 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d  n->z, &iValue)==
3000: 30 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72  0 ){.      nExtr
3010: 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b  a = pToken->n+1;
3020: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65  .    }.  }.  pNe
3030: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
3040: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
3050: 6f 66 28 45 78 70 72 29 2b 6e 45 78 74 72 61 29  of(Expr)+nExtra)
3060: 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
3070: 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28      pNew->op = (
3080: 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d  u8)op;.    pNew-
3090: 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20  >iAgg = -1;.    
30a0: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
30b0: 20 20 20 20 69 66 28 20 6e 45 78 74 72 61 3d 3d      if( nExtra==
30c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  0 ){.        pNe
30d0: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49  w->flags |= EP_I
30e0: 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20  ntValue;.       
30f0: 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20   pNew->u.iValue 
3100: 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20  = iValue;.      
3110: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
3120: 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20 70 4e  nt c;.        pN
3130: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28  ew->u.zToken = (
3140: 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  char*)&pNew[1];.
3150: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
3160: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70  New->u.zToken, p
3170: 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e  Token->z, pToken
3180: 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  ->n);.        pN
3190: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f  ew->u.zToken[pTo
31a0: 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20  ken->n] = 0;.   
31b0: 20 20 20 20 20 69 66 28 20 64 65 71 75 6f 74 65       if( dequote
31c0: 20 26 26 20 6e 45 78 74 72 61 3e 3d 33 20 0a 20   && nExtra>=3 . 
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
31e0: 28 63 20 3d 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30  (c = pToken->z[0
31f0: 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27  ])=='\'' || c=='
3200: 22 27 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20  "' || c=='[' || 
3210: 63 3d 3d 27 60 27 29 20 29 7b 0a 20 20 20 20 20  c=='`') ){.     
3220: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75       sqlite3Dequ
3230: 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  ote(pNew->u.zTok
3240: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  en);.          i
3250: 66 28 20 63 3d 3d 27 22 27 20 29 20 70 4e 65 77  f( c=='"' ) pNew
3260: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 44 62  ->flags |= EP_Db
3270: 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20 20 20 20  lQuoted;.       
3280: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
3290: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
32a0: 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 20  EXPR_DEPTH>0.   
32b0: 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d   pNew->nHeight =
32c0: 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d   1;.#endif  .  }
32d0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
32e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
32f0: 65 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  e a new expressi
3300: 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a  on node from a z
3310: 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20 74  ero-terminated t
3320: 6f 6b 65 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a  oken that has.**
3330: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 64 65   already been de
3340: 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20  quoted..*/.Expr 
3350: 2a 73 71 6c 69 74 65 33 45 78 70 72 28 0a 20 20  *sqlite3Expr(.  
3360: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
3370: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
3380: 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d  e for sqlite3DbM
3390: 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79  allocZero() (may
33a0: 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69   be null) */.  i
33b0: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
33c0: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
33d0: 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  sion opcode */. 
33e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f   const char *zTo
33f0: 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65  ken      /* Toke
3400: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67  n argument.  Mig
3410: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
3420: 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e  .  Token x;.  x.
3430: 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e  z = zToken;.  x.
3440: 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20 73 71 6c  n = zToken ? sql
3450: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f  ite3Strlen30(zTo
3460: 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72 65 74 75  ken) : 0;.  retu
3470: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c  rn sqlite3ExprAl
3480: 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20  loc(db, op, &x, 
3490: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  0);.}../*.** Att
34a0: 61 63 68 20 73 75 62 74 72 65 65 73 20 70 4c 65  ach subtrees pLe
34b0: 66 74 20 61 6e 64 20 70 52 69 67 68 74 20 74 6f  ft and pRight to
34c0: 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65 20 70   the Expr node p
34d0: 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  Root..**.** If p
34e0: 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Root==NULL that 
34f0: 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d 65 6d  means that a mem
3500: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
3510: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
3520: 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63 61  d..** In that ca
3530: 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 73  se, delete the s
3540: 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e  ubtrees pLeft an
3550: 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69  d pRight..*/.voi
3560: 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74  d sqlite3ExprAtt
3570: 61 63 68 53 75 62 74 72 65 65 73 28 0a 20 20 73  achSubtrees(.  s
3580: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 45 78  qlite3 *db,.  Ex
3590: 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70  pr *pRoot,.  Exp
35a0: 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78 70 72  r *pLeft,.  Expr
35b0: 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 69 66   *pRight.){.  if
35c0: 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20  ( pRoot==0 ){.  
35d0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
35e0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
35f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
3600: 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a  ete(db, pLeft);.
3610: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
3620: 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74  elete(db, pRight
3630: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3640: 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20  if( pRight ){.  
3650: 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68      pRoot->pRigh
3660: 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  t = pRight;.    
3670: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 66 6c    if( pRight->fl
3680: 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
3690: 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ate ){.        p
36a0: 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Root->flags |= E
36b0: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  P_ExpCollate;.  
36c0: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 43 6f        pRoot->pCo
36d0: 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e 70 43 6f  ll = pRight->pCo
36e0: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
36f0: 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 20  }.    if( pLeft 
3700: 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  ){.      pRoot->
3710: 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20  pLeft = pLeft;. 
3720: 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e       if( pLeft->
3730: 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
3740: 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  llate ){.       
3750: 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d   pRoot->flags |=
3760: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a   EP_ExpCollate;.
3770: 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70          pRoot->p
3780: 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d 3e 70 43  Coll = pLeft->pC
3790: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
37a0: 20 7d 0a 20 20 20 20 65 78 70 72 53 65 74 48 65   }.    exprSetHe
37b0: 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a 20 20 7d  ight(pRoot);.  }
37c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
37d0: 74 65 20 61 20 45 78 70 72 20 6e 6f 64 65 20 77  te a Expr node w
37e0: 68 69 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d 61  hich joins as ma
37f0: 6e 79 20 61 73 20 74 77 6f 20 73 75 62 74 72 65  ny as two subtre
3800: 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72  es..**.** One or
3810: 20 62 6f 74 68 20 6f 66 20 74 68 65 20 73 75 62   both of the sub
3820: 74 72 65 65 73 20 63 61 6e 20 62 65 20 4e 55 4c  trees can be NUL
3830: 4c 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  L.  Return a poi
3840: 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 0a  nter to the new.
3850: 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e 20 20 4f  ** Expr node.  O
3860: 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72  r, if an OOM err
3870: 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 70  or occurs, set p
3880: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
3890: 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65 65  cFailed,.** free
38a0: 20 74 68 65 20 73 75 62 74 72 65 65 73 20 61 6e   the subtrees an
38b0: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  d return NULL..*
38c0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 50  /.Expr *sqlite3P
38d0: 45 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a 70  Expr(.  Parse *p
38e0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
38f0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
3900: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  xt */.  int op, 
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3920: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70  /* Expression op
3930: 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  code */.  Expr *
3940: 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20  pLeft,          
3950: 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e    /* Left operan
3960: 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69  d */.  Expr *pRi
3970: 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ght,           /
3980: 2a 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64 20  * Right operand 
3990: 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e  */.  const Token
39a0: 20 2a 70 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20   *pToken     /* 
39b0: 41 72 67 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a  Argument token *
39c0: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d  /.){.  Expr *p =
39d0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
39e0: 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6f 70  c(pParse->db, op
39f0: 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20  , pToken, 1);.  
3a00: 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63  sqlite3ExprAttac
3a10: 68 53 75 62 74 72 65 65 73 28 70 50 61 72 73 65  hSubtrees(pParse
3a20: 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66 74 2c 20  ->db, p, pLeft, 
3a30: 70 52 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72  pRight);.  retur
3a40: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  n p;.}../*.** Jo
3a50: 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  in two expressio
3a60: 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44 20  ns using an AND 
3a70: 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65 69  operator.  If ei
3a80: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
3a90: 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e  is.** NULL, then
3aa0: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   just return the
3ab0: 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
3ac0: 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  n..*/.Expr *sqli
3ad0: 74 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74  te3ExprAnd(sqlit
3ae0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c  e3 *db, Expr *pL
3af0: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
3b00: 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d  t){.  if( pLeft=
3b10: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
3b20: 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65   pRight;.  }else
3b30: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
3b40: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65  {.    return pLe
3b50: 66 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ft;.  }else{.   
3b60: 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71   Expr *pNew = sq
3b70: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
3b80: 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 30 29  b, TK_AND, 0, 0)
3b90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
3ba0: 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28  rAttachSubtrees(
3bb0: 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65 66 74 2c  db, pNew, pLeft,
3bc0: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65   pRight);.    re
3bd0: 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d  turn pNew;.  }.}
3be0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63  ../*.** Construc
3bf0: 74 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  t a new expressi
3c00: 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75  on node for a fu
3c10: 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74  nction with mult
3c20: 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  iple.** argument
3c30: 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  s..*/.Expr *sqli
3c40: 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28  te3ExprFunction(
3c50: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
3c60: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
3c70: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
3c80: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
3c90: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
3ca0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65  arse->db;.  asse
3cb0: 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20  rt( pToken );.  
3cc0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
3cd0: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 46  prAlloc(db, TK_F
3ce0: 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c  UNCTION, pToken,
3cf0: 20 31 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d   1);.  if( pNew=
3d00: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
3d10: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
3d20: 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f 2a 20 41  db, pList); /* A
3d30: 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c 65 61 6b  void memory leak
3d40: 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69   when malloc fai
3d50: 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ls */.    return
3d60: 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e   0;.  }.  pNew->
3d70: 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b  x.pList = pList;
3d80: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
3d90: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
3da0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
3db0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
3dc0: 53 65 74 48 65 69 67 68 74 28 70 50 61 72 73 65  SetHeight(pParse
3dd0: 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  , pNew);.  retur
3de0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
3df0: 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61 62   Assign a variab
3e00: 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20  le number to an 
3e10: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
3e20: 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61  encodes a wildca
3e30: 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69  rd.** in the ori
3e40: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
3e50: 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c  ent.  .**.** Wil
3e60: 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e  dcards consistin
3e70: 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f  g of a single "?
3e80: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
3e90: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69  he next sequenti
3ea0: 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e  al.** variable n
3eb0: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  umber..**.** Wil
3ec0: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
3ed0: 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73  rm "?nnn" are as
3ee0: 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65  signed the numbe
3ef0: 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b  r "nnn".  We mak
3f00: 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20  e.** sure "nnn" 
3f10: 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f  is not too be to
3f20: 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20   avoid a denial 
3f30: 6f 66 20 73 65 72 76 69 63 65 20 61 74 74 61 63  of service attac
3f40: 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51  k when.** the SQ
3f50: 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65  L statement come
3f60: 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e  s from an extern
3f70: 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a  al source..**.**
3f80: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
3f90: 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22  e form ":aaa", "
3fa0: 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61 61 22  @aaa", or "$aaa"
3fb0: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68   are assigned th
3fc0: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a  e same number.**
3fd0: 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
3fe0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
3ff0: 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20   same wildcard. 
4000: 20 4f 72 20 69 66 20 74 68 69 73 20 69 73 20 74   Or if this is t
4010: 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74  he first.** inst
4020: 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64  ance of the wild
4030: 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73  card, the next s
4040: 65 71 75 65 6e 69 61 6c 20 76 61 72 69 61 62 6c  equenial variabl
4050: 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61  e number is.** a
4060: 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64  ssigned..*/.void
4070: 20 73 71 6c 69 74 65 33 45 78 70 72 41 73 73 69   sqlite3ExprAssi
4080: 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73  gnVarNumber(Pars
4090: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
40a0: 2a 70 45 78 70 72 29 7b 0a 20 20 73 71 6c 69 74  *pExpr){.  sqlit
40b0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
40c0: 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  >db;.  const cha
40d0: 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 45 78  r *z;..  if( pEx
40e0: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
40f0: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
4100: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45  asAnyProperty(pE
4110: 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
4120: 7c 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54  |EP_Reduced|EP_T
4130: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a  okenOnly) );.  z
4140: 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
4150: 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 21  en;.  assert( z!
4160: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
4170: 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28  z[0]!=0 );.  if(
4180: 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20   z[1]==0 ){.    
4190: 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74  /* Wildcard of t
41a0: 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73  he form "?".  As
41b0: 73 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61  sign the next va
41c0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f  riable number */
41d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30  .    assert( z[0
41e0: 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20 20 20 70 45  ]=='?' );.    pE
41f0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28  xpr->iColumn = (
4200: 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d  ynVar)(++pParse-
4210: 3e 6e 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65 20  >nVar);.  }else 
4220: 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b  if( z[0]=='?' ){
4230: 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64  .    /* Wildcard
4240: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e   of the form "?n
4250: 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e  nn".  Convert "n
4260: 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  nn" to an intege
4270: 72 20 61 6e 64 0a 20 20 20 20 2a 2a 20 75 73 65  r and.    ** use
4280: 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69 61   it as the varia
4290: 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
42a0: 20 20 69 6e 74 20 69 20 3d 20 61 74 6f 69 28 28    int i = atoi((
42b0: 63 68 61 72 2a 29 26 7a 5b 31 5d 29 3b 0a 20 20  char*)&z[1]);.  
42c0: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
42d0: 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20 20 20   = (ynVar)i;.   
42e0: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 30 20   testcase( i==0 
42f0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
4300: 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 74 65 73   i==1 );.    tes
4310: 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c  tcase( i==db->aL
4320: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
4330: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
4340: 52 5d 2d 31 20 29 3b 0a 20 20 20 20 74 65 73 74  R]-1 );.    test
4350: 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69  case( i==db->aLi
4360: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
4370: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
4380: 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 31  ] );.    if( i<1
4390: 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74   || i>db->aLimit
43a0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
43b0: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
43c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
43d0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
43e0: 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72  "variable number
43f0: 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
4400: 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20   ?1 and ?%d",.  
4410: 20 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d          db->aLim
4420: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
4430: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
4440: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
4450: 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20   i>pParse->nVar 
4460: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
4470: 3e 6e 56 61 72 20 3d 20 69 3b 0a 20 20 20 20 7d  >nVar = i;.    }
4480: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
4490: 20 57 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20   Wildcards like 
44a0: 22 3a 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f  ":aaa", "$aaa" o
44b0: 72 20 22 40 61 61 61 22 2e 20 20 52 65 75 73 65  r "@aaa".  Reuse
44c0: 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62   the same variab
44d0: 6c 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  le.    ** number
44e0: 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70   as the prior ap
44f0: 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20  pearance of the 
4500: 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66  same name, or if
4510: 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 2a 2a   the name.    **
4520: 20 68 61 73 20 6e 65 76 65 72 20 61 70 70 65 61   has never appea
4530: 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73  red before, reus
4540: 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61  e the same varia
4550: 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a  ble number.    *
4560: 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  /.    int i;.   
4570: 20 75 33 32 20 6e 3b 0a 20 20 20 20 6e 20 3d 20   u32 n;.    n = 
4580: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
4590: 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  z);.    for(i=0;
45a0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 61 72 45   i<pParse->nVarE
45b0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
45c0: 20 45 78 70 72 20 2a 70 45 20 3d 20 70 50 61 72   Expr *pE = pPar
45d0: 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 69 5d  se->apVarExpr[i]
45e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
45f0: 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  pE!=0 );.      i
4600: 66 28 20 6d 65 6d 63 6d 70 28 70 45 2d 3e 75 2e  f( memcmp(pE->u.
4610: 7a 54 6f 6b 65 6e 2c 20 7a 2c 20 6e 29 3d 3d 30  zToken, z, n)==0
4620: 20 26 26 20 70 45 2d 3e 75 2e 7a 54 6f 6b 65 6e   && pE->u.zToken
4630: 5b 6e 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [n]==0 ){.      
4640: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
4650: 20 3d 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a   = pE->iColumn;.
4660: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4670: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
4680: 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e   if( i>=pParse->
4690: 6e 56 61 72 45 78 70 72 20 29 7b 0a 20 20 20 20  nVarExpr ){.    
46a0: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
46b0: 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61   = (ynVar)(++pPa
46c0: 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20  rse->nVar);.    
46d0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56    if( pParse->nV
46e0: 61 72 45 78 70 72 3e 3d 70 50 61 72 73 65 2d 3e  arExpr>=pParse->
46f0: 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2d 31 20  nVarExprAlloc-1 
4700: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  ){.        pPars
4710: 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63  e->nVarExprAlloc
4720: 20 2b 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61 72   += pParse->nVar
4730: 45 78 70 72 41 6c 6c 6f 63 20 2b 20 31 30 3b 0a  ExprAlloc + 10;.
4740: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
4750: 61 70 56 61 72 45 78 70 72 20 3d 0a 20 20 20 20  apVarExpr =.    
4760: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
4770: 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 0a  bReallocOrFree(.
4780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62                db
4790: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
47a0: 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70  pParse->apVarExp
47b0: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
47c0: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70   pParse->nVarExp
47d0: 72 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 50  rAlloc*sizeof(pP
47e0: 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b  arse->apVarExpr[
47f0: 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0]).            
4800: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
4810: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
4820: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
4830: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
4840: 2d 3e 61 70 56 61 72 45 78 70 72 21 3d 30 20 29  ->apVarExpr!=0 )
4850: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
4860: 2d 3e 61 70 56 61 72 45 78 70 72 5b 70 50 61 72  ->apVarExpr[pPar
4870: 73 65 2d 3e 6e 56 61 72 45 78 70 72 2b 2b 5d 20  se->nVarExpr++] 
4880: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 7d  = pExpr;.      }
4890: 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66  .    }.  } .  if
48a0: 28 20 21 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  ( !pParse->nErr 
48b0: 26 26 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e  && pParse->nVar>
48c0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
48d0: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
48e0: 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20  _NUMBER] ){.    
48f0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
4900: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
4910: 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22  y SQL variables"
4920: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
4930: 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65  Recursively dele
4940: 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
4950: 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   tree..*/.void s
4960: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4970: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
4980: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d  pr *p){.  if( p=
4990: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
49a0: 66 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72  f( !ExprHasAnyPr
49b0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
49c0: 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 73  enOnly) ){.    s
49d0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
49e0: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a  (db, p->pLeft);.
49f0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
4a00: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 52 69  elete(db, p->pRi
4a10: 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 21 45  ght);.    if( !E
4a20: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
4a30: 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 26 26  , EP_Reduced) &&
4a40: 20 28 70 2d 3e 66 6c 61 67 73 32 20 26 20 45 50   (p->flags2 & EP
4a50: 32 5f 4d 61 6c 6c 6f 63 65 64 54 6f 6b 65 6e 29  2_MallocedToken)
4a60: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
4a70: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4a80: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
4a90: 20 7d 0a 20 20 20 20 69 66 28 20 45 78 70 72 48   }.    if( ExprH
4aa0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
4ab0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
4ac0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
4ad0: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  ctDelete(db, p->
4ae0: 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  x.pSelect);.    
4af0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
4b00: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
4b10: 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73  te(db, p->x.pLis
4b20: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
4b30: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
4b40: 65 72 74 79 28 70 2c 20 45 50 5f 53 74 61 74 69  erty(p, EP_Stati
4b50: 63 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  c) ){.    sqlite
4b60: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
4b70: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
4b80: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
4b90: 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  f bytes allocate
4ba0: 64 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73  d for the expres
4bb0: 73 69 6f 6e 20 73 74 72 75 63 74 75 72 65 20 0a  sion structure .
4bc0: 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ** passed as the
4bd0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
4be0: 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   This is always 
4bf0: 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c  one of EXPR_FULL
4c00: 53 49 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45  SIZE,.** EXPR_RE
4c10: 44 55 43 45 44 53 49 5a 45 20 6f 72 20 45 58 50  DUCEDSIZE or EXP
4c20: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e  R_TOKENONLYSIZE.
4c30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
4c40: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78  xprStructSize(Ex
4c50: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 45 78  pr *p){.  if( Ex
4c60: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
4c70: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
4c80: 20 72 65 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b   return EXPR_TOK
4c90: 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66  ENONLYSIZE;.  if
4ca0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
4cb0: 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29  y(p, EP_Reduced)
4cc0: 20 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f 52   ) return EXPR_R
4cd0: 45 44 55 43 45 44 53 49 5a 45 3b 0a 20 20 72 65  EDUCEDSIZE;.  re
4ce0: 74 75 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49  turn EXPR_FULLSI
4cf0: 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ZE;.}../*.** The
4d00: 20 64 75 70 65 64 45 78 70 72 2a 53 69 7a 65 28   dupedExpr*Size(
4d10: 29 20 72 6f 75 74 69 6e 65 73 20 65 61 63 68 20  ) routines each 
4d20: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
4d30: 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69  r of bytes requi
4d40: 72 65 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20  red.** to store 
4d50: 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70  a copy of an exp
4d60: 72 65 73 73 69 6f 6e 20 6f 72 20 65 78 70 72 65  ression or expre
4d70: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 54 68 65  ssion tree.  The
4d80: 79 20 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20 68  y differ in.** h
4d90: 6f 77 20 6d 75 63 68 20 6f 66 20 74 68 65 20 74  ow much of the t
4da0: 72 65 65 20 69 73 20 6d 65 61 73 75 72 65 64 2e  ree is measured.
4db0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  .**.**     duped
4dc0: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29  ExprStructSize()
4dd0: 20 20 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e 6c       Size of onl
4de0: 79 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  y the Expr struc
4df0: 74 75 72 65 20 0a 2a 2a 20 20 20 20 20 64 75 70  ture .**     dup
4e00: 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 29  edExprNodeSize()
4e10: 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20 45         Size of E
4e20: 78 70 72 20 2b 20 73 70 61 63 65 20 66 6f 72 20  xpr + space for 
4e30: 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75 70  token.**     dup
4e40: 65 64 45 78 70 72 53 69 7a 65 28 29 20 20 20 20  edExprSize()    
4e50: 20 20 20 20 20 20 20 45 78 70 72 20 2b 20 74 6f         Expr + to
4e60: 6b 65 6e 20 2b 20 73 75 62 74 72 65 65 20 63 6f  ken + subtree co
4e70: 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a  mponents.**.****
4e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4e90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4ea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4eb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4ec0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
4ed0: 65 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  e dupedExprStruc
4ee0: 74 53 69 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e  tSize() function
4ef0: 20 72 65 74 75 72 6e 73 20 74 77 6f 20 76 61 6c   returns two val
4f00: 75 65 73 20 4f 52 2d 65 64 20 74 6f 67 65 74 68  ues OR-ed togeth
4f10: 65 72 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68 65  er:  .** (1) the
4f20: 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
4f30: 66 6f 72 20 61 20 63 6f 70 79 20 6f 66 20 74 68  for a copy of th
4f40: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  e Expr structure
4f50: 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28 32   only and .** (2
4f60: 29 20 74 68 65 20 45 50 5f 78 78 78 20 66 6c 61  ) the EP_xxx fla
4f70: 67 73 20 74 68 61 74 20 69 6e 64 69 63 61 74 65  gs that indicate
4f80: 20 77 68 61 74 20 74 68 65 20 73 74 72 75 63 74   what the struct
4f90: 75 72 65 20 73 69 7a 65 20 73 68 6f 75 6c 64 20  ure size should 
4fa0: 62 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  be..** The retur
4fb0: 6e 20 76 61 6c 75 65 73 20 69 73 20 61 6c 77 61  n values is alwa
4fc0: 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a  ys one of:.**.**
4fd0: 20 20 20 20 20 20 45 58 50 52 5f 46 55 4c 4c 53        EXPR_FULLS
4fe0: 49 5a 45 0a 2a 2a 20 20 20 20 20 20 45 58 50 52  IZE.**      EXPR
4ff0: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 20 20 7c  _REDUCEDSIZE   |
5000: 20 45 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20 20   EP_Reduced.**  
5010: 20 20 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e      EXPR_TOKENON
5020: 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65  LYSIZE | EP_Toke
5030: 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nOnly.**.** The 
5040: 73 69 7a 65 20 6f 66 20 74 68 65 20 73 74 72 75  size of the stru
5050: 63 74 75 72 65 20 63 61 6e 20 62 65 20 66 6f 75  cture can be fou
5060: 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68  nd by masking th
5070: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
5080: 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * of this routin
5090: 65 20 77 69 74 68 20 30 78 66 66 66 2e 20 20 54  e with 0xfff.  T
50a0: 68 65 20 66 6c 61 67 73 20 63 61 6e 20 62 65 20  he flags can be 
50b0: 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67  found by masking
50c0: 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76   the.** return v
50d0: 61 6c 75 65 20 77 69 74 68 20 45 50 5f 52 65 64  alue with EP_Red
50e0: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
50f0: 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  y..**.** Note th
5100: 61 74 20 77 69 74 68 20 66 6c 61 67 73 3d 3d 45  at with flags==E
5110: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 74  XPRDUP_REDUCE, t
5120: 68 69 73 20 72 6f 75 74 69 6e 65 73 20 77 6f 72  his routines wor
5130: 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a  ks on full-size.
5140: 2a 2a 20 28 75 6e 72 65 64 75 63 65 64 29 20 45  ** (unreduced) E
5150: 78 70 72 20 6f 62 6a 65 63 74 73 20 61 73 20 74  xpr objects as t
5160: 68 65 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c 6c  hey or originall
5170: 79 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  y constructed by
5180: 20 74 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a 20   the parser..** 
5190: 44 75 72 69 6e 67 20 65 78 70 72 65 73 73 69 6f  During expressio
51a0: 6e 20 61 6e 61 6c 79 73 69 73 2c 20 65 78 74 72  n analysis, extr
51b0: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  a information is
51c0: 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d 6f   computed and mo
51d0: 76 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65  ved into.** late
51e0: 72 20 70 61 72 74 73 20 6f 66 20 74 65 68 20 45  r parts of teh E
51f0: 78 70 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 74  xpr object and t
5200: 68 61 74 20 65 78 74 72 61 20 69 6e 66 6f 72 6d  hat extra inform
5210: 61 74 69 6f 6e 20 6d 69 67 68 74 20 67 65 74 20  ation might get 
5220: 63 68 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20 69  chopped.** off i
5230: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
5240: 20 69 73 20 72 65 64 75 63 65 64 2e 20 20 4e 6f   is reduced.  No
5250: 74 65 20 61 6c 73 6f 20 74 68 61 74 20 69 74 20  te also that it 
5260: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f  does not work to
5270: 0a 2a 2a 20 6d 61 6b 65 20 61 20 45 58 50 52 44  .** make a EXPRD
5280: 55 50 5f 52 45 44 55 43 45 20 63 6f 70 79 20 6f  UP_REDUCE copy o
5290: 66 20 61 20 72 65 64 75 63 65 64 20 65 78 70 72  f a reduced expr
52a0: 65 73 73 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f  ession.  It is o
52b0: 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20  nly legal.** to 
52c0: 72 65 64 75 63 65 20 61 20 70 72 69 73 74 69 6e  reduce a pristin
52d0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  e expression tre
52e0: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73 65  e from the parse
52f0: 72 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  r.  The implemen
5300: 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70  tation.** of dup
5310: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
5320: 28 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69  () contain multi
5330: 70 6c 65 20 61 73 73 65 72 74 28 29 20 73 74 61  ple assert() sta
5340: 74 65 6d 65 6e 74 73 20 74 68 61 74 20 61 74 74  tements that att
5350: 65 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72  empt.** to enfor
5360: 63 65 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  ce this constrai
5370: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
5380: 74 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  t dupedExprStruc
5390: 74 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69  tSize(Expr *p, i
53a0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74  nt flags){.  int
53b0: 20 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74   nSize;.  assert
53c0: 28 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50  ( flags==EXPRDUP
53d0: 5f 52 45 44 55 43 45 20 7c 7c 20 66 6c 61 67 73  _REDUCE || flags
53e0: 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f  ==0 ); /* Only o
53f0: 6e 65 20 66 6c 61 67 20 76 61 6c 75 65 20 61 6c  ne flag value al
5400: 6c 6f 77 65 64 20 2a 2f 0a 20 20 69 66 28 20 30  lowed */.  if( 0
5410: 3d 3d 28 66 6c 61 67 73 26 45 58 50 52 44 55 50  ==(flags&EXPRDUP
5420: 5f 52 45 44 55 43 45 29 20 29 7b 0a 20 20 20 20  _REDUCE) ){.    
5430: 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c  nSize = EXPR_FUL
5440: 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  LSIZE;.  }else{.
5450: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
5460: 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
5470: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
5480: 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
5490: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
54a0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
54b0: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a  P_FromJoin) ); .
54c0: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e      assert( (p->
54d0: 66 6c 61 67 73 32 20 26 20 45 50 32 5f 4d 61 6c  flags2 & EP2_Mal
54e0: 6c 6f 63 65 64 54 6f 6b 65 6e 29 3d 3d 30 20 29  locedToken)==0 )
54f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
5500: 2d 3e 66 6c 61 67 73 32 20 26 20 45 50 32 5f 49  ->flags2 & EP2_I
5510: 72 72 65 64 75 63 69 62 6c 65 29 3d 3d 30 20 29  rreducible)==0 )
5520: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65  ;.    if( p->pLe
5530: 66 74 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 20  ft || p->pRight 
5540: 7c 7c 20 70 2d 3e 70 43 6f 6c 6c 20 7c 7c 20 70  || p->pColl || p
5550: 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20  ->x.pList ){.   
5560: 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f     nSize = EXPR_
5570: 52 45 44 55 43 45 44 53 49 5a 45 20 7c 20 45 50  REDUCEDSIZE | EP
5580: 5f 52 65 64 75 63 65 64 3b 0a 20 20 20 20 7d 65  _Reduced;.    }e
5590: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  lse{.      nSize
55a0: 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c   = EXPR_TOKENONL
55b0: 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e  YSIZE | EP_Token
55c0: 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Only;.    }.  }.
55d0: 20 20 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a    return nSize;.
55e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
55f0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
5600: 68 65 20 73 70 61 63 65 20 69 6e 20 62 79 74 65  he space in byte
5610: 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74  s required to st
5620: 6f 72 65 20 74 68 65 20 63 6f 70 79 20 0a 2a 2a  ore the copy .**
5630: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
5640: 75 63 74 75 72 65 20 61 6e 64 20 61 20 63 6f 70  ucture and a cop
5650: 79 20 6f 66 20 74 68 65 20 45 78 70 72 2e 75 2e  y of the Expr.u.
5660: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69  zToken string (i
5670: 66 20 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67  f that.** string
5680: 20 69 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a 2f   is defined.).*/
5690: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65  .static int dupe
56a0: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 45 78  dExprNodeSize(Ex
56b0: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
56c0: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  ){.  int nByte =
56d0: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
56e0: 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 20 26  Size(p, flags) &
56f0: 20 30 78 66 66 66 3b 0a 20 20 69 66 28 20 21 45   0xfff;.  if( !E
5700: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5710: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26  , EP_IntValue) &
5720: 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b  & p->u.zToken ){
5730: 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71  .    nByte += sq
5740: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d  lite3Strlen30(p-
5750: 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20  >u.zToken)+1;.  
5760: 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44  }.  return ROUND
5770: 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a  8(nByte);.}../*.
5780: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
5790: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
57a0: 71 75 69 72 65 64 20 74 6f 20 63 72 65 61 74 65  quired to create
57b0: 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20   a duplicate of 
57c0: 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73 69  the .** expressi
57d0: 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65  on passed as the
57e0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
57f0: 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
5800: 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61 73  ment is a.** mas
5810: 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58 50  k containing EXP
5820: 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a  RDUP_XXX flags..
5830: 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
5840: 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65  returned include
5850: 73 20 73 70 61 63 65 20 74 6f 20 63 72 65 61 74  s space to creat
5860: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
5870: 45 78 70 72 20 73 74 72 75 63 74 0a 2a 2a 20 69  Expr struct.** i
5880: 74 73 65 6c 66 20 61 6e 64 20 74 68 65 20 62 75  tself and the bu
5890: 66 66 65 72 20 72 65 66 65 72 72 65 64 20 74 6f  ffer referred to
58a0: 20 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65   by Expr.u.zToke
58b0: 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a  n, if any..**.**
58c0: 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   If the EXPRDUP_
58d0: 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73  REDUCE flag is s
58e0: 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74  et, then the ret
58f0: 75 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75 64  urn value includ
5900: 65 73 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20  es .** space to 
5910: 64 75 70 6c 69 63 61 74 65 20 61 6c 6c 20 45 78  duplicate all Ex
5920: 70 72 20 6e 6f 64 65 73 20 69 6e 20 74 68 65 20  pr nodes in the 
5930: 74 72 65 65 20 66 6f 72 6d 65 64 20 62 79 20 45  tree formed by E
5940: 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e  xpr.pLeft .** an
5950: 64 20 45 78 70 72 2e 70 52 69 67 68 74 20 76 61  d Expr.pRight va
5960: 72 69 61 62 6c 65 73 20 28 62 75 74 20 6e 6f 74  riables (but not
5970: 20 66 6f 72 20 61 6e 79 20 73 74 72 75 63 74 75   for any structu
5980: 72 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f  res pointed to o
5990: 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64 20  r .** descended 
59a0: 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e  from the Expr.x.
59b0: 70 4c 69 73 74 20 6f 72 20 45 78 70 72 2e 78 2e  pList or Expr.x.
59c0: 70 53 65 6c 65 63 74 20 76 61 72 69 61 62 6c 65  pSelect variable
59d0: 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  s)..*/.static in
59e0: 74 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  t dupedExprSize(
59f0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
5a00: 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  gs){.  int nByte
5a10: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b   = 0;.  if( p ){
5a20: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 64 75 70  .    nByte = dup
5a30: 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70  edExprNodeSize(p
5a40: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  , flags);.    if
5a50: 28 20 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f  ( flags&EXPRDUP_
5a60: 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20 20 20  REDUCE ){.      
5a70: 6e 42 79 74 65 20 2b 3d 20 64 75 70 65 64 45 78  nByte += dupedEx
5a80: 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74 2c  prSize(p->pLeft,
5a90: 20 66 6c 61 67 73 29 20 2b 20 64 75 70 65 64 45   flags) + dupedE
5aa0: 78 70 72 53 69 7a 65 28 70 2d 3e 70 52 69 67 68  xprSize(p->pRigh
5ab0: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  t, flags);.    }
5ac0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 42  .  }.  return nB
5ad0: 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  yte;.}../*.** Th
5ae0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73  is function is s
5af0: 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65  imilar to sqlite
5b00: 33 45 78 70 72 44 75 70 28 29 2c 20 65 78 63 65  3ExprDup(), exce
5b10: 70 74 20 74 68 61 74 20 69 66 20 70 7a 42 75 66  pt that if pzBuf
5b20: 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e  fer .** is not N
5b30: 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75 66 66  ULL then *pzBuff
5b40: 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  er is assumed to
5b50: 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
5b60: 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  er large enough 
5b70: 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65  .** to store the
5b80: 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73   copy of express
5b90: 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70 69 65  ion p, the copie
5ba0: 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  s of p->u.zToken
5bb0: 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63 61 62  .** (if applicab
5bc0: 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63 6f 70  le), and the cop
5bd0: 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e 70 4c  ies of the p->pL
5be0: 65 66 74 20 61 6e 64 20 70 2d 3e 70 52 69 67 68  eft and p->pRigh
5bf0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a  t expressions,.*
5c00: 2a 20 69 66 20 61 6e 79 2e 20 42 65 66 6f 72 65  * if any. Before
5c10: 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 42   returning, *pzB
5c20: 75 66 66 65 72 20 69 73 20 73 65 74 20 74 6f 20  uffer is set to 
5c30: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70  the first byte p
5c40: 61 73 73 65 64 20 74 68 65 0a 2a 2a 20 70 6f 72  assed the.** por
5c50: 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66 66  tion of the buff
5c60: 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 62  er copied into b
5c70: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
5c80: 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20  .*/.static Expr 
5c90: 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74 65 33  *exprDup(sqlite3
5ca0: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69   *db, Expr *p, i
5cb0: 6e 74 20 66 6c 61 67 73 2c 20 75 38 20 2a 2a 70  nt flags, u8 **p
5cc0: 7a 42 75 66 66 65 72 29 7b 0a 20 20 45 78 70 72  zBuffer){.  Expr
5cd0: 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20 20   *pNew = 0;     
5ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cf0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
5d00: 75 72 6e 20 2a 2f 0a 20 20 69 66 28 20 70 20 29  urn */.  if( p )
5d10: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
5d20: 69 73 52 65 64 75 63 65 64 20 3d 20 28 66 6c 61  isReduced = (fla
5d30: 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43  gs&EXPRDUP_REDUC
5d40: 45 29 3b 0a 20 20 20 20 75 38 20 2a 7a 41 6c 6c  E);.    u8 *zAll
5d50: 6f 63 3b 0a 20 20 20 20 75 33 32 20 73 74 61 74  oc;.    u32 stat
5d60: 69 63 46 6c 61 67 20 3d 20 30 3b 0a 0a 20 20 20  icFlag = 0;..   
5d70: 20 61 73 73 65 72 74 28 20 70 7a 42 75 66 66 65   assert( pzBuffe
5d80: 72 3d 3d 30 20 7c 7c 20 69 73 52 65 64 75 63 65  r==0 || isReduce
5d90: 64 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 67  d );..    /* Fig
5da0: 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 74 6f  ure out where to
5db0: 20 77 72 69 74 65 20 74 68 65 20 6e 65 77 20 45   write the new E
5dc0: 78 70 72 20 73 74 72 75 63 74 75 72 65 2e 20 2a  xpr structure. *
5dd0: 2f 0a 20 20 20 20 69 66 28 20 70 7a 42 75 66 66  /.    if( pzBuff
5de0: 65 72 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c  er ){.      zAll
5df0: 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b 0a  oc = *pzBuffer;.
5e00: 20 20 20 20 20 20 73 74 61 74 69 63 46 6c 61 67        staticFlag
5e10: 20 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a 20 20   = EP_Static;.  
5e20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
5e30: 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44  Alloc = sqlite3D
5e40: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 64  bMallocRaw(db, d
5e50: 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2c 20  upedExprSize(p, 
5e60: 66 6c 61 67 73 29 29 3b 0a 20 20 20 20 7d 0a 20  flags));.    }. 
5e70: 20 20 20 70 4e 65 77 20 3d 20 28 45 78 70 72 20     pNew = (Expr 
5e80: 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 20 20 69  *)zAlloc;..    i
5e90: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
5ea0: 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53 69 7a 65   /* Set nNewSize
5eb0: 20 74 6f 20 74 68 65 20 73 69 7a 65 20 61 6c 6c   to the size all
5ec0: 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  ocated for the s
5ed0: 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64  tructure pointed
5ee0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 79 20   to.      ** by 
5ef0: 70 4e 65 77 2e 20 54 68 69 73 20 69 73 20 65 69  pNew. This is ei
5f00: 74 68 65 72 20 45 58 50 52 5f 46 55 4c 4c 53 49  ther EXPR_FULLSI
5f10: 5a 45 2c 20 45 58 50 52 5f 52 45 44 55 43 45 44  ZE, EXPR_REDUCED
5f20: 53 49 5a 45 20 6f 72 0a 20 20 20 20 20 20 2a 2a  SIZE or.      **
5f30: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
5f40: 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73  IZE. nToken is s
5f50: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
5f60: 20 6f 66 20 62 79 74 65 73 20 63 6f 6e 73 75 6d   of bytes consum
5f70: 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 74  ed.      ** by t
5f80: 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70  he copy of the p
5f90: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e  ->u.zToken strin
5fa0: 67 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20  g (if any)..    
5fb0: 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74    */.      const
5fc0: 20 75 6e 73 69 67 6e 65 64 20 6e 53 74 72 75 63   unsigned nStruc
5fd0: 74 53 69 7a 65 20 3d 20 64 75 70 65 64 45 78 70  tSize = dupedExp
5fe0: 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20 66  rStructSize(p, f
5ff0: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 63 6f 6e  lags);.      con
6000: 73 74 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65 20  st int nNewSize 
6010: 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20  = nStructSize & 
6020: 30 78 66 66 66 3b 0a 20 20 20 20 20 20 69 6e 74  0xfff;.      int
6030: 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 69   nToken;.      i
6040: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
6050: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
6060: 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b  ue) && p->u.zTok
6070: 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 54  en ){.        nT
6080: 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  oken = sqlite3St
6090: 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b  rlen30(p->u.zTok
60a0: 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 7d  en) + 1;.      }
60b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 54  else{.        nT
60c0: 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  oken = 0;.      
60d0: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 52 65  }.      if( isRe
60e0: 64 75 63 65 64 20 29 7b 0a 20 20 20 20 20 20 20  duced ){.       
60f0: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
6100: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52  Property(p, EP_R
6110: 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20 20  educed)==0 );.  
6120: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c        memcpy(zAl
6130: 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a 65  loc, p, nNewSize
6140: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
6150: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 69 7a          int nSiz
6160: 65 20 3d 20 65 78 70 72 53 74 72 75 63 74 53 69  e = exprStructSi
6170: 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 6d  ze(p);.        m
6180: 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c  emcpy(zAlloc, p,
6190: 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20   nSize);.       
61a0: 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63 5b   memset(&zAlloc[
61b0: 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52 5f  nSize], 0, EXPR_
61c0: 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29 3b  FULLSIZE-nSize);
61d0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
61e0: 2f 2a 20 53 65 74 20 74 68 65 20 45 50 5f 52 65  /* Set the EP_Re
61f0: 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f  duced, EP_TokenO
6200: 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53 74 61 74  nly, and EP_Stat
6210: 69 63 20 66 6c 61 67 73 20 61 70 70 72 6f 70 72  ic flags appropr
6220: 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 20  iately. */.     
6230: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d 20   pNew->flags &= 
6240: 7e 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  ~(EP_Reduced|EP_
6250: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61  TokenOnly|EP_Sta
6260: 74 69 63 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  tic);.      pNew
6270: 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75  ->flags |= nStru
6280: 63 74 53 69 7a 65 20 26 20 28 45 50 5f 52 65 64  ctSize & (EP_Red
6290: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
62a0: 79 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  y);.      pNew->
62b0: 66 6c 61 67 73 20 7c 3d 20 73 74 61 74 69 63 46  flags |= staticF
62c0: 6c 61 67 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  lag;..      /* C
62d0: 6f 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f  opy the p->u.zTo
62e0: 6b 65 6e 20 73 74 72 69 6e 67 2c 20 69 66 20 61  ken string, if a
62f0: 6e 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ny. */.      if(
6300: 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20   nToken ){.     
6310: 20 20 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20     char *zToken 
6320: 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  = pNew->u.zToken
6330: 20 3d 20 28 63 68 61 72 2a 29 26 7a 41 6c 6c 6f   = (char*)&zAllo
6340: 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a 20 20 20  c[nNewSize];.   
6350: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f 6b       memcpy(zTok
6360: 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  en, p->u.zToken,
6370: 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20   nToken);.      
6380: 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  }..      if( 0==
6390: 28 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d  ((p->flags|pNew-
63a0: 3e 66 6c 61 67 73 29 20 26 20 45 50 5f 54 6f 6b  >flags) & EP_Tok
63b0: 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  enOnly) ){.     
63c0: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
63d0: 65 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63  e pNew->x.pSelec
63e0: 74 20 6f 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69  t or pNew->x.pLi
63f0: 73 74 20 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20  st member. */.  
6400: 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
6410: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
6420: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
6430: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e          pNew->x.
6440: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
6450: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
6460: 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69 73 52  ->x.pSelect, isR
6470: 65 64 75 63 65 64 29 3b 0a 20 20 20 20 20 20 20  educed);.       
6480: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6490: 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20    pNew->x.pList 
64a0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
64b0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c  tDup(db, p->x.pL
64c0: 69 73 74 2c 20 69 73 52 65 64 75 63 65 64 29 3b  ist, isReduced);
64d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
64e0: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c   }..      /* Fil
64f0: 6c 20 69 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74  l in pNew->pLeft
6500: 20 61 6e 64 20 70 4e 65 77 2d 3e 70 52 69 67 68   and pNew->pRigh
6510: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  t. */.      if( 
6520: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
6530: 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75  ty(pNew, EP_Redu
6540: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
6550: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 41 6c  ) ){.        zAl
6560: 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70 72  loc += dupedExpr
6570: 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67  NodeSize(p, flag
6580: 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  s);.        if( 
6590: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
65a0: 70 4e 65 77 2c 20 45 50 5f 52 65 64 75 63 65 64  pNew, EP_Reduced
65b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
65c0: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 65 78 70  New->pLeft = exp
65d0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66  rDup(db, p->pLef
65e0: 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  t, EXPRDUP_REDUC
65f0: 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20  E, &zAlloc);.   
6600: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69         pNew->pRi
6610: 67 68 74 20 3d 20 65 78 70 72 44 75 70 28 64 62  ght = exprDup(db
6620: 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45 58 50  , p->pRight, EXP
6630: 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41  RDUP_REDUCE, &zA
6640: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 7d  lloc);.        }
6650: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 7a 42  .        if( pzB
6660: 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20  uffer ){.       
6670: 20 20 20 2a 70 7a 42 75 66 66 65 72 20 3d 20 7a     *pzBuffer = z
6680: 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 20 20 7d  Alloc;.        }
6690: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
66a0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
66b0: 73 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  s2 = 0;.        
66c0: 69 66 28 20 21 45 78 70 72 48 61 73 41 6e 79 50  if( !ExprHasAnyP
66d0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
66e0: 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  kenOnly) ){.    
66f0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66        pNew->pLef
6700: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
6710: 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c  up(db, p->pLeft,
6720: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   0);.          p
6730: 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71  New->pRight = sq
6740: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
6750: 20 70 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a   p->pRight, 0);.
6760: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6770: 7d 0a 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  }..    }.  }.  r
6780: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
6790: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
67a0: 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74  ng group of rout
67b0: 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63  ines make deep c
67c0: 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73 73  opies of express
67d0: 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73  ions,.** express
67e0: 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69  ion lists, ID li
67f0: 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20  sts, and select 
6800: 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65  statements.  The
6810: 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62   copies can.** b
6820: 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62 65  e deleted (by be
6830: 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74 68  ing passed to th
6840: 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20 2e  eir respective .
6850: 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69  ..Delete() routi
6860: 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20  nes).** without 
6870: 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72  effecting the or
6880: 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54  iginals..**.** T
6890: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
68a0: 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72  st, ID, and sour
68b0: 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20  ce lists return 
68c0: 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  by sqlite3ExprLi
68d0: 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69  stDup(),.** sqli
68e0: 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20  te3IdListDup(), 
68f0: 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  and sqlite3SrcLi
6900: 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20  stDup() can not 
6910: 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e  be further expan
6920: 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65  ded .** by subse
6930: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
6940: 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64  qlite*ListAppend
6950: 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a  () routines..**.
6960: 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68  ** Any tables th
6970: 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d  at the SrcList m
6980: 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72  ight point to ar
6990: 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64  e not duplicated
69a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
69b0: 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74  s parameter cont
69c0: 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69  ains a combinati
69d0: 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44 55  on of the EXPRDU
69e0: 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20  P_XXX flags..** 
69f0: 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52  If the EXPRDUP_R
6a00: 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65  EDUCE flag is se
6a10: 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 75  t, then the stru
6a20: 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 69  cture returned i
6a30: 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64  s a.** truncated
6a40: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
6a50: 75 73 75 61 6c 20 45 78 70 72 20 73 74 72 75 63  usual Expr struc
6a60: 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62  ture that will b
6a70: 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70  e stored as.** p
6a80: 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65  art of the in-me
6a90: 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
6aa0: 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62  ion of the datab
6ab0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45  ase schema..*/.E
6ac0: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
6ad0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
6ae0: 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c   Expr *p, int fl
6af0: 61 67 73 29 7b 0a 20 20 72 65 74 75 72 6e 20 65  ags){.  return e
6b00: 78 70 72 44 75 70 28 64 62 2c 20 70 2c 20 66 6c  xprDup(db, p, fl
6b10: 61 67 73 2c 20 30 29 3b 0a 7d 0a 45 78 70 72 4c  ags, 0);.}.ExprL
6b20: 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72  ist *sqlite3Expr
6b30: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
6b40: 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *db, ExprList *p
6b50: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
6b60: 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a  ExprList *pNew;.
6b70: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
6b80: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a  t_item *pItem, *
6b90: 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20  pOldItem;.  int 
6ba0: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
6bb0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
6bc0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
6bd0: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
6be0: 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28  (*pNew) );.  if(
6bf0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
6c00: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 45 43  n 0;.  pNew->iEC
6c10: 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 70 4e 65  ursor = 0;.  pNe
6c20: 77 2d 3e 6e 45 78 70 72 20 3d 20 70 4e 65 77 2d  w->nExpr = pNew-
6c30: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 45 78  >nAlloc = p->nEx
6c40: 70 72 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  pr;.  pNew->a = 
6c50: 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65 33 44  pItem = sqlite3D
6c60: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 20  bMallocRaw(db,  
6c70: 70 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66 28  p->nExpr*sizeof(
6c80: 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66  p->a[0]) );.  if
6c90: 28 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20  ( pItem==0 ){.  
6ca0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
6cb0: 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72  db, pNew);.    r
6cc0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20  eturn 0;.  } .  
6cd0: 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b  pOldItem = p->a;
6ce0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
6cf0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
6d00: 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b  em++, pOldItem++
6d10: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 6c  ){.    Expr *pOl
6d20: 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d  dExpr = pOldItem
6d30: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 70 49 74  ->pExpr;.    pIt
6d40: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69  em->pExpr = sqli
6d50: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
6d60: 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67 73 29 3b  OldExpr, flags);
6d70: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  .    pItem->zNam
6d80: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
6d90: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
6da0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49  ->zName);.    pI
6db0: 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c  tem->zSpan = sql
6dc0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
6dd0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e   pOldItem->zSpan
6de0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f  );.    pItem->so
6df0: 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49 74  rtOrder = pOldIt
6e00: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  em->sortOrder;. 
6e10: 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d     pItem->done =
6e20: 20 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69   0;.    pItem->i
6e30: 43 6f 6c 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  Col = pOldItem->
6e40: 69 43 6f 6c 3b 0a 20 20 20 20 70 49 74 65 6d 2d  iCol;.    pItem-
6e50: 3e 69 41 6c 69 61 73 20 3d 20 70 4f 6c 64 49 74  >iAlias = pOldIt
6e60: 65 6d 2d 3e 69 41 6c 69 61 73 3b 0a 20 20 7d 0a  em->iAlias;.  }.
6e70: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
6e80: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f  ../*.** If curso
6e90: 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69  rs, triggers, vi
6ea0: 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69  ews and subqueri
6eb0: 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74  es are all omitt
6ec0: 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62  ed from.** the b
6ed0: 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20  uild, then none 
6ee0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
6ef0: 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70   routines, excep
6f00: 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65  t for .** sqlite
6f10: 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61  3SelectDup(), ca
6f20: 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c  n be called. sql
6f30: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20  ite3SelectDup() 
6f40: 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  is sometimes.** 
6f50: 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55  called with a NU
6f60: 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  LL argument..*/.
6f70: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
6f80: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
6f90: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
6fa0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20  E_OMIT_TRIGGER) 
6fb0: 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  \. || !defined(S
6fc0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
6fd0: 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71  ERY).SrcList *sq
6fe0: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28  lite3SrcListDup(
6ff0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63  sqlite3 *db, Src
7000: 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  List *p, int fla
7010: 67 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  gs){.  SrcList *
7020: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pNew;.  int i;. 
7030: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66   int nByte;.  if
7040: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
7050: 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  0;.  nByte = siz
7060: 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53  eof(*p) + (p->nS
7070: 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d  rc>0 ? sizeof(p-
7080: 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72  >a[0]) * (p->nSr
7090: 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65  c-1) : 0);.  pNe
70a0: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
70b0: 6c 6f 63 52 61 77 28 64 62 2c 20 6e 42 79 74 65  locRaw(db, nByte
70c0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
70d0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
70e0: 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65  pNew->nSrc = pNe
70f0: 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  w->nAlloc = p->n
7100: 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Src;.  for(i=0; 
7110: 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  i<p->nSrc; i++){
7120: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
7130: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
7140: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
7150: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
7160: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49  List_item *pOldI
7170: 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a  tem = &p->a[i];.
7180: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
7190: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
71a0: 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74  Database = sqlit
71b0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
71c0: 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  OldItem->zDataba
71d0: 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  se);.    pNewIte
71e0: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
71f0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
7200: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
7210: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
7220: 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 44  Alias = sqlite3D
7230: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
7240: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
7250: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69     pNewItem->joi
7260: 6e 74 79 70 65 20 3d 20 70 4f 6c 64 49 74 65 6d  ntype = pOldItem
7270: 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  ->jointype;.    
7280: 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pNewItem->iCurso
7290: 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43  r = pOldItem->iC
72a0: 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49  ursor;.    pNewI
72b0: 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64  tem->isPopulated
72c0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 50   = pOldItem->isP
72d0: 6f 70 75 6c 61 74 65 64 3b 0a 20 20 20 20 70 4e  opulated;.    pN
72e0: 65 77 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d  ewItem->zIndex =
72f0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
7300: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
7310: 49 6e 64 65 78 29 3b 0a 20 20 20 20 70 4e 65 77  Index);.    pNew
7320: 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64  Item->notIndexed
7330: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6e 6f 74   = pOldItem->not
7340: 49 6e 64 65 78 65 64 3b 0a 20 20 20 20 70 4e 65  Indexed;.    pNe
7350: 77 49 74 65 6d 2d 3e 70 49 6e 64 65 78 20 3d 20  wItem->pIndex = 
7360: 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 6e 64 65 78  pOldItem->pIndex
7370: 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65  ;.    pTab = pNe
7380: 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f  wItem->pTab = pO
7390: 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  ldItem->pTab;.  
73a0: 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
73b0: 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b      pTab->nRef++
73c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
73d0: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  Item->pSelect = 
73e0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
73f0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  (db, pOldItem->p
7400: 53 65 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a  Select, flags);.
7410: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f      pNewItem->pO
7420: 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  n = sqlite3ExprD
7430: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
7440: 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20  >pOn, flags);.  
7450: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69    pNewItem->pUsi
7460: 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69  ng = sqlite3IdLi
7470: 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  stDup(db, pOldIt
7480: 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20  em->pUsing);.   
7490: 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73   pNewItem->colUs
74a0: 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63  ed = pOldItem->c
74b0: 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65  olUsed;.  }.  re
74c0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c  turn pNew;.}.IdL
74d0: 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
74e0: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
74f0: 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20  b, IdList *p){. 
7500: 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20   IdList *pNew;. 
7510: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d   int i;.  if( p=
7520: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
7530: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
7540: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
7550: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
7560: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
7570: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
7580: 2d 3e 6e 49 64 20 3d 20 70 4e 65 77 2d 3e 6e 41  ->nId = pNew->nA
7590: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20  lloc = p->nId;. 
75a0: 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74   pNew->a = sqlit
75b0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
75c0: 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28  , p->nId*sizeof(
75d0: 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66  p->a[0]) );.  if
75e0: 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a  ( pNew->a==0 ){.
75f0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
7600: 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20  e(db, pNew);.   
7610: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
7620: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
7630: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  Id; i++){.    st
7640: 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d  ruct IdList_item
7650: 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e   *pNewItem = &pN
7660: 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74  ew->a[i];.    st
7670: 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d  ruct IdList_item
7680: 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d   *pOldItem = &p-
7690: 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49  >a[i];.    pNewI
76a0: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
76b0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
76c0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
76d0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
76e0: 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  >idx = pOldItem-
76f0: 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75  >idx;.  }.  retu
7700: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63  rn pNew;.}.Selec
7710: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
7720: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
7730: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
7740: 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c 65 63 74  flags){.  Select
7750: 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d   *pNew;.  if( p=
7760: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
7770: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
7780: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
7790: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
77a0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
77b0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  urn 0;.  pNew->p
77c0: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
77d0: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
77e0: 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29  ->pEList, flags)
77f0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d  ;.  pNew->pSrc =
7800: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
7810: 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20  up(db, p->pSrc, 
7820: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
7830: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
7840: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
7850: 57 68 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20  Where, flags);. 
7860: 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
7870: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
7880: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f  tDup(db, p->pGro
7890: 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20  upBy, flags);.  
78a0: 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20  pNew->pHaving = 
78b0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
78c0: 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66  b, p->pHaving, f
78d0: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
78e0: 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
78f0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
7900: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c   p->pOrderBy, fl
7910: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70  ags);.  pNew->op
7920: 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77   = p->op;.  pNew
7930: 2d 3e 70 50 72 69 6f 72 20 3d 20 73 71 6c 69 74  ->pPrior = sqlit
7940: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
7950: 70 2d 3e 70 50 72 69 6f 72 2c 20 66 6c 61 67 73  p->pPrior, flags
7960: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  );.  pNew->pLimi
7970: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
7980: 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  up(db, p->pLimit
7990: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
79a0: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73 71 6c 69  ->pOffset = sqli
79b0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
79c0: 2d 3e 70 4f 66 66 73 65 74 2c 20 66 6c 61 67 73  ->pOffset, flags
79d0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69  );.  pNew->iLimi
79e0: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69  t = 0;.  pNew->i
79f0: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4e  Offset = 0;.  pN
7a00: 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70  ew->selFlags = p
7a10: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53 46  ->selFlags & ~SF
7a20: 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
7a30: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f    pNew->pRightmo
7a40: 73 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  st = 0;.  pNew->
7a50: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
7a60: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
7a70: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
7a80: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  -1;.  pNew->addr
7a90: 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31  OpenEphm[2] = -1
7aa0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
7ab0: 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20  .}.#else.Select 
7ac0: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
7ad0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
7ae0: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c  elect *p, int fl
7af0: 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ags){.  assert( 
7b00: 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  p==0 );.  return
7b10: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f   0;.}.#endif.../
7b20: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
7b30: 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e  lement to the en
7b40: 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  d of an expressi
7b50: 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69  on list.  If pLi
7b60: 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c  st is.** initial
7b70: 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72  ly NULL, then cr
7b80: 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  eate a new expre
7b90: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
7ba0: 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
7bb0: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
7bc0: 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74 69 72  ccurs, the entir
7bd0: 65 20 6c 69 73 74 20 69 73 20 66 72 65 65 64 20  e list is freed 
7be0: 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72  and.** NULL is r
7bf0: 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f 6e  eturned.  If non
7c00: 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65  -NULL is returne
7c10: 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75  d, then it is gu
7c20: 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61 74  aranteed.** that
7c30: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77   the new entry w
7c40: 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
7c50: 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70  appended..*/.Exp
7c60: 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78  rList *sqlite3Ex
7c70: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20  prListAppend(.  
7c80: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
7c90: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
7ca0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
7cb0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
7cc0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
7cd0: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65  to which to appe
7ce0: 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  nd. Might be NUL
7cf0: 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  L */.  Expr *pEx
7d00: 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  pr             /
7d10: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  * Expression to 
7d20: 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69 67  be appended. Mig
7d30: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
7d40: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
7d50: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
7d60: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
7d70: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
7d80: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
7d90: 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69  b, sizeof(ExprLi
7da0: 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
7db0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  List==0 ){.     
7dc0: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
7dd0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
7de0: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30  pList->nAlloc==0
7df0: 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c   );.  }.  if( pL
7e00: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c 69  ist->nAlloc<=pLi
7e10: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
7e20: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
7e30: 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 69 6e  _item *a;.    in
7e40: 74 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c  t n = pList->nAl
7e50: 6c 6f 63 2a 32 20 2b 20 34 3b 0a 20 20 20 20 61  loc*2 + 4;.    a
7e60: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
7e70: 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  loc(db, pList->a
7e80: 2c 20 6e 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74  , n*sizeof(pList
7e90: 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  ->a[0]));.    if
7ea0: 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( a==0 ){.      
7eb0: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
7ec0: 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20   }.    pList->a 
7ed0: 3d 20 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  = a;.    pList->
7ee0: 6e 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33  nAlloc = sqlite3
7ef0: 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c  DbMallocSize(db,
7f00: 20 61 29 2f 73 69 7a 65 6f 66 28 61 5b 30 5d 29   a)/sizeof(a[0])
7f10: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
7f20: 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20  pList->a!=0 );. 
7f30: 20 69 66 28 20 31 20 29 7b 0a 20 20 20 20 73 74   if( 1 ){.    st
7f40: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
7f50: 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69  em *pItem = &pLi
7f60: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
7f70: 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65  pr++];.    memse
7f80: 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65  t(pItem, 0, size
7f90: 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20  of(*pItem));.   
7fa0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20   pItem->pExpr = 
7fb0: 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20 72 65 74  pExpr;.  }.  ret
7fc0: 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d  urn pList;..no_m
7fd0: 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76  em:     .  /* Av
7fe0: 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f  oid leaking memo
7ff0: 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73  ry if malloc has
8000: 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71   failed. */.  sq
8010: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
8020: 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71  db, pExpr);.  sq
8030: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
8040: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
8050: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
8060: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
8070: 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20  rList.a[].zName 
8080: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d  element of the m
8090: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
80a0: 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68  ed item.** on th
80b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
80c0: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d  t..**.** pList m
80d0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c  ight be NULL fol
80e0: 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72  lowing an OOM er
80f0: 72 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65 20  ror.  But pName 
8100: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a  should never be.
8110: 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d  ** NULL.  If a m
8120: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
8130: 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72   fails, the pPar
8140: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
8150: 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20  iled flag.** is 
8160: 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
8170: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e  ite3ExprListSetN
8180: 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ame(.  Parse *pP
8190: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
81a0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
81b0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
81c0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
81d0: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
81e0: 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e  to add the span.
81f0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
8200: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me,           /*
8210: 20 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64 65   Name to be adde
8220: 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f  d */.  int dequo
8230: 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  te             /
8240: 2a 20 54 72 75 65 20 74 6f 20 63 61 75 73 65 20  * True to cause 
8250: 74 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20 64  the name to be d
8260: 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  equoted */.){.  
8270: 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
8280: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
8290: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20  mallocFailed!=0 
82a0: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
82b0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
82c0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
82d0: 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  m;.    assert( p
82e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
82f0: 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 4c  .    pItem = &pL
8300: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
8310: 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  xpr-1];.    asse
8320: 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  rt( pItem->zName
8330: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  ==0 );.    pItem
8340: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
8350: 33 44 62 53 74 72 4e 44 75 70 28 70 50 61 72 73  3DbStrNDup(pPars
8360: 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c  e->db, pName->z,
8370: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
8380: 69 66 28 20 64 65 71 75 6f 74 65 20 26 26 20 70  if( dequote && p
8390: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 20 73 71  Item->zName ) sq
83a0: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70 49 74  lite3Dequote(pIt
83b0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  em->zName);.  }.
83c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
83d0: 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53   ExprList.a[].zS
83e0: 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  pan element of t
83f0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
8400: 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f   added item.** o
8410: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
8420: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69   list..**.** pLi
8430: 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  st might be NULL
8440: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f   following an OO
8450: 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 53  M error.  But pS
8460: 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  pan should never
8470: 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66   be.** NULL.  If
8480: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
8490: 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20  tion fails, the 
84a0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
84b0: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a  ocFailed flag.**
84c0: 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   is set..*/.void
84d0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
84e0: 53 65 74 53 70 61 6e 28 0a 20 20 50 61 72 73 65  SetSpan(.  Parse
84f0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
8500: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
8510: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
8520: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
8530: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
8540: 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73  ich to add the s
8550: 70 61 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 53 70  pan. */.  ExprSp
8560: 61 6e 20 2a 70 53 70 61 6e 20 20 20 20 20 20 20  an *pSpan       
8570: 20 20 2f 2a 20 54 68 65 20 73 70 61 6e 20 74 6f    /* The span to
8580: 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 29 7b 0a   be added */.){.
8590: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
85a0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
85b0: 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c  sert( pList!=0 |
85c0: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
85d0: 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
85e0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75  List ){.    stru
85f0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
8600: 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74   *pItem = &pList
8610: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
8620: 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
8630: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20   pList->nExpr>0 
8640: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
8650: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8660: 7c 7c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3d  || pItem->pExpr=
8670: 3d 70 53 70 61 6e 2d 3e 70 45 78 70 72 20 29 3b  =pSpan->pExpr );
8680: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
8690: 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53  ee(db, pItem->zS
86a0: 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  pan);.    pItem-
86b0: 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33  >zSpan = sqlite3
86c0: 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63  DbStrNDup(db, (c
86d0: 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61  har*)pSpan->zSta
86e0: 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rt,.            
86f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8700: 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70 53          (int)(pS
8710: 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61  pan->zEnd - pSpa
8720: 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20 7d  n->zStart));.  }
8730: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
8740: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
8750: 20 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73   pEList contains
8760: 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69   more than iLimi
8770: 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c  t elements,.** l
8780: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
8790: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e  ssage in pParse.
87a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
87b0: 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e  ExprListCheckLen
87c0: 67 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gth(.  Parse *pP
87d0: 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74  arse,.  ExprList
87e0: 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73   *pEList,.  cons
87f0: 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a  t char *zObject.
8800: 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70 50  ){.  int mx = pP
8810: 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74  arse->db->aLimit
8820: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
8830: 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73  LUMN];.  testcas
8840: 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  e( pEList && pEL
8850: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29  ist->nExpr==mx )
8860: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  ;.  testcase( pE
8870: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
8880: 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20  nExpr==mx+1 );. 
8890: 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70   if( pEList && p
88a0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20  EList->nExpr>mx 
88b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
88c0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
88d0: 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
88e0: 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74   in %s", zObject
88f0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
8900: 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
8910: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
8920: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8930: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
8940: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
8950: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
8960: 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
8970: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
8980: 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69  pItem;.  if( pLi
8990: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
89a0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
89b0: 3e 61 21 3d 30 20 7c 7c 20 28 70 4c 69 73 74 2d  >a!=0 || (pList-
89c0: 3e 6e 45 78 70 72 3d 3d 30 20 26 26 20 70 4c 69  >nExpr==0 && pLi
89d0: 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29  st->nAlloc==0) )
89e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
89f0: 74 2d 3e 6e 45 78 70 72 3c 3d 70 4c 69 73 74 2d  t->nExpr<=pList-
8a00: 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 66 6f 72  >nAlloc );.  for
8a10: 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
8a20: 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e   i=0; i<pList->n
8a30: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
8a40: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
8a50: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
8a60: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
8a70: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8a80: 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  db, pItem->zName
8a90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
8aa0: 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
8ab0: 7a 53 70 61 6e 29 3b 0a 20 20 7d 0a 20 20 73 71  zSpan);.  }.  sq
8ac0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
8ad0: 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c  pList->a);.  sql
8ae0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
8af0: 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
8b00: 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
8b10: 72 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61  re Walker callba
8b20: 63 6b 73 2e 20 20 57 61 6c 6b 65 72 2e 75 2e 70  cks.  Walker.u.p
8b30: 69 20 69 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  i is a pointer.*
8b40: 2a 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e  * to an integer.
8b50: 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73    These routines
8b60: 20 61 72 65 20 63 68 65 63 6b 69 6e 67 20 61 6e   are checking an
8b70: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 73   expression to s
8b80: 65 65 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 61  ee.** if it is a
8b90: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65 74 20   constant.  Set 
8ba0: 2a 57 61 6c 6b 65 72 2e 75 2e 70 69 20 74 6f 20  *Walker.u.pi to 
8bb0: 30 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  0 if the express
8bc0: 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 6f  ion is.** not co
8bd0: 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  nstant..**.** Th
8be0: 65 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  ese callback rou
8bf0: 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
8c00: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
8c10: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
8c20: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
8c30: 49 73 43 6f 6e 73 74 61 6e 74 28 29 0a 2a 2a 20  IsConstant().** 
8c40: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
8c50: 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
8c60: 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  ().**     sqlite
8c70: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
8c80: 72 46 75 6e 63 74 69 6f 6e 28 29 0a 2a 2a 0a 2a  rFunction().**.*
8c90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
8ca0: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28  rNodeIsConstant(
8cb0: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
8cc0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a   Expr *pExpr){..
8cd0: 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d    /* If pWalker-
8ce0: 3e 75 2e 69 20 69 73 20 33 20 74 68 65 6e 20 61  >u.i is 3 then a
8cf0: 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 65  ny term of the e
8d00: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
8d10: 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74  omes from.  ** t
8d20: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
8d30: 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e  lauses of a join
8d40: 20 64 69 73 71 75 61 6c 69 66 69 65 73 20 74 68   disqualifies th
8d50: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  e expression.  *
8d60: 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e  * from being con
8d70: 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74  sidered constant
8d80: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b  . */.  if( pWalk
8d90: 65 72 2d 3e 75 2e 69 3d 3d 33 20 26 26 20 45 78  er->u.i==3 && Ex
8da0: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
8db0: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
8dc0: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c  oin) ){.    pWal
8dd0: 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20  ker->u.i = 0;.  
8de0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
8df0: 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63  rt;.  }..  switc
8e00: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
8e10: 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20      /* Consider 
8e20: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20  functions to be 
8e30: 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20  constant if all 
8e40: 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20  their arguments 
8e50: 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20  are constant.   
8e60: 20 2a 2a 20 61 6e 64 20 70 57 61 6c 6b 65 72 2d   ** and pWalker-
8e70: 3e 75 2e 69 3d 3d 32 20 2a 2f 0a 20 20 20 20 63  >u.i==2 */.    c
8e80: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
8e90: 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b  .      if( pWalk
8ea0: 65 72 2d 3e 75 2e 69 3d 3d 32 20 29 20 72 65 74  er->u.i==2 ) ret
8eb0: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20  urn 0;.      /* 
8ec0: 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a  Fall through */.
8ed0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a      case TK_ID:.
8ee0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
8ef0: 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
8f00: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  AGG_FUNCTION:.  
8f10: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
8f20: 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74 65 73 74  LUMN:.      test
8f30: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
8f40: 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20  =TK_ID );.      
8f50: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
8f60: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
8f70: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
8f80: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
8f90: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
8fa0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
8fb0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
8fc0: 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  G_COLUMN );.    
8fd0: 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d    pWalker->u.i =
8fe0: 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
8ff0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
9000: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 74  default:.      t
9010: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
9020: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
9030: 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49 73   /* selectNodeIs
9040: 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64 69  Constant will di
9050: 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20  sallow */.      
9060: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
9070: 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29  >op==TK_EXISTS )
9080: 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49  ; /* selectNodeI
9090: 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64  sConstant will d
90a0: 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  isallow */.     
90b0: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
90c0: 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  inue;.  }.}.stat
90d0: 69 63 20 69 6e 74 20 73 65 6c 65 63 74 4e 6f 64  ic int selectNod
90e0: 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b  eIsConstant(Walk
90f0: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
9100: 65 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20  ect *NotUsed){. 
9110: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
9120: 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70 57  R(NotUsed);.  pW
9130: 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a  alker->u.i = 0;.
9140: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
9150: 72 74 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  rt;.}.static int
9160: 20 65 78 70 72 49 73 43 6f 6e 73 74 28 45 78 70   exprIsConst(Exp
9170: 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69 74 46 6c  r *p, int initFl
9180: 61 67 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  ag){.  Walker w;
9190: 0a 20 20 77 2e 75 2e 69 20 3d 20 69 6e 69 74 46  .  w.u.i = initF
91a0: 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  lag;.  w.xExprCa
91b0: 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64  llback = exprNod
91c0: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77  eIsConstant;.  w
91d0: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
91e0: 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43   = selectNodeIsC
91f0: 6f 6e 73 74 61 6e 74 3b 0a 20 20 73 71 6c 69 74  onstant;.  sqlit
9200: 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
9210: 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 75 2e  );.  return w.u.
9220: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  i;.}../*.** Walk
9230: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
9240: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ree.  Return 1 i
9250: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9260: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
9270: 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f  and 0 if it invo
9280: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
9290: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
92a0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
92b0: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
92c0: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
92d0: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
92e0: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
92f0: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
9300: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
9310: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
9320: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
9330: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
9340: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
9350: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
9360: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
9370: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
9380: 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  , 1);.}../*.** W
9390: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
93a0: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
93b0: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
93c0: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
93d0: 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 20  ** that does no 
93e0: 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74  originate from t
93f0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
9400: 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e  lauses of a join
9410: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  ..** Return 0 if
9420: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
9430: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
9440: 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d  on calls or term
9450: 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20  s from.** an ON 
9460: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  or USING clause.
9470: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
9480: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
9490: 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20  Join(Expr *p){. 
94a0: 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f   return exprIsCo
94b0: 6e 73 74 28 70 2c 20 33 29 3b 0a 7d 0a 0a 2f 2a  nst(p, 3);.}../*
94c0: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
94d0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
94e0: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
94f0: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
9500: 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e  tant.** or a fun
9510: 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20  ction call with 
9520: 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
9530: 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20  ts.  Return and 
9540: 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72  0 if there.** ar
9550: 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e  e any variables.
9560: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
9570: 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
9580: 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62  function, a doub
9590: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
95a0: 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20   (ex: "abc").** 
95b0: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
95c0: 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73  variable but a s
95d0: 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ingle-quoted str
95e0: 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20  ing (ex: 'abc') 
95f0: 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74  is.** a constant
9600: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
9610: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
9620: 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70  Function(Expr *p
9630: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
9640: 49 73 43 6f 6e 73 74 28 70 2c 20 32 29 3b 0a 7d  IsConst(p, 2);.}
9650: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
9660: 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65  xpression p code
9670: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74  s a constant int
9680: 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61  eger that is sma
9690: 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20  ll enough.** to 
96a0: 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20  fit in a 32-bit 
96b0: 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
96c0: 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61  1 and put the va
96d0: 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67  lue of the integ
96e0: 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65  er.** in *pValue
96f0: 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73  .  If the expres
9700: 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69  sion is not an i
9710: 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20  nteger or if it 
9720: 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f  is too big.** to
9730: 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64   fit in a signed
9740: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
9750: 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65   return 0 and le
9760: 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68  ave *pValue unch
9770: 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
9780: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
9790: 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  er(Expr *p, int 
97a0: 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20  *pValue){.  int 
97b0: 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d  rc = 0;.  if( p-
97c0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
97d0: 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70 56 61  alue ){.    *pVa
97e0: 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61 6c 75  lue = p->u.iValu
97f0: 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  e;.    return 1;
9800: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70  .  }.  switch( p
9810: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
9820: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
9830: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
9840: 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a  3GetInt32(p->u.z
9850: 54 6f 6b 65 6e 2c 20 70 56 61 6c 75 65 29 3b 0a  Token, pValue);.
9860: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
9870: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
9880: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
9890: 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
98a0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
98b0: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
98c0: 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29  ->pLeft, pValue)
98d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
98e0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
98f0: 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
9900: 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66   int v;.      if
9910: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
9920: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
9930: 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20   &v) ){.        
9940: 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20  *pValue = -v;.  
9950: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
9960: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
9970: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
9980: 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d  ault: break;.  }
9990: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
99a0: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
99b0: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45  AnyProperty(p, E
99c0: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
99d0: 65 6e 4f 6e 6c 79 29 0a 20 20 20 20 20 20 20 20  enOnly).        
99e0: 20 20 20 20 20 20 20 7c 7c 20 28 70 2d 3e 66 6c         || (p->fl
99f0: 61 67 73 32 20 26 20 45 50 32 5f 4d 61 6c 6c 6f  ags2 & EP2_Mallo
9a00: 63 65 64 54 6f 6b 65 6e 29 3d 3d 30 20 29 3b 0a  cedToken)==0 );.
9a10: 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49      p->op = TK_I
9a20: 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 2d 3e 66  NTEGER;.    p->f
9a30: 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61  lags |= EP_IntVa
9a40: 6c 75 65 3b 0a 20 20 20 20 70 2d 3e 75 2e 69 56  lue;.    p->u.iV
9a50: 61 6c 75 65 20 3d 20 2a 70 56 61 6c 75 65 3b 0a  alue = *pValue;.
9a60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
9a70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
9a80: 20 46 41 4c 53 45 20 69 66 20 74 68 65 72 65 20   FALSE if there 
9a90: 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61  is no chance tha
9aa0: 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
9ab0: 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a   can be NULL..**
9ac0: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
9ad0: 73 73 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e  ssion might be N
9ae0: 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 65 78  ULL or if the ex
9af0: 70 72 65 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20  pression is too 
9b00: 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65  complex.** to te
9b10: 6c 6c 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20  ll return TRUE. 
9b20: 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75   .**.** This rou
9b30: 74 69 6e 65 20 69 73 20 75 73 65 64 20 61 73 20  tine is used as 
9b40: 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  an optimization,
9b50: 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75   to skip OP_IsNu
9b60: 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68  ll opcodes.** wh
9b70: 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  en we know that 
9b80: 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62  a value cannot b
9b90: 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20  e NULL.  Hence, 
9ba0: 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65  a false positive
9bb0: 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 54  .** (returning T
9bc0: 52 55 45 20 77 68 65 6e 20 69 6e 20 66 61 63 74  RUE when in fact
9bd0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9be0: 63 61 6e 20 6e 65 76 65 72 20 62 65 20 4e 55 4c  can never be NUL
9bf0: 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61  L) might.** be a
9c00: 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e   small performan
9c10: 63 65 20 68 69 74 20 62 75 74 20 69 73 20 6f 74  ce hit but is ot
9c20: 68 65 72 77 69 73 65 20 68 61 72 6d 6c 65 73 73  herwise harmless
9c30: 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a  .  On the other.
9c40: 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c 73 65  ** hand, a false
9c50: 20 6e 65 67 61 74 69 76 65 20 28 72 65 74 75 72   negative (retur
9c60: 6e 69 6e 67 20 46 41 4c 53 45 20 77 68 65 6e 20  ning FALSE when 
9c70: 74 68 65 20 72 65 73 75 6c 74 20 63 6f 75 6c 64  the result could
9c80: 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c   be NULL).** wil
9c90: 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20  l likely result 
9ca0: 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20  in an incorrect 
9cb0: 61 6e 73 77 65 72 2e 20 20 53 6f 20 77 68 65 6e  answer.  So when
9cc0: 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72   in doubt, retur
9cd0: 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e  n.** TRUE..*/.in
9ce0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  t sqlite3ExprCan
9cf0: 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70  BeNull(const Exp
9d00: 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a  r *p){.  u8 op;.
9d10: 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d    while( p->op==
9d20: 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f  TK_UPLUS || p->o
9d30: 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20  p==TK_UMINUS ){ 
9d40: 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a  p = p->pLeft; }.
9d50: 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20    op = p->op;.  
9d60: 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  if( op==TK_REGIS
9d70: 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70  TER ) op = p->op
9d80: 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  2;.  switch( op 
9d90: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
9da0: 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65  NTEGER:.    case
9db0: 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20   TK_STRING:.    
9dc0: 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20  case TK_FLOAT:. 
9dd0: 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a     case TK_BLOB:
9de0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
9df0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
9e00: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
9e10: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
9e20: 61 74 65 20 61 6e 20 4f 50 5f 49 73 4e 75 6c 6c  ate an OP_IsNull
9e30: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
9e40: 74 20 74 65 73 74 73 20 72 65 67 69 73 74 65 72  t tests register
9e50: 20 69 52 65 67 20 61 6e 64 20 6a 75 6d 70 73 0a   iReg and jumps.
9e60: 2a 2a 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69  ** to location i
9e70: 44 65 73 74 20 69 66 20 74 68 65 20 76 61 6c 75  Dest if the valu
9e80: 65 20 69 6e 20 69 52 65 67 20 69 73 20 4e 55 4c  e in iReg is NUL
9e90: 4c 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 6e  L.  The value in
9ea0: 20 69 52 65 67 20 0a 2a 2a 20 77 61 73 20 63 6f   iReg .** was co
9eb0: 6d 70 75 74 65 64 20 62 79 20 70 45 78 70 72 2e  mputed by pExpr.
9ec0: 20 20 49 66 20 77 65 20 63 61 6e 20 6c 6f 6f 6b    If we can look
9ed0: 20 61 74 20 70 45 78 70 72 20 61 74 20 63 6f 6d   at pExpr at com
9ee0: 70 69 6c 65 2d 74 69 6d 65 20 61 6e 64 0a 2a 2a  pile-time and.**
9ef0: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 61 74 20   determine that 
9f00: 69 74 20 63 61 6e 20 6e 65 76 65 72 20 67 65 6e  it can never gen
9f10: 65 72 61 74 65 20 61 20 4e 55 4c 4c 2c 20 74 68  erate a NULL, th
9f20: 65 6e 20 74 68 65 20 4f 50 5f 49 73 4e 75 6c 6c  en the OP_IsNull
9f30: 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61   operation.** ca
9f40: 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e 0a 2a 2f  n be omitted..*/
9f50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
9f60: 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28  rCodeIsNullJump(
9f70: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
9f80: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
9f90: 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  BE under constru
9fa0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  ction */.  const
9fb0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 2f   Expr *pExpr,  /
9fc0: 2a 20 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20  * Only generate 
9fd0: 4f 50 5f 49 73 4e 75 6c 6c 20 69 66 20 74 68 69  OP_IsNull if thi
9fe0: 73 20 65 78 70 72 20 63 61 6e 20 62 65 20 4e 55  s expr can be NU
9ff0: 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  LL */.  int iReg
a000: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
a010: 65 73 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e  est the value in
a020: 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 66   this register f
a030: 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  or NULL */.  int
a040: 20 69 44 65 73 74 20 20 20 20 20 20 20 20 20 20   iDest          
a050: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
a060: 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 6e 75   the value is nu
a070: 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 73  ll */.){.  if( s
a080: 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
a090: 75 6c 6c 28 70 45 78 70 72 29 20 29 7b 0a 20 20  ull(pExpr) ){.  
a0a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a0b0: 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
a0c0: 2c 20 69 52 65 67 2c 20 69 44 65 73 74 29 3b 0a  , iReg, iDest);.
a0d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
a0e0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
a0f0: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
a100: 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 77   is a constant w
a110: 68 69 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a  hich would be.**
a120: 20 75 6e 63 68 61 6e 67 65 64 20 62 79 20 4f 50   unchanged by OP
a130: 5f 41 66 66 69 6e 69 74 79 20 77 69 74 68 20 74  _Affinity with t
a140: 68 65 20 61 66 66 69 6e 69 74 79 20 67 69 76 65  he affinity give
a150: 6e 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a  n in the second.
a160: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  ** argument..**.
a170: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a180: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
a190: 6d 69 6e 65 20 69 66 20 74 68 65 20 4f 50 5f 41  mine if the OP_A
a1a0: 66 66 69 6e 69 74 79 20 6f 70 65 72 61 74 69 6f  ffinity operatio
a1b0: 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74  n.** can be omit
a1c0: 74 65 64 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f  ted.  When in do
a1d0: 75 62 74 20 72 65 74 75 72 6e 20 46 41 4c 53 45  ubt return FALSE
a1e0: 2e 20 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74  .  A false negat
a1f0: 69 76 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65  ive.** is harmle
a200: 73 73 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73  ss.  A false pos
a210: 69 74 69 76 65 2c 20 68 6f 77 65 76 65 72 2c 20  itive, however, 
a220: 63 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 74 68  can result in th
a230: 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65  e wrong.** answe
a240: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
a250: 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69  3ExprNeedsNoAffi
a260: 6e 69 74 79 43 68 61 6e 67 65 28 63 6f 6e 73 74  nityChange(const
a270: 20 45 78 70 72 20 2a 70 2c 20 63 68 61 72 20 61   Expr *p, char a
a280: 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20  ff){.  u8 op;.  
a290: 69 66 28 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  if( aff==SQLITE_
a2a0: 41 46 46 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72  AFF_NONE ) retur
a2b0: 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d  n 1;.  while( p-
a2c0: 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c  >op==TK_UPLUS ||
a2d0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55   p->op==TK_UMINU
a2e0: 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66  S ){ p = p->pLef
a2f0: 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f  t; }.  op = p->o
a300: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
a310: 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20  REGISTER ) op = 
a320: 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68  p->op2;.  switch
a330: 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
a340: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
a350: 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d       return aff=
a360: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45  =SQLITE_AFF_INTE
a370: 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  GER || aff==SQLI
a380: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
a390: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
a3a0: 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  K_FLOAT: {.     
a3b0: 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c   return aff==SQL
a3c0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20  ITE_AFF_REAL || 
a3d0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
a3e0: 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20  NUMERIC;.    }. 
a3f0: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
a400: 47 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  G: {.      retur
a410: 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  n aff==SQLITE_AF
a420: 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20  F_TEXT;.    }.  
a430: 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20    case TK_BLOB: 
a440: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
a450: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
a460: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
a470: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
a480: 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20  Table>=0 );  /* 
a490: 70 20 63 61 6e 6e 6f 74 20 62 65 20 70 61 72 74  p cannot be part
a4a0: 20 6f 66 20 61 20 43 48 45 43 4b 20 63 6f 6e 73   of a CHECK cons
a4b0: 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20  traint */.      
a4c0: 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d  return p->iColum
a4d0: 6e 3c 30 0a 20 20 20 20 20 20 20 20 20 20 26 26  n<0.          &&
a4e0: 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46   (aff==SQLITE_AF
a4f0: 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66  F_INTEGER || aff
a500: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
a510: 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ERIC);.    }.   
a520: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
a530: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
a540: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
a550: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
a560: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69  e given string i
a570: 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d  s a row-id colum
a580: 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73  n name..*/.int s
a590: 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f  qlite3IsRowid(co
a5a0: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
a5b0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
a5c0: 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29  mp(z, "_ROWID_")
a5d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
a5e0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
a5f0: 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29  ICmp(z, "ROWID")
a600: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
a610: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
a620: 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d  ICmp(z, "OID")==
a630: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
a640: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
a650: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
a660: 66 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f  f we are able to
a670: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
a680: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e   optimization on
a690: 20 61 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74   a.** query of t
a6a0: 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  he form.**.**   
a6b0: 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54      x IN (SELECT
a6c0: 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 57 68 65 72   ...).**.** Wher
a6d0: 65 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20  e the SELECT... 
a6e0: 63 6c 61 75 73 65 20 69 73 20 61 73 20 73 70 65  clause is as spe
a6f0: 63 69 66 69 65 64 20 62 79 20 74 68 65 20 70 61  cified by the pa
a700: 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 0a  rameter to this.
a710: 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  ** routine..**.*
a720: 2a 20 54 68 65 20 53 65 6c 65 63 74 20 6f 62 6a  * The Select obj
a730: 65 63 74 20 70 61 73 73 65 64 20 69 6e 20 68 61  ect passed in ha
a740: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
a750: 72 65 70 72 6f 63 65 73 73 65 64 20 61 6e 64 20  reprocessed and 
a760: 6e 6f 0a 2a 2a 20 65 72 72 6f 72 73 20 68 61 76  no.** errors hav
a770: 65 20 62 65 65 6e 20 66 6f 75 6e 64 2e 0a 2a 2f  e been found..*/
a780: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a790: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73 74  OMIT_SUBQUERY.st
a7a0: 61 74 69 63 20 69 6e 74 20 69 73 43 61 6e 64 69  atic int isCandi
a7b0: 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 53 65 6c  dateForInOpt(Sel
a7c0: 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69  ect *p){.  SrcLi
a7d0: 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72  st *pSrc;.  Expr
a7e0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
a7f0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69  Table *pTab;.  i
a800: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
a810: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
a820: 20 20 20 20 20 20 2f 2a 20 72 69 67 68 74 2d 68        /* right-h
a830: 61 6e 64 20 73 69 64 65 20 6f 66 20 49 4e 20 69  and side of IN i
a840: 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66  s SELECT */.  if
a850: 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72 65  ( p->pPrior ) re
a860: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
a870: 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f       /* Not a co
a880: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f  mpound SELECT */
a890: 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
a8a0: 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
a8b0: 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 20  t|SF_Aggregate) 
a8c0: 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  ){.    testcase(
a8d0: 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
a8e0: 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
a8f0: 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
a900: 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
a910: 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65  testcase( (p->se
a920: 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
a930: 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
a940: 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61  te))==SF_Aggrega
a950: 74 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  te );.    return
a960: 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e   0; /* No DISTIN
a970: 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e  CT keyword and n
a980: 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  o aggregate func
a990: 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61  tions */.  }.  a
a9a0: 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70  ssert( p->pGroup
a9b0: 42 79 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20  By==0 );        
a9c0: 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
a9d0: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
a9e0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d  */.  if( p->pLim
a9f0: 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  it ) return 0;  
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
aa10: 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75  as no LIMIT clau
aa20: 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  se */.  assert( 
aa30: 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b  p->pOffset==0 );
aa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aa50: 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d 65 61 6e 73  * No LIMIT means
aa60: 20 6e 6f 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20   no OFFSET */.  
aa70: 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20  if( p->pWhere ) 
aa80: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
aa90: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f         /* Has no
aaa0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
aab0: 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
aac0: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
aad0: 63 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53  c!=0 );.  if( pS
aae0: 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65  rc->nSrc!=1 ) re
aaf0: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
ab00: 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20   /* Single term 
ab10: 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  in FROM clause *
ab20: 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b  /.  if( pSrc->a[
ab30: 30 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74  0].pSelect ) ret
ab40: 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52  urn 0;     /* FR
ab50: 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71  OM is not a subq
ab60: 75 65 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a  uery or view */.
ab70: 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61    pTab = pSrc->a
ab80: 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 69 66 28 20  [0].pTab;.  if( 
ab90: 4e 45 56 45 52 28 70 54 61 62 3d 3d 30 29 20 29  NEVER(pTab==0) )
aba0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73   return 0;.  ass
abb0: 65 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65  ert( pTab->pSele
abc0: 63 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20  ct==0 );        
abd0: 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
abe0: 73 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77  se is not a view
abf0: 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74   */.  if( IsVirt
ac00: 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75  ual(pTab) ) retu
ac10: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20  rn 0;        /* 
ac20: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20  FROM clause not 
ac30: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
ac40: 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  */.  pEList = p-
ac50: 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  >pEList;.  if( p
ac60: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
ac70: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
ac80: 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20    /* One column 
ac90: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
aca0: 74 20 2a 2f 0a 20 20 69 66 28 20 70 45 4c 69 73  t */.  if( pELis
acb0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  t->a[0].pExpr->o
acc0: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72  p!=TK_COLUMN ) r
acd0: 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 75  eturn 0; /* Resu
ace0: 6c 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 2a  lt is a column *
acf0: 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  /.  return 1;.}.
ad00: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
ad10: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
ad20: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /../*.** This fu
ad30: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62  nction is used b
ad40: 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  y the implementa
ad50: 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 28  tion of the IN (
ad60: 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  ...) operator..*
ad70: 2a 20 49 74 27 73 20 6a 6f 62 20 69 73 20 74 6f  * It's job is to
ad80: 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20   find or create 
ad90: 61 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  a b-tree structu
ada0: 72 65 20 74 68 61 74 20 6d 61 79 20 62 65 20 75  re that may be u
adb0: 73 65 64 0a 2a 2a 20 65 69 74 68 65 72 20 74 6f  sed.** either to
adc0: 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72   test for member
add0: 73 68 69 70 20 6f 66 20 74 68 65 20 28 2e 2e 2e  ship of the (...
ade0: 29 20 73 65 74 20 6f 72 20 74 6f 20 69 74 65 72  ) set or to iter
adf0: 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 69  ate through.** i
ae00: 74 73 20 6d 65 6d 62 65 72 73 2c 20 73 6b 69 70  ts members, skip
ae10: 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73 2e  ping duplicates.
ae20: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78  .**.** The index
ae30: 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 20 6f   of the cursor o
ae40: 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d 74  pened on the b-t
ae50: 72 65 65 20 28 64 61 74 61 62 61 73 65 20 74 61  ree (database ta
ae60: 62 6c 65 2c 20 64 61 74 61 62 61 73 65 20 69 6e  ble, database in
ae70: 64 65 78 20 0a 2a 2a 20 6f 72 20 65 70 68 65 72  dex .** or epher
ae80: 6d 61 6c 20 74 61 62 6c 65 29 20 69 73 20 73 74  mal table) is st
ae90: 6f 72 65 64 20 69 6e 20 70 58 2d 3e 69 54 61 62  ored in pX->iTab
aea0: 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  le before this f
aeb0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
aec0: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
aed0: 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
aee0: 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 65  unction indicate
aef0: 73 20 74 68 65 20 62 2d 74 72 65 65 20 74 79 70  s the b-tree typ
af00: 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  e, as follows:.*
af10: 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  *.**   IN_INDEX_
af20: 52 4f 57 49 44 20 2d 20 54 68 65 20 63 75 72 73  ROWID - The curs
af30: 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
af40: 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c   a database tabl
af50: 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  e..**   IN_INDEX
af60: 5f 49 4e 44 45 58 20 2d 20 54 68 65 20 63 75 72  _INDEX - The cur
af70: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
af80: 6e 20 61 20 64 61 74 61 62 61 73 65 20 69 6e 64  n a database ind
af90: 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  ex..**   IN_INDE
afa0: 58 5f 45 50 48 20 2d 20 20 20 54 68 65 20 63 75  X_EPH -   The cu
afb0: 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
afc0: 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63  on a specially c
afd0: 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20  reated and.**   
afe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aff0: 20 70 6f 70 75 6c 61 74 65 64 20 65 70 68 65 72   populated epher
b000: 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  emal table..**.*
b010: 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 62 2d  * An existing b-
b020: 74 72 65 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65  tree may only be
b030: 20 75 73 65 64 20 69 66 20 74 68 65 20 53 45 4c   used if the SEL
b040: 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 73 69  ECT is of the si
b050: 6d 70 6c 65 0a 2a 2a 20 66 6f 72 6d 3a 0a 2a 2a  mple.** form:.**
b060: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c  .**     SELECT <
b070: 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61  column> FROM <ta
b080: 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble>.**.** If th
b090: 65 20 70 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72  e prNotFound par
b0a0: 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 65  ameter is 0, the
b0b0: 6e 20 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c  n the b-tree wil
b0c0: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65  l be used to ite
b0d0: 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20  rate.** through 
b0e0: 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 2c  the set members,
b0f0: 20 73 6b 69 70 70 69 6e 67 20 61 6e 79 20 64 75   skipping any du
b100: 70 6c 69 63 61 74 65 73 2e 20 49 6e 20 74 68 69  plicates. In thi
b110: 73 20 63 61 73 65 20 61 6e 0a 2a 2a 20 65 70 68  s case an.** eph
b120: 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73  eremal table mus
b130: 74 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73  t be used unless
b140: 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 3c 63   the selected <c
b150: 6f 6c 75 6d 6e 3e 20 69 73 20 67 75 61 72 61 6e  olumn> is guaran
b160: 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e  teed.** to be un
b170: 69 71 75 65 20 2d 20 65 69 74 68 65 72 20 62 65  ique - either be
b180: 63 61 75 73 65 20 69 74 20 69 73 20 61 6e 20 49  cause it is an I
b190: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
b1a0: 45 59 20 6f 72 20 69 74 0a 2a 2a 20 68 61 73 20  EY or it.** has 
b1b0: 61 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  a UNIQUE constra
b1c0: 69 6e 74 20 6f 72 20 55 4e 49 51 55 45 20 69 6e  int or UNIQUE in
b1d0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  dex..**.** If th
b1e0: 65 20 70 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72  e prNotFound par
b1f0: 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
b200: 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65   then the b-tree
b210: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a   will be used .*
b220: 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d  * for fast set m
b230: 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2e  embership tests.
b240: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   In this case an
b250: 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
b260: 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65   must .** be use
b270: 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e  d unless <column
b280: 3e 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20  > is an INTEGER 
b290: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 61  PRIMARY KEY or a
b2a0: 6e 20 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a 20  n index can .** 
b2b0: 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 3c 63  be found with <c
b2c0: 6f 6c 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c 65  olumn> as its le
b2d0: 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a  ft-most column..
b2e0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62  **.** When the b
b2f0: 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67 20 75  -tree is being u
b300: 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68  sed for membersh
b310: 69 70 20 74 65 73 74 73 2c 20 74 68 65 20 63 61  ip tests, the ca
b320: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
b330: 2a 20 6e 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20  * needs to know 
b340: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
b350: 68 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  he structure con
b360: 74 61 69 6e 73 20 61 6e 20 53 51 4c 20 4e 55 4c  tains an SQL NUL
b370: 4c 20 0a 2a 2a 20 76 61 6c 75 65 20 69 6e 20 6f  L .** value in o
b380: 72 64 65 72 20 74 6f 20 63 6f 72 72 65 63 74 6c  rder to correctl
b390: 79 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65  y evaluate expre
b3a0: 73 73 69 6f 6e 73 20 6c 69 6b 65 20 22 58 20 49  ssions like "X I
b3b0: 4e 20 28 59 2c 20 5a 29 22 2e 0a 2a 2a 20 49 66  N (Y, Z)"..** If
b3c0: 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 63 68   there is any ch
b3d0: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e  ance that the (.
b3e0: 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  ..) might contai
b3f0: 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61  n a NULL value a
b400: 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68  t.** runtime, th
b410: 65 6e 20 61 20 72 65 67 69 73 74 65 72 20 69 73  en a register is
b420: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
b430: 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
b440: 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f  er written.** to
b450: 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2e 20 49 66   *prNotFound. If
b460: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61   there is no cha
b470: 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e  nce that the (..
b480: 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a  .) contains a.**
b490: 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65   NULL value, the
b4a0: 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 69 73  n *prNotFound is
b4b0: 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
b4c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69  .**.** If a regi
b4d0: 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  ster is allocate
b4e0: 64 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69  d and its locati
b4f0: 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72  on stored in *pr
b500: 4e 6f 74 46 6f 75 6e 64 2c 20 74 68 65 6e 0a 2a  NotFound, then.*
b510: 2a 20 69 74 73 20 69 6e 69 74 69 61 6c 20 76 61  * its initial va
b520: 6c 75 65 20 69 73 20 4e 55 4c 4c 2e 20 20 49 66  lue is NULL.  If
b530: 20 74 68 65 20 28 2e 2e 2e 29 20 64 6f 65 73 20   the (...) does 
b540: 6e 6f 74 20 72 65 6d 61 69 6e 20 63 6f 6e 73 74  not remain const
b550: 61 6e 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64  ant.** for the d
b560: 75 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 71  uration of the q
b570: 75 65 72 79 20 28 69 2e 65 2e 20 74 68 65 20 53  uery (i.e. the S
b580: 45 4c 45 43 54 20 77 69 74 68 69 6e 20 74 68 65  ELECT within the
b590: 20 28 2e 2e 2e 29 0a 2a 2a 20 69 73 20 61 20 63   (...).** is a c
b5a0: 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65  orrelated subque
b5b0: 72 79 29 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ry) then the val
b5c0: 75 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  ue of the alloca
b5d0: 74 65 64 20 72 65 67 69 73 74 65 72 20 69 73 0a  ted register is.
b5e0: 2a 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c  ** reset to NULL
b5f0: 20 65 61 63 68 20 74 69 6d 65 20 74 68 65 20 73   each time the s
b600: 75 62 71 75 65 72 79 20 69 73 20 72 65 72 75 6e  ubquery is rerun
b610: 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68  . This allows th
b620: 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 75  e.** caller to u
b630: 73 65 20 76 64 62 65 20 63 6f 64 65 20 65 71 75  se vdbe code equ
b640: 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 66  ivalent to the f
b650: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
b660: 20 20 69 66 28 20 72 65 67 69 73 74 65 72 3d 3d    if( register==
b670: 4e 55 4c 4c 20 29 7b 0a 2a 2a 20 20 20 20 20 68  NULL ){.**     h
b680: 61 73 5f 6e 75 6c 6c 20 3d 20 3c 74 65 73 74 20  as_null = <test 
b690: 69 66 20 64 61 74 61 20 73 74 72 75 63 74 75 72  if data structur
b6a0: 65 20 63 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e  e contains null>
b6b0: 0a 2a 2a 20 20 20 20 20 72 65 67 69 73 74 65 72  .**     register
b6c0: 20 3d 20 31 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a   = 1.**   }.**.*
b6d0: 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76  * in order to av
b6e0: 6f 69 64 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  oid running the 
b6f0: 3c 74 65 73 74 20 69 66 20 64 61 74 61 20 73 74  <test if data st
b700: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
b710: 20 6e 75 6c 6c 3e 0a 2a 2a 20 74 65 73 74 20 6d   null>.** test m
b720: 6f 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 69  ore often than i
b730: 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a  s necessary..*/.
b740: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b750: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74  MIT_SUBQUERY.int
b760: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
b770: 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
b780: 65 2c 20 45 78 70 72 20 2a 70 58 2c 20 69 6e 74  e, Expr *pX, int
b790: 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 29 7b 0a 20   *prNotFound){. 
b7a0: 20 53 65 6c 65 63 74 20 2a 70 3b 20 20 20 20 20   Select *p;     
b7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7c0: 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
b7d0: 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66   to the right of
b7e0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
b7f0: 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b    int eType = 0;
b800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b810: 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
b820: 6f 66 20 52 48 53 20 74 61 62 6c 65 2e 20 49 4e  of RHS table. IN
b830: 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e  _INDEX_* */.  in
b840: 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d  t iTab = pParse-
b850: 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20 20 20  >nTab++;        
b860: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66      /* Cursor of
b870: 20 74 68 65 20 52 48 53 20 74 61 62 6c 65 20 2a   the RHS table *
b880: 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42 65 55 6e  /.  int mustBeUn
b890: 69 71 75 65 20 3d 20 28 70 72 4e 6f 74 46 6f 75  ique = (prNotFou
b8a0: 6e 64 3d 3d 30 29 3b 20 20 20 2f 2a 20 54 72 75  nd==0);   /* Tru
b8b0: 65 20 69 66 20 52 48 53 20 6d 75 73 74 20 62 65  e if RHS must be
b8c0: 20 75 6e 69 71 75 65 20 2a 2f 0a 0a 20 20 61 73   unique */..  as
b8d0: 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  sert( pX->op==TK
b8e0: 5f 49 4e 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  _IN );..  /* Che
b8f0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20  ck to see if an 
b900: 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f  existing table o
b910: 72 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75  r index can be u
b920: 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69  sed to.  ** sati
b930: 73 66 79 20 74 68 65 20 71 75 65 72 79 2e 20 20  sfy the query.  
b940: 54 68 69 73 20 69 73 20 70 72 65 66 65 72 61 62  This is preferab
b950: 6c 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67  le to generating
b960: 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68   a new .  ** eph
b970: 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a 20 20  emeral table..  
b980: 2a 2f 0a 20 20 70 20 3d 20 28 45 78 70 72 48 61  */.  p = (ExprHa
b990: 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50  sProperty(pX, EP
b9a0: 5f 78 49 73 53 65 6c 65 63 74 29 20 3f 20 70 58  _xIsSelect) ? pX
b9b0: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30 29  ->x.pSelect : 0)
b9c0: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
b9d0: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 29 20  Parse->nErr==0) 
b9e0: 26 26 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  && isCandidateFo
b9f0: 72 49 6e 4f 70 74 28 70 29 20 29 7b 0a 20 20 20  rInOpt(p) ){.   
ba00: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
ba10: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
ba20: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
ba30: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
ba40: 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  /.    Expr *pExp
ba50: 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  r = p->pEList->a
ba60: 5b 30 5d 2e 70 45 78 70 72 3b 20 20 20 2f 2a 20  [0].pExpr;   /* 
ba70: 45 78 70 72 65 73 73 69 6f 6e 20 3c 63 6f 6c 75  Expression <colu
ba80: 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  mn> */.    int i
ba90: 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Col = pExpr->iCo
baa0: 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20  lumn;           
bab0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
bac0: 6c 75 6d 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f  lumn <column> */
bad0: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73  .    Vdbe *v = s
bae0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
baf0: 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 56  arse);      /* V
bb00: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62  irtual machine b
bb10: 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
bb20: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
bb30: 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  p->pSrc->a[0].pT
bb40: 61 62 3b 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  ab;      /* Tabl
bb50: 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20  e <table>. */.  
bb60: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb80: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
bb90: 62 61 73 65 20 69 64 78 20 66 6f 72 20 70 54 61  base idx for pTa
bba0: 62 20 2a 2f 0a 20 20 20 0a 20 20 20 20 2f 2a 20  b */.   .    /* 
bbb0: 43 6f 64 65 20 61 6e 20 4f 50 5f 56 65 72 69 66  Code an OP_Verif
bbc0: 79 43 6f 6f 6b 69 65 20 61 6e 64 20 4f 50 5f 54  yCookie and OP_T
bbd0: 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61  ableLock for <ta
bbe0: 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62  ble>. */.    iDb
bbf0: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
bc00: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
bc10: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
bc20: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
bc30: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
bc40: 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
bc50: 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
bc60: 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
bc70: 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
bc80: 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  me);..    /* Thi
bc90: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
bca0: 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74  ly called from t
bcb0: 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e 20 62 6f  wo places. In bo
bcc0: 74 68 20 63 61 73 65 73 20 74 68 65 20 76 64 62  th cases the vdb
bcd0: 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72  e.    ** has alr
bce0: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
bcf0: 74 65 64 2e 20 53 6f 20 61 73 73 75 6d 65 20 73  ted. So assume s
bd00: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 29 20  qlite3GetVdbe() 
bd10: 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a  is always.    **
bd20: 20 73 75 63 63 65 73 73 66 75 6c 20 68 65 72 65   successful here
bd30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
bd40: 65 72 74 28 76 29 3b 0a 20 20 20 20 69 66 28 20  ert(v);.    if( 
bd50: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
bd60: 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  int iMem = ++pPa
bd70: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
bd80: 20 69 6e 74 20 69 41 64 64 72 3b 0a 0a 20 20 20   int iAddr;..   
bd90: 20 20 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74     iAddr = sqlit
bda0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
bdb0: 4f 50 5f 49 66 2c 20 69 4d 65 6d 29 3b 0a 20 20  OP_If, iMem);.  
bdc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bdd0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
bde0: 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b 0a 0a  ger, 1, iMem);..
bdf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
be00: 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  nTable(pParse, i
be10: 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  Tab, iDb, pTab, 
be20: 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
be30: 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
be40: 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20  NDEX_ROWID;..   
be50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
be60: 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29  mpHere(v, iAddr)
be70: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
be80: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
be90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bea0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
beb0: 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
bec0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  .      /* The co
bed0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
bee0: 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d   used by the com
bef0: 70 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69  parison. If an i
bf00: 6e 64 65 78 20 69 73 20 74 6f 0a 20 20 20 20 20  ndex is to.     
bf10: 20 2a 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70   ** be used in p
bf20: 6c 61 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74  lace of a temp-t
bf30: 61 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65  able, it must be
bf40: 20 6f 72 64 65 72 65 64 20 61 63 63 6f 72 64 69   ordered accordi
bf50: 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  ng.      ** to t
bf60: 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  his collation se
bf70: 71 75 65 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20  quence.  */.    
bf80: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20    CollSeq *pReq 
bf90: 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
bfa0: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
bfb0: 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c  arse, pX->pLeft,
bfc0: 20 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20   pExpr);..      
bfd0: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
bfe0: 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  e affinity that 
bff0: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
c000: 70 65 72 66 6f 72 6d 20 74 68 65 20 0a 20 20 20  perform the .   
c010: 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e     ** comparison
c020: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
c030: 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
c040: 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20  the column. If. 
c050: 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6e 6f       ** it is no
c060: 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  t, it is not pos
c070: 73 69 62 6c 65 20 74 6f 20 75 73 65 20 61 6e 79  sible to use any
c080: 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a 2f   index..      */
c090: 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66 20  .      char aff 
c0a0: 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69  = comparisonAffi
c0b0: 6e 69 74 79 28 70 58 29 3b 0a 20 20 20 20 20 20  nity(pX);.      
c0c0: 69 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20  int affinity_ok 
c0d0: 3d 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  = (pTab->aCol[iC
c0e0: 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 61 66  ol].affinity==af
c0f0: 66 7c 7c 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  f||aff==SQLITE_A
c100: 46 46 5f 4e 4f 4e 45 29 3b 0a 0a 20 20 20 20 20  FF_NONE);..     
c110: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
c120: 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20  pIndex; pIdx && 
c130: 65 54 79 70 65 3d 3d 30 20 26 26 20 61 66 66 69  eType==0 && affi
c140: 6e 69 74 79 5f 6f 6b 3b 20 70 49 64 78 3d 70 49  nity_ok; pIdx=pI
c150: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
c160: 20 20 20 20 69 66 28 20 28 70 49 64 78 2d 3e 61      if( (pIdx->a
c170: 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c  iColumn[0]==iCol
c180: 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71  ).         && sq
c190: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
c1a0: 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 70 49  (db, ENC(db), pI
c1b0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 30  dx->azColl[0], 0
c1c0: 29 3d 3d 70 52 65 71 0a 20 20 20 20 20 20 20 20  )==pReq.        
c1d0: 20 26 26 20 28 21 6d 75 73 74 42 65 55 6e 69 71   && (!mustBeUniq
c1e0: 75 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e 43 6f  ue || (pIdx->nCo
c1f0: 6c 75 6d 6e 3d 3d 31 20 26 26 20 70 49 64 78 2d  lumn==1 && pIdx-
c200: 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
c210: 65 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  e)).        ){. 
c220: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 4d 65           int iMe
c230: 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
c240: 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  em;.          in
c250: 74 20 69 41 64 64 72 3b 0a 20 20 20 20 20 20 20  t iAddr;.       
c260: 20 20 20 63 68 61 72 20 2a 70 4b 65 79 3b 0a 20     char *pKey;. 
c270: 20 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79   .          pKey
c280: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
c290: 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70  e3IndexKeyinfo(p
c2a0: 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20  Parse, pIdx);.  
c2b0: 20 20 20 20 20 20 20 20 69 41 64 64 72 20 3d 20          iAddr = 
c2c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c2d0: 31 28 76 2c 20 4f 50 5f 49 66 2c 20 69 4d 65 6d  1(v, OP_If, iMem
c2e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
c2f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
c300: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
c310: 20 69 4d 65 6d 29 3b 0a 20 20 0a 20 20 20 20 20   iMem);.  .     
c320: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c330: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
c340: 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64  nRead, iTab, pId
c350: 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20  x->tnum, iDb,.  
c360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c370: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 65               pKe
c380: 79 2c 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  y,P4_KEYINFO_HAN
c390: 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 20 20 20  DOFF);.         
c3a0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
c3b0: 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61   "%s", pIdx->zNa
c3c0: 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  me));.          
c3d0: 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
c3e0: 5f 49 4e 44 45 58 3b 0a 0a 20 20 20 20 20 20 20  _INDEX;..       
c3f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
c400: 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29  mpHere(v, iAddr)
c410: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
c420: 70 72 4e 6f 74 46 6f 75 6e 64 20 26 26 20 21 70  prNotFound && !p
c430: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
c440: 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  notNull ){.     
c450: 20 20 20 20 20 20 20 2a 70 72 4e 6f 74 46 6f 75         *prNotFou
c460: 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  nd = ++pParse->n
c470: 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Mem;.          }
c480: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c490: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
c4a0: 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a  if( eType==0 ){.
c4b0: 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74      /* Could not
c4c0: 20 66 6f 75 6e 64 20 61 6e 20 65 78 69 73 74 69   found an existi
c4d0: 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ng table or inde
c4e0: 78 20 74 6f 20 75 73 65 20 61 73 20 74 68 65 20  x to use as the 
c4f0: 52 48 53 20 62 2d 74 72 65 65 2e 0a 20 20 20 20  RHS b-tree..    
c500: 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61 76 65 20  ** We will have 
c510: 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65  to generate an e
c520: 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74  phemeral table t
c530: 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20  o do the job..  
c540: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 4d 61    */.    int rMa
c550: 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20  yHaveNull = 0;. 
c560: 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
c570: 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69 66 28  DEX_EPH;.    if(
c580: 20 70 72 4e 6f 74 46 6f 75 6e 64 20 29 7b 0a 20   prNotFound ){. 
c590: 20 20 20 20 20 2a 70 72 4e 6f 74 46 6f 75 6e 64       *prNotFound
c5a0: 20 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20   = rMayHaveNull 
c5b0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
c5c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
c5d0: 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  pX->pLeft->iColu
c5e0: 6d 6e 3c 30 20 26 26 20 21 45 78 70 72 48 61 73  mn<0 && !ExprHas
c5f0: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 58 2c 20  AnyProperty(pX, 
c600: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
c610: 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49  .      eType = I
c620: 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20  N_INDEX_ROWID;. 
c630: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
c640: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
c650: 61 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61  arse, pX, rMayHa
c660: 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49  veNull, eType==I
c670: 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a  N_INDEX_ROWID);.
c680: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d    }else{.    pX-
c690: 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a  >iTable = iTab;.
c6a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79    }.  return eTy
c6b0: 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  pe;.}.#endif../*
c6c0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
c6d0: 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62  e for scalar sub
c6e0: 71 75 65 72 69 65 73 20 75 73 65 64 20 61 73 20  queries used as 
c6f0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  an expression.**
c700: 20 61 6e 64 20 49 4e 20 6f 70 65 72 61 74 6f 72   and IN operator
c710: 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a  s.  Examples:.**
c720: 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20  .**     (SELECT 
c730: 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20  a FROM b)       
c740: 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a     -- subquery.*
c750: 2a 20 20 20 20 20 45 58 49 53 54 53 20 28 53 45  *     EXISTS (SE
c760: 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
c770: 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71 75   -- EXISTS subqu
c780: 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20  ery.**     x IN 
c790: 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20  (4,5,11)        
c7a0: 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72        -- IN oper
c7b0: 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f  ator with list o
c7c0: 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  n right-hand sid
c7d0: 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53  e.**     x IN (S
c7e0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
c7f0: 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74      -- IN operat
c800: 6f 72 20 77 69 74 68 20 73 75 62 71 75 65 72 79  or with subquery
c810: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a   on the right.**
c820: 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70 61  .** The pExpr pa
c830: 72 61 6d 65 74 65 72 20 64 65 73 63 72 69 62 65  rameter describe
c840: 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
c850: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
c860: 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f  he IN.** operato
c870: 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a  r or subquery..*
c880: 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
c890: 72 20 69 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e  r isRowid is non
c8a0: 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78 70 72  -zero, then expr
c8b0: 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20  ession pExpr is 
c8c0: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
c8d0: 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   be of the form 
c8e0: 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20  "<rowid> IN (?, 
c8f0: 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65 20 3c 72  ?, ?)", where <r
c900: 6f 77 69 64 3e 20 69 73 20 61 20 72 65 66 65 72  owid> is a refer
c910: 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20  ence.** to some 
c920: 69 6e 74 65 67 65 72 20 6b 65 79 20 63 6f 6c 75  integer key colu
c930: 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 20 42 2d  mn of a table B-
c940: 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61  Tree. In this ca
c950: 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e  se, use an.** in
c960: 74 6b 65 79 20 42 2d 54 72 65 65 20 74 6f 20 73  tkey B-Tree to s
c970: 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20  tore the set of 
c980: 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69  IN(...) values i
c990: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73  nstead of the us
c9a0: 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20  ual.** (slower) 
c9b0: 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
c9c0: 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a  keys B-Tree..**.
c9d0: 2a 2a 20 49 66 20 72 4d 61 79 48 61 76 65 4e 75  ** If rMayHaveNu
c9e0: 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ll is non-zero, 
c9f0: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
ca00: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  the operation is
ca10: 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61   an IN.** (not a
ca20: 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54   SELECT or EXIST
ca30: 53 29 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  S) and that the 
ca40: 52 48 53 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  RHS might contai
ca50: 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 46 75 72  ns NULLs..** Fur
ca60: 74 68 65 72 6d 6f 72 65 2c 20 74 68 65 20 49 4e  thermore, the IN
ca70: 20 69 73 20 69 6e 20 61 20 57 48 45 52 45 20 63   is in a WHERE c
ca80: 6c 61 75 73 65 20 61 6e 64 20 74 68 61 74 20 77  lause and that w
ca90: 65 20 72 65 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a  e really want.**
caa0: 20 74 6f 20 69 74 65 72 61 74 65 20 6f 76 65 72   to iterate over
cab0: 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
cac0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 6f  IN operator in o
cad0: 72 64 65 72 20 74 6f 20 71 75 69 63 6b 6c 79 20  rder to quickly 
cae0: 6c 6f 63 61 74 65 0a 2a 2a 20 61 6c 6c 20 63 6f  locate.** all co
caf0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 4c 48 53 20  rresponding LHS 
cb00: 65 6c 65 6d 65 6e 74 73 2e 20 20 41 6c 6c 20 74  elements.  All t
cb10: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
cb20: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 0a 2a   is initialize.*
cb30: 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20 67  * the register g
cb40: 69 76 65 6e 20 62 79 20 72 4d 61 79 48 61 76 65  iven by rMayHave
cb50: 4e 75 6c 6c 20 74 6f 20 4e 55 4c 4c 2e 20 20 43  Null to NULL.  C
cb60: 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  alling routines 
cb70: 77 69 6c 6c 20 74 61 6b 65 0a 2a 2a 20 63 61 72  will take.** car
cb80: 65 20 6f 66 20 63 68 61 6e 67 69 6e 67 20 74 68  e of changing th
cb90: 69 73 20 72 65 67 69 73 74 65 72 20 76 61 6c 75  is register valu
cba0: 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66  e to non-NULL if
cbb0: 20 74 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c   the RHS is NULL
cbc0: 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  -free..**.** If 
cbd0: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20  rMayHaveNull is 
cbe0: 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73  zero, that means
cbf0: 20 74 68 61 74 20 74 68 65 20 73 75 62 71 75 65   that the subque
cc00: 72 79 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  ry is being used
cc10: 0a 2a 2a 20 66 6f 72 20 6d 65 6d 62 65 72 73 68  .** for membersh
cc20: 69 70 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 2e  ip testing only.
cc30: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65    There is no ne
cc40: 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ed to initialize
cc50: 20 61 6e 79 0a 2a 2a 20 72 65 67 69 73 74 65 72   any.** register
cc60: 73 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  s to indicate th
cc70: 65 20 70 72 65 73 65 6e 73 65 20 6f 72 20 61 62  e presense or ab
cc80: 73 65 6e 63 65 20 6f 66 20 4e 55 4c 4c 73 20 6f  sence of NULLs o
cc90: 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a 0a 2a 2a  n the RHS..**.**
cca0: 20 46 6f 72 20 61 20 53 45 4c 45 43 54 20 6f 72   For a SELECT or
ccb0: 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72   EXISTS operator
ccc0: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 67  , return the reg
ccd0: 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73  ister that holds
cce0: 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20   the.** result. 
ccf0: 20 46 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72   For IN operator
cd00: 73 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72  s or if an error
cd10: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 72 65 74   occurs, the ret
cd20: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 30 2e 0a  urn value is 0..
cd30: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
cd40: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
cd50: 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65 53  int sqlite3CodeS
cd60: 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61 72 73  ubselect(.  Pars
cd70: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
cd80: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
cd90: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
cda0: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
cdb0: 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20 53      /* The IN, S
cdc0: 45 4c 45 43 54 2c 20 6f 72 20 45 58 49 53 54 53  ELECT, or EXISTS
cdd0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   operator */.  i
cde0: 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c  nt rMayHaveNull,
cdf0: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
ce00: 65 72 20 74 68 61 74 20 72 65 63 6f 72 64 73 20  er that records 
ce10: 77 68 65 74 68 65 72 20 4e 55 4c 4c 73 20 65 78  whether NULLs ex
ce20: 69 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20 20  ist in RHS */.  
ce30: 69 6e 74 20 69 73 52 6f 77 69 64 20 20 20 20 20  int isRowid     
ce40: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
ce50: 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f 70  ue, LHS of IN op
ce60: 65 72 61 74 6f 72 20 69 73 20 61 20 72 6f 77 69  erator is a rowi
ce70: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 74 65  d */.){.  int te
ce80: 73 74 41 64 64 72 20 3d 20 30 3b 20 20 20 20 20  stAddr = 0;     
ce90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cea0: 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65    /* One-time te
ceb0: 73 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  st address */.  
cec0: 69 6e 74 20 72 52 65 67 20 3d 20 30 3b 20 20 20  int rReg = 0;   
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cee0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
cef0: 74 65 72 20 73 74 6f 72 69 6e 67 20 72 65 73 75  ter storing resu
cf00: 6c 74 69 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20  lting */.  Vdbe 
cf10: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
cf20: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
cf30: 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
cf40: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c   return 0;.  sql
cf50: 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
cf60: 68 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a  h(pParse);..  /*
cf70: 20 54 68 69 73 20 63 6f 64 65 20 6d 75 73 74 20   This code must 
cf80: 62 65 20 72 75 6e 20 69 6e 20 69 74 73 20 65 6e  be run in its en
cf90: 74 69 72 65 74 79 20 65 76 65 72 79 20 74 69 6d  tirety every tim
cfa0: 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65  e it is encounte
cfb0: 72 65 64 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20  red.  ** if any 
cfc0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
cfd0: 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20   is true:.  **. 
cfe0: 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
cff0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
d000: 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
d010: 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a  bquery.  **    *
d020: 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
d030: 20 73 69 64 65 20 69 73 20 61 6e 20 65 78 70 72   side is an expr
d040: 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74  ession list cont
d050: 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73  aining variables
d060: 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61  .  **    *  We a
d070: 72 65 20 69 6e 73 69 64 65 20 61 20 74 72 69 67  re inside a trig
d080: 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ger.  **.  ** If
d090: 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76   all of the abov
d0a0: 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65  e are false, the
d0b0: 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68 69  n we can run thi
d0c0: 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65  s code just once
d0d0: 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20 72  .  ** save the r
d0e0: 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75 73  esults, and reus
d0f0: 65 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  e the same resul
d100: 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20  t on subsequent 
d110: 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a  invocations..  *
d120: 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  /.  if( !ExprHas
d130: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
d140: 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29  r, EP_VarSelect)
d150: 20 26 26 20 21 70 50 61 72 73 65 2d 3e 70 54 72   && !pParse->pTr
d160: 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20  iggerTab ){.    
d170: 69 6e 74 20 6d 65 6d 20 3d 20 2b 2b 70 50 61 72  int mem = ++pPar
d180: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
d190: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
d1a0: 76 2c 20 4f 50 5f 49 66 2c 20 6d 65 6d 29 3b 0a  v, OP_If, mem);.
d1b0: 20 20 20 20 74 65 73 74 41 64 64 72 20 3d 20 73      testAddr = s
d1c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d1d0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
d1e0: 31 2c 20 6d 65 6d 29 3b 0a 20 20 20 20 61 73 73  1, mem);.    ass
d1f0: 65 72 74 28 20 74 65 73 74 41 64 64 72 3e 30 20  ert( testAddr>0 
d200: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
d210: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
d220: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45   }..  switch( pE
d230: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
d240: 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
d250: 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79     char affinity
d260: 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
d270: 6b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69  keyInfo;.      i
d280: 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20  nt addr;        
d290: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
d2a0: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
d2b0: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
d2c0: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
d2d0: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
d2e0: 0a 20 20 20 20 20 20 69 66 28 20 72 4d 61 79 48  .      if( rMayH
d2f0: 61 76 65 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  aveNull ){.     
d300: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d310: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
d320: 20 30 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c   0, rMayHaveNull
d330: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
d340: 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c    affinity = sql
d350: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
d360: 28 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20  (pLeft);..      
d370: 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69 73 20  /* Whether this 
d380: 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45  is an 'x IN(SELE
d390: 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78  CT...)' or an 'x
d3a0: 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27   IN(<exprlist>)'
d3b0: 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73  .      ** expres
d3c0: 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c  sion it is handl
d3d0: 65 64 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e  ed the same way.
d3e0: 20 20 41 6e 20 65 70 68 65 6d 65 72 61 6c 20 74    An ephemeral t
d3f0: 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a  able is .      *
d400: 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 73 69  * filled with si
d410: 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65 78  ngle-field index
d420: 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74 69   keys representi
d430: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  ng the results. 
d440: 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65       ** from the
d450: 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c   SELECT or the <
d460: 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20  exprlist>..     
d470: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
d480: 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73 69  the 'x' expressi
d490: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76  on is a column v
d4a0: 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c  alue, or the SEL
d4b0: 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  ECT....      ** 
d4c0: 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e  statement return
d4d0: 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  s a column value
d4e0: 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e  , then the affin
d4f0: 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20  ity of that.    
d500: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75    ** column is u
d510: 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65  sed to build the
d520: 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20   index keys. If 
d530: 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68 65  both 'x' and the
d540: 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  .      ** SELECT
d550: 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ... statement ar
d560: 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  e columns, then 
d570: 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
d580: 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a   is used.      *
d590: 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75  * if either colu
d5a0: 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f  mn has NUMERIC o
d5b0: 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69  r INTEGER affini
d5c0: 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20  ty. If neither. 
d5d0: 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20       ** 'x' nor 
d5e0: 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74  the SELECT... st
d5f0: 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75  atement are colu
d600: 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69  mns, then numeri
d610: 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20  c affinity.     
d620: 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20   ** is used..   
d630: 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70     */.      pExp
d640: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72  r->iTable = pPar
d650: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
d660: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
d670: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d680: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
d690: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 21  pExpr->iTable, !
d6a0: 69 73 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  isRowid);.      
d6b0: 6d 65 6d 73 65 74 28 26 6b 65 79 49 6e 66 6f 2c  memset(&keyInfo,
d6c0: 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 49 6e   0, sizeof(keyIn
d6d0: 66 6f 29 29 3b 0a 20 20 20 20 20 20 6b 65 79 49  fo));.      keyI
d6e0: 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 31 3b 0a  nfo.nField = 1;.
d6f0: 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
d700: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
d710: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
d720: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
d730: 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49  se 1:     expr I
d740: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20  N (SELECT ...). 
d750: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
d760: 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    ** Generate co
d770: 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  de to write the 
d780: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
d790: 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74  elect into the t
d7a0: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20  emporary.       
d7b0: 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61   ** table alloca
d7c0: 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61  ted and opened a
d7d0: 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bove..        */
d7e0: 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44  .        SelectD
d7f0: 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20  est dest;.      
d800: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
d810: 73 74 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73  st;..        ass
d820: 65 72 74 28 20 21 69 73 52 6f 77 69 64 20 29 3b  ert( !isRowid );
d830: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d840: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
d850: 64 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70  dest, SRT_Set, p
d860: 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
d870: 20 20 20 20 20 20 20 64 65 73 74 2e 61 66 66 69         dest.affi
d880: 6e 69 74 79 20 3d 20 28 75 38 29 61 66 66 69 6e  nity = (u8)affin
d890: 69 74 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ity;.        ass
d8a0: 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69 54 61  ert( (pExpr->iTa
d8b0: 62 6c 65 26 30 78 30 30 30 30 46 46 46 46 29 3d  ble&0x0000FFFF)=
d8c0: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29  =pExpr->iTable )
d8d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
d8e0: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
d8f0: 73 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  se, pExpr->x.pSe
d900: 6c 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a  lect, &dest) ){.
d910: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
d920: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
d930: 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
d940: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  Expr->x.pSelect-
d950: 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  >pEList;.       
d960: 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 4c 69   if( ALWAYS(pELi
d970: 73 74 21 3d 30 20 26 26 20 70 45 4c 69 73 74 2d  st!=0 && pEList-
d980: 3e 6e 45 78 70 72 3e 30 29 20 29 7b 20 0a 20 20  >nExpr>0) ){ .  
d990: 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e          keyInfo.
d9a0: 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74  aColl[0] = sqlit
d9b0: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
d9c0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
d9d0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20  Expr->pLeft,.   
d9e0: 20 20 20 20 20 20 20 20 20 20 20 70 45 4c 69 73             pELis
d9f0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
da00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
da10: 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
da20: 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21  (pExpr->x.pList!
da30: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  =0) ){.        /
da40: 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78  * Case 2:     ex
da50: 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29  pr IN (exprlist)
da60: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
da70: 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20      ** For each 
da80: 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c  expression, buil
da90: 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66  d an index key f
daa0: 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69  rom the evaluati
dab0: 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  on and.        *
dac0: 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68  * store it in th
dad0: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
dae0: 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  e. If <expr> is 
daf0: 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75  a column, then u
db00: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  se.        ** th
db10: 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e  at columns affin
db20: 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e  ity when buildin
db30: 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  g index keys. If
db40: 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20   <expr> is not. 
db50: 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75         ** a colu
db60: 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20  mn, use numeric 
db70: 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20  affinity..      
db80: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
db90: 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72   i;.        Expr
dba0: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
dbb0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
dbc0: 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
dbd0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
dbe0: 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  m;.        int r
dbf0: 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20  1, r2, r3;..    
dc00: 20 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74      if( !affinit
dc10: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  y ){.          a
dc20: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
dc30: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
dc40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6b 65 79     }.        key
dc50: 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20  Info.aColl[0] = 
dc60: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
dc70: 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
dc80: 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20  ->pLeft);..     
dc90: 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
dca0: 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
dcb0: 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e  on in <exprlist>
dcc0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 31 20  . */.        r1 
dcd0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
dce0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
dcf0: 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
dd00: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
dd10: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
dd20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
dd30: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32  , OP_Null, 0, r2
dd40: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
dd50: 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  =pList->nExpr, p
dd60: 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
dd70: 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
dd80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
dd90: 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e  r *pE2 = pItem->
dda0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
ddb0: 20 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a   int iValToIns;.
ddc0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
ddd0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
dde0: 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20  is not constant 
ddf0: 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65  then we will nee
de00: 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a  d to.          *
de10: 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65  * disable the te
de20: 73 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65  st that was gene
de30: 72 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74  rated above that
de40: 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20   makes sure.    
de50: 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f        ** this co
de60: 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73  de only executes
de70: 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20   once.  Because 
de80: 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61  for a non-consta
de90: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nt.          ** 
dea0: 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65  expression we ne
deb0: 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73  ed to rerun this
dec0: 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e   code each time.
ded0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
dee0: 20 20 20 20 20 20 20 20 69 66 28 20 74 65 73 74          if( test
def0: 41 64 64 72 20 26 26 20 21 73 71 6c 69 74 65 33  Addr && !sqlite3
df00: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
df10: 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  E2) ){.         
df20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
df30: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65  angeToNoop(v, te
df40: 73 74 41 64 64 72 2d 31 2c 20 32 29 3b 0a 20 20  stAddr-1, 2);.  
df50: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 41 64            testAd
df60: 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  dr = 0;.        
df70: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
df80: 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
df90: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e  xpression and in
dfa0: 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65  sert it into the
dfb0: 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
dfc0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52           if( isR
dfd0: 6f 77 69 64 20 26 26 20 73 71 6c 69 74 65 33 45  owid && sqlite3E
dfe0: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 32  xprIsInteger(pE2
dff0: 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29 20 29 7b  , &iValToIns) ){
e000: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
e010: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
e020: 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20  , OP_InsertInt, 
e030: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72  pExpr->iTable, r
e040: 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20  2, iValToIns);. 
e050: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
e060: 20 20 20 20 20 20 20 20 20 20 20 20 72 33 20 3d              r3 =
e070: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
e080: 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
e090: 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  E2, r1);.       
e0a0: 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64       if( isRowid
e0b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
e0c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e0d0: 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op2(v, OP_MustBe
e0e0: 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20 20 20 20  Int, r3,.       
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e100: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e110: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
e120: 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20  v)+2);.         
e130: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e140: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
e150: 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ert, pExpr->iTab
e160: 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20 20  le, r2, r3);.   
e170: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
e180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
e190: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
e1a0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
e1b0: 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20 26 61 66  , r3, 1, r2, &af
e1c0: 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20  finity, 1);.    
e1d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e1e0: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
e1f0: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
e200: 20 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20   r3, 1);.       
e210: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e220: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
e230: 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d  dxInsert, pExpr-
e240: 3e 69 54 61 62 6c 65 2c 20 72 32 29 3b 0a 20 20  >iTable, r2);.  
e250: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e260: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e270: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
e280: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
e290: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
e2a0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
e2b0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
e2c0: 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a  e, r2);.      }.
e2d0: 20 20 20 20 20 20 69 66 28 20 21 69 73 52 6f 77        if( !isRow
e2e0: 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  id ){.        sq
e2f0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
e300: 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64  4(v, addr, (void
e310: 20 2a 29 26 6b 65 79 49 6e 66 6f 2c 20 50 34 5f   *)&keyInfo, P4_
e320: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
e330: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
e340: 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
e350: 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61  K_EXISTS:.    ca
e360: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20  se TK_SELECT:.  
e370: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
e380: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 68 61     /* If this ha
e390: 73 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72  s to be a scalar
e3a0: 20 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61   SELECT.  Genera
e3b0: 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74  te code to put t
e3c0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75  he.      ** valu
e3d0: 65 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74  e of this select
e3e0: 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c   in a memory cel
e3f0: 6c 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65  l and record the
e400: 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a   number.      **
e410: 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63   of the memory c
e420: 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 20  ell in iColumn. 
e430: 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45   If this is an E
e440: 58 49 53 54 53 2c 20 77 72 69 74 65 0a 20 20 20  XISTS, write.   
e450: 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72     ** an integer
e460: 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29 20   0 (not exists) 
e470: 6f 72 20 31 20 28 65 78 69 73 74 73 29 20 69 6e  or 1 (exists) in
e480: 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  to a memory cell
e490: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
e4a0: 63 6f 72 64 20 74 68 61 74 20 6d 65 6d 6f 72 79  cord that memory
e4b0: 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e   cell in iColumn
e4c0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
e4d0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20   Select *pSel;  
e4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4f0: 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
e500: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e   statement to en
e510: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 53 65  code */.      Se
e520: 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20  lectDest dest;  
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e540: 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65      /* How to de
e550: 61 6c 20 77 69 74 68 20 53 45 4c 45 43 74 20 72  al with SELECt r
e560: 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 20 20  esult */..      
e570: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
e580: 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29  >op==TK_EXISTS )
e590: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
e5a0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
e5b0: 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20  SELECT );.      
e5c0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
e5d0: 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20  p==TK_EXISTS || 
e5e0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
e5f0: 4c 45 43 54 20 29 3b 0a 0a 20 20 20 20 20 20 61  LECT );..      a
e600: 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72  ssert( ExprHasPr
e610: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
e620: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
e630: 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45 78 70       pSel = pExp
e640: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->x.pSelect;.  
e650: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
e660: 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
e670: 20 30 2c 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d   0, ++pParse->nM
e680: 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  em);.      if( p
e690: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
e6a0: 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 64  ECT ){.        d
e6b0: 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
e6c0: 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Mem;.        sql
e6d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
e6e0: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65  , OP_Null, 0, de
e6f0: 73 74 2e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  st.iParm);.     
e700: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
e710: 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75 65 72  v, "Init subquer
e720: 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20  y result"));.   
e730: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e740: 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
e750: 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20  RT_Exists;.     
e760: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e770: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
e780: 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 50 61 72  er, 0, dest.iPar
e790: 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  m);.        Vdbe
e7a0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69  Comment((v, "Ini
e7b0: 74 20 45 58 49 53 54 53 20 72 65 73 75 6c 74 22  t EXISTS result"
e7c0: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
e7d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
e7e0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
e7f0: 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  pSel->pLimit);. 
e800: 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69       pSel->pLimi
e810: 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  t = sqlite3PExpr
e820: 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45  (pParse, TK_INTE
e830: 47 45 52 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  GER, 0, 0,.     
e840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e850: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 71               &sq
e860: 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31  lite3IntTokens[1
e870: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  ]);.      if( sq
e880: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
e890: 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29  se, pSel, &dest)
e8a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
e8b0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
e8c0: 20 20 20 20 72 52 65 67 20 3d 20 64 65 73 74 2e      rReg = dest.
e8d0: 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 45 78 70  iParm;.      Exp
e8e0: 72 53 65 74 49 72 72 65 64 75 63 69 62 6c 65 28  rSetIrreducible(
e8f0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 62 72  pExpr);.      br
e900: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
e910: 20 20 69 66 28 20 74 65 73 74 41 64 64 72 20 29    if( testAddr )
e920: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
e930: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 74 65 73  eJumpHere(v, tes
e940: 74 41 64 64 72 2d 31 29 3b 0a 20 20 7d 0a 20 20  tAddr-1);.  }.  
e950: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
e960: 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a  Pop(pParse, 1);.
e970: 0a 20 20 72 65 74 75 72 6e 20 72 52 65 67 3b 0a  .  return rReg;.
e980: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
e990: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
e9a0: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
e9b0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
e9c0: 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  Y./*.** Generate
e9d0: 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e 20   code for an IN 
e9e0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
e9f0: 2a 20 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c  *      x IN (SEL
ea00: 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20  ECT ...).**     
ea10: 20 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61   x IN (value, va
ea20: 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  lue, ...).**.** 
ea30: 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69  The left-hand si
ea40: 64 65 20 28 4c 48 53 29 20 69 73 20 61 20 73 63  de (LHS) is a sc
ea50: 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 2e  alar expression.
ea60: 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
ea70: 20 73 69 64 65 20 28 52 48 53 29 0a 2a 2a 20 69   side (RHS).** i
ea80: 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65  s an array of ze
ea90: 72 6f 20 6f 72 20 6d 6f 72 65 20 76 61 6c 75 65  ro or more value
eaa0: 73 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69  s.  The expressi
eab0: 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74 68  on is true if th
eac0: 65 20 4c 48 53 20 69 73 0a 2a 2a 20 63 6f 6e 74  e LHS is.** cont
ead0: 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65  ained within the
eae0: 20 52 48 53 2e 20 20 54 68 65 20 76 61 6c 75 65   RHS.  The value
eaf0: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
eb00: 6f 6e 20 69 73 20 75 6e 6b 6e 6f 77 6e 20 28 4e  on is unknown (N
eb10: 55 4c 4c 29 0a 2a 2a 20 69 66 20 74 68 65 20 4c  ULL).** if the L
eb20: 48 53 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66  HS is NULL or if
eb30: 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20   the LHS is not 
eb40: 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
eb50: 20 74 68 65 20 52 48 53 20 61 6e 64 20 74 68 65   the RHS and the
eb60: 0a 2a 2a 20 52 48 53 20 63 6f 6e 74 61 69 6e 73  .** RHS contains
eb70: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c   one or more NUL
eb80: 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20  L values..**.** 
eb90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
eba0: 65 72 61 74 65 73 20 63 6f 64 65 20 77 69 6c 6c  erates code will
ebb0: 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66 46   jump to destIfF
ebc0: 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53 20  alse if the LHS 
ebd0: 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61  is not .** conta
ebe0: 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ined within the 
ebf0: 52 48 53 2e 20 20 49 66 20 64 75 65 20 74 6f 20  RHS.  If due to 
ec00: 4e 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20  NULLs we cannot 
ec10: 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
ec20: 20 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61   LHS.** is conta
ec30: 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 20  ined in the RHS 
ec40: 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73  then jump to des
ec50: 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65  tIfNull.  If the
ec60: 20 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65   LHS is containe
ec70: 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  d.** within the 
ec80: 52 48 53 20 74 68 65 6e 20 66 61 6c 6c 20 74 68  RHS then fall th
ec90: 72 6f 75 67 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  rough..*/.static
eca0: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70   void sqlite3Exp
ecb0: 72 43 6f 64 65 49 4e 28 0a 20 20 50 61 72 73 65  rCodeIN(.  Parse
ecc0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
ecd0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
ece0: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
ecf0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
ed00: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
ed10: 20 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78 70     /* The IN exp
ed20: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
ed30: 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 20 20   destIfFalse,   
ed40: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
ed50: 69 66 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f  if LHS is not co
ed60: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52  ntained in the R
ed70: 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  HS */.  int dest
ed80: 49 66 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a  IfNull        /*
ed90: 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68   Jump here if th
eda0: 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e  e results are un
edb0: 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c  known due to NUL
edc0: 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  Ls */.){.  int r
edd0: 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20  RhsHasNull = 0; 
ede0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61   /* Register tha
edf0: 74 20 69 73 20 74 72 75 65 20 69 66 20 52 48 53  t is true if RHS
ee00: 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76   contains NULL v
ee10: 61 6c 75 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  alues */.  char 
ee20: 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20  affinity;       
ee30: 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 61   /* Comparison a
ee40: 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20 2a  ffinity to use *
ee50: 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20  /.  int eType;  
ee60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70            /* Typ
ee70: 65 20 6f 66 20 74 68 65 20 52 48 53 20 2a 2f 0a  e of the RHS */.
ee80: 20 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20    int r1;       
ee90: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
eea0: 72 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65  rary use registe
eeb0: 72 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  r */.  Vdbe *v; 
eec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eed0: 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  Statement under 
eee0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
eef0: 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
ef00: 65 20 52 48 53 2e 20 20 20 41 66 74 65 72 20 74  e RHS.   After t
ef10: 68 69 73 20 73 74 65 70 2c 20 74 68 65 20 74 61  his step, the ta
ef20: 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 0a  ble with cursor.
ef30: 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61 62    ** pExpr->iTab
ef40: 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 73  le will contains
ef50: 20 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74   the values that
ef60: 20 6d 61 6b 65 20 75 70 20 74 68 65 20 52 48 53   make up the RHS
ef70: 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61  ..  */.  v = pPa
ef80: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
ef90: 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20  sert( v!=0 );   
efa0: 20 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63      /* OOM detec
efb0: 74 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69  ted prior to thi
efc0: 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56  s routine */.  V
efd0: 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
efe0: 76 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78 70  v, "begin IN exp
eff0: 72 22 29 29 3b 0a 20 20 65 54 79 70 65 20 3d 20  r"));.  eType = 
f000: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
f010: 65 78 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ex(pParse, pExpr
f020: 2c 20 26 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b  , &rRhsHasNull);
f030: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
f040: 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
f050: 6f 20 75 73 65 20 74 6f 20 63 72 65 61 74 65 20  o use to create 
f060: 61 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72  a key from the r
f070: 65 73 75 6c 74 73 0a 20 20 2a 2a 20 6f 66 20 74  esults.  ** of t
f080: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 61  he expression. a
f090: 66 66 69 6e 69 74 79 53 74 72 20 73 74 6f 72 65  ffinityStr store
f0a0: 73 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e  s a static strin
f0b0: 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0a 20  g suitable for. 
f0c0: 20 2a 2a 20 50 34 20 6f 66 20 4f 50 5f 4d 61 6b   ** P4 of OP_Mak
f0d0: 65 52 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20  eRecord..  */.  
f0e0: 61 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61  affinity = compa
f0f0: 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45  risonAffinity(pE
f100: 78 70 72 29 3b 0a 0a 20 20 2f 2a 20 43 6f 64 65  xpr);..  /* Code
f110: 20 74 68 65 20 4c 48 53 2c 20 74 68 65 20 3c 65   the LHS, the <e
f120: 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72  xpr> from "<expr
f130: 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 0a 20 20 2a  > IN (...)"..  *
f140: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  /.  sqlite3ExprC
f150: 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
f160: 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33  ;.  r1 = sqlite3
f170: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
f180: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  e);.  sqlite3Exp
f190: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
f1a0: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 72 31 29 3b  xpr->pLeft, r1);
f1b0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 48  ..  /* If the LH
f1c0: 53 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  S is NULL, then 
f1d0: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 65 69  the result is ei
f1e0: 74 68 65 72 20 66 61 6c 73 65 20 6f 72 20 4e 55  ther false or NU
f1f0: 4c 4c 20 64 65 70 65 6e 64 69 6e 67 0a 20 20 2a  LL depending.  *
f200: 2a 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68 65  * on whether the
f210: 20 52 48 53 20 69 73 20 65 6d 70 74 79 20 6f 72   RHS is empty or
f220: 20 6e 6f 74 2c 20 72 65 73 70 65 63 74 69 76 65   not, respective
f230: 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ly..  */.  if( d
f240: 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49  estIfNull==destI
f250: 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 2f 2a  fFalse ){.    /*
f260: 20 53 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68   Shortcut for th
f270: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
f280: 65 72 65 20 74 68 65 20 66 61 6c 73 65 20 61 6e  ere the false an
f290: 64 20 4e 55 4c 4c 20 6f 75 74 63 6f 6d 65 73 20  d NULL outcomes 
f2a0: 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  are.    ** the s
f2b0: 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ame. */.    sqli
f2c0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f2d0: 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20   OP_IsNull, r1, 
f2e0: 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d  destIfNull);.  }
f2f0: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 61 64  else{.    int ad
f300: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
f310: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f  eAddOp1(v, OP_No
f320: 74 4e 75 6c 6c 2c 20 72 31 29 3b 0a 20 20 20 20  tNull, r1);.    
f330: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f340: 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
f350: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
f360: 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
f370: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f380: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
f390: 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
f3a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
f3b0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
f3c0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79  ;.  }..  if( eTy
f3d0: 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  pe==IN_INDEX_ROW
f3e0: 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  ID ){.    /* In 
f3f0: 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52  this case, the R
f400: 48 53 20 69 73 20 74 68 65 20 52 4f 57 49 44 20  HS is the ROWID 
f410: 6f 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65 0a  of table b-tree.
f420: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
f430: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f440: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 31  OP_MustBeInt, r1
f450: 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
f460: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f470: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45  ddOp3(v, OP_NotE
f480: 78 69 73 74 73 2c 20 70 45 78 70 72 2d 3e 69 54  xists, pExpr->iT
f490: 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73  able, destIfFals
f4a0: 65 2c 20 72 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  e, r1);.  }else{
f4b0: 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
f4c0: 63 61 73 65 2c 20 74 68 65 20 52 48 53 20 69 73  case, the RHS is
f4d0: 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65   an index b-tree
f4e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
f4f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
f500: 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 72  , OP_Affinity, r
f510: 31 2c 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69  1, 1, 0, &affini
f520: 74 79 2c 20 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  ty, 1);..    /* 
f530: 49 66 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65  If the set membe
f540: 72 73 68 69 70 20 74 65 73 74 20 66 61 69 6c 73  rship test fails
f550: 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
f560: 74 20 6f 66 20 74 68 65 20 0a 20 20 20 20 2a 2a  t of the .    **
f570: 20 22 78 20 49 4e 20 28 2e 2e 2e 29 22 20 65 78   "x IN (...)" ex
f580: 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65  pression must be
f590: 20 65 69 74 68 65 72 20 30 20 6f 72 20 4e 55 4c   either 0 or NUL
f5a0: 4c 2e 20 49 66 20 74 68 65 20 73 65 74 0a 20 20  L. If the set.  
f5b0: 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f    ** contains no
f5c0: 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68   NULL values, th
f5d0: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
f5e0: 20 30 2e 20 49 66 20 74 68 65 20 73 65 74 20 0a   0. If the set .
f5f0: 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
f600: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c  one or more NULL
f610: 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20 74 68   values, then th
f620: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a  e result of the.
f630: 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
f640: 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 0a  n is also NULL..
f650: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
f660: 52 68 73 48 61 73 4e 75 6c 6c 3d 3d 30 20 7c 7c  RhsHasNull==0 ||
f670: 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65   destIfFalse==de
f680: 73 74 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  stIfNull ){.    
f690: 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
f6a0: 20 72 75 6e 73 20 69 66 20 69 74 20 69 73 20 6b   runs if it is k
f6b0: 6e 6f 77 6e 20 61 74 20 63 6f 6d 70 69 6c 65 20  nown at compile 
f6c0: 74 69 6d 65 20 74 68 61 74 20 74 68 65 20 52 48  time that the RH
f6d0: 53 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 6e 6f  S.      ** canno
f6e0: 74 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 20 76  t contain NULL v
f6f0: 61 6c 75 65 73 2e 20 54 68 69 73 20 68 61 70 70  alues. This happ
f700: 65 6e 73 20 61 73 20 74 68 65 20 72 65 73 75 6c  ens as the resul
f710: 74 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20  t.      ** of a 
f720: 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74  "NOT NULL" const
f730: 72 61 69 6e 74 20 69 6e 20 74 68 65 20 64 61 74  raint in the dat
f740: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20  abase schema..  
f750: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
f760: 41 6c 73 6f 20 72 75 6e 20 74 68 69 73 20 62 72  Also run this br
f770: 61 6e 63 68 20 69 66 20 4e 55 4c 4c 20 69 73 20  anch if NULL is 
f780: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 46 41  equivalent to FA
f790: 4c 53 45 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  LSE.      ** for
f7a0: 20 74 68 69 73 20 70 61 72 74 69 63 75 6c 61 72   this particular
f7b0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   IN operator..  
f7c0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
f7d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
f7e0: 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  t(v, OP_NotFound
f7f0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
f800: 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31   destIfFalse, r1
f810: 2c 20 31 29 3b 0a 0a 20 20 20 20 7d 65 6c 73 65  , 1);..    }else
f820: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68  {.      /* In th
f830: 69 73 20 62 72 61 6e 63 68 2c 20 74 68 65 20 52  is branch, the R
f840: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6d 69 67  HS of the IN mig
f850: 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c  ht contain a NUL
f860: 4c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74  L and.      ** t
f870: 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 61  he presence of a
f880: 20 4e 55 4c 4c 20 6f 6e 20 74 68 65 20 52 48 53   NULL on the RHS
f890: 20 6d 61 6b 65 73 20 61 20 64 69 66 66 65 72 65   makes a differe
f8a0: 6e 63 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20  nce in the.     
f8b0: 20 2a 2a 20 6f 75 74 63 6f 6d 65 2e 0a 20 20 20   ** outcome..   
f8c0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
f8d0: 6a 31 2c 20 6a 32 2c 20 6a 33 3b 0a 0a 20 20 20  j1, j2, j3;..   
f8e0: 20 20 20 2f 2a 20 46 69 72 73 74 20 63 68 65 63     /* First chec
f8f0: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
f900: 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  LHS is contained
f910: 20 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66   in the RHS.  If
f920: 20 73 6f 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68   so,.      ** th
f930: 65 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  en the presence 
f940: 6f 66 20 4e 55 4c 4c 73 20 69 6e 20 74 68 65 20  of NULLs in the 
f950: 52 48 53 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  RHS does not mat
f960: 74 65 72 2c 20 73 6f 20 6a 75 6d 70 0a 20 20 20  ter, so jump.   
f970: 20 20 20 2a 2a 20 6f 76 65 72 20 61 6c 6c 20 6f     ** over all o
f980: 66 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  f the code that 
f990: 66 6f 6c 6c 6f 77 73 2e 0a 20 20 20 20 20 20 2a  follows..      *
f9a0: 2f 0a 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c  /.      j1 = sql
f9b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
f9c0: 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70  t(v, OP_Found, p
f9d0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c  Expr->iTable, 0,
f9e0: 20 72 31 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20   r1, 1);..      
f9f0: 2f 2a 20 48 65 72 65 20 77 65 20 62 65 67 69 6e  /* Here we begin
fa00: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65   generating code
fa10: 20 74 68 61 74 20 72 75 6e 73 20 69 66 20 74 68   that runs if th
fa20: 65 20 4c 48 53 20 69 73 20 6e 6f 74 0a 20 20 20  e LHS is not.   
fa30: 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20     ** contained 
fa40: 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20  within the RHS. 
fa50: 20 47 65 6e 65 72 61 74 65 20 61 64 64 69 74 69   Generate additi
fa60: 6f 6e 61 6c 20 63 6f 64 65 20 74 68 61 74 0a 20  onal code that. 
fa70: 20 20 20 20 20 2a 2a 20 74 65 73 74 73 20 74 68       ** tests th
fa80: 65 20 52 48 53 20 66 6f 72 20 4e 55 4c 4c 73 2e  e RHS for NULLs.
fa90: 20 20 49 66 20 74 68 65 20 52 48 53 20 63 6f 6e    If the RHS con
faa0: 74 61 69 6e 73 20 61 20 4e 55 4c 4c 20 74 68 65  tains a NULL the
fab0: 6e 0a 20 20 20 20 20 20 2a 2a 20 6a 75 6d 70 20  n.      ** jump 
fac0: 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20  to destIfNull.  
fad0: 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
fae0: 4e 55 4c 4c 73 20 69 6e 20 74 68 65 20 52 48 53  NULLs in the RHS
faf0: 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6a   then.      ** j
fb00: 75 6d 70 20 74 6f 20 64 65 73 74 49 66 46 61 6c  ump to destIfFal
fb10: 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  se..      */.   
fb20: 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56     j2 = sqlite3V
fb30: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
fb40: 4e 6f 74 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73  NotNull, rRhsHas
fb50: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 6a 33 20  Null);.      j3 
fb60: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
fb70: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
fb80: 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
fb90: 65 2c 20 30 2c 20 72 52 68 73 48 61 73 4e 75 6c  e, 0, rRhsHasNul
fba0: 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  l, 1);.      sql
fbb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
fbc0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31  , OP_Integer, -1
fbd0: 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a  , rRhsHasNull);.
fbe0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fbf0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 33 29  eJumpHere(v, j3)
fc00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fc10: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
fc20: 41 64 64 49 6d 6d 2c 20 72 52 68 73 48 61 73 4e  AddImm, rRhsHasN
fc30: 75 6c 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  ull, 1);.      s
fc40: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
fc50: 72 65 28 76 2c 20 6a 32 29 3b 0a 0a 20 20 20 20  re(v, j2);..    
fc60: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
fc70: 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 61 72   appropriate tar
fc80: 67 65 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  get depending on
fc90: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
fca0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 52 48 53        ** the RHS
fcb0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c   contains a NULL
fcc0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
fcd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fce0: 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 52 68 73  2(v, OP_If, rRhs
fcf0: 48 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e  HasNull, destIfN
fd00: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
fd10: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
fd20: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73   OP_Goto, 0, des
fd30: 74 49 66 46 61 6c 73 65 29 3b 0a 0a 20 20 20 20  tIfFalse);..    
fd40: 20 20 2f 2a 20 54 68 65 20 4f 50 5f 46 6f 75 6e    /* The OP_Foun
fd50: 64 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20  d at the top of 
fd60: 74 68 69 73 20 62 72 61 6e 63 68 20 6a 75 6d 70  this branch jump
fd70: 73 20 68 65 72 65 20 77 68 65 6e 20 74 72 75 65  s here when true
fd80: 2c 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 75 73  , .      ** caus
fd90: 69 6e 67 20 74 68 65 20 6f 76 65 72 61 6c 6c 20  ing the overall 
fda0: 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  IN expression ev
fdb0: 61 6c 75 61 74 69 6f 6e 20 74 6f 20 66 61 6c 6c  aluation to fall
fdc0: 20 74 68 72 6f 75 67 68 2e 0a 20 20 20 20 20 20   through..      
fdd0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
fde0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
fdf0: 6a 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  j1);.    }.  }. 
fe00: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
fe10: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
fe20: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  1);.  sqlite3Exp
fe30: 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
fe40: 2c 20 31 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  , 1);.  VdbeComm
fe50: 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20  ent((v, "end IN 
fe60: 65 78 70 72 22 29 29 3b 0a 7d 0a 23 65 6e 64 69  expr"));.}.#endi
fe70: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
fe80: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a  _SUBQUERY */../*
fe90: 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 61 6e  .** Duplicate an
fea0: 20 38 2d 62 79 74 65 20 76 61 6c 75 65 0a 2a 2f   8-byte value.*/
feb0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 75  .static char *du
fec0: 70 38 62 79 74 65 73 28 56 64 62 65 20 2a 76 2c  p8bytes(Vdbe *v,
fed0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e 29   const char *in)
fee0: 7b 0a 20 20 63 68 61 72 20 2a 6f 75 74 20 3d 20  {.  char *out = 
fef0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
ff00: 61 77 28 73 71 6c 69 74 65 33 56 64 62 65 44 62  aw(sqlite3VdbeDb
ff10: 28 76 29 2c 20 38 29 3b 0a 20 20 69 66 28 20 6f  (v), 8);.  if( o
ff20: 75 74 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  ut ){.    memcpy
ff30: 28 6f 75 74 2c 20 69 6e 2c 20 38 29 3b 0a 20 20  (out, in, 8);.  
ff40: 7d 0a 20 20 72 65 74 75 72 6e 20 6f 75 74 3b 0a  }.  return out;.
ff50: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
ff60: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
ff70: 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  POINT./*.** Gene
ff80: 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74  rate an instruct
ff90: 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ion that will pu
ffa0: 74 20 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70  t the floating p
ffb0: 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65  oint.** value de
ffc0: 73 63 72 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e  scribed by z[0..
ffd0: 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74  n-1] into regist
ffe0: 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  er iMem..**.** T
fff0: 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69  he z[] string wi
10000 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20  ll probably not 
10010 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74  be zero-terminat
10020 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a  ed.  But the .**
10030 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20   z[n] character 
10040 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
10050 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68   be something th
10060 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b  at does not look
10070 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e  .** like the con
10080 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65  tinuation of the
10090 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74   number..*/.stat
100a0 69 63 20 76 6f 69 64 20 63 6f 64 65 52 65 61 6c  ic void codeReal
100b0 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20  (Vdbe *v, const 
100c0 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67  char *z, int neg
100d0 61 74 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65  ateFlag, int iMe
100e0 6d 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  m){.  if( ALWAYS
100f0 28 7a 21 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f  (z!=0) ){.    do
10100 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20 20  uble value;.    
10110 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20 73 71  char *zV;.    sq
10120 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61  lite3AtoF(z, &va
10130 6c 75 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  lue);.    assert
10140 28 20 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28  ( !sqlite3IsNaN(
10150 76 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68 65  value) ); /* The
10160 20 6e 65 77 20 41 74 6f 46 20 6e 65 76 65 72 20   new AtoF never 
10170 72 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20  returns NaN */. 
10180 20 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61     if( negateFla
10190 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c  g ) value = -val
101a0 75 65 3b 0a 20 20 20 20 7a 56 20 3d 20 64 75 70  ue;.    zV = dup
101b0 38 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a  8bytes(v, (char*
101c0 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 73 71  )&value);.    sq
101d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
101e0 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69  v, OP_Real, 0, i
101f0 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 52  Mem, 0, zV, P4_R
10200 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  EAL);.  }.}.#end
10210 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  if.../*.** Gener
10220 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69  ate an instructi
10230 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74  on that will put
10240 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73   the integer des
10250 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74  cribe by.** text
10260 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20   z[0..n-1] into 
10270 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a  register iMem..*
10280 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72  *.** The z[] str
10290 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c  ing will probabl
102a0 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65  y not be zero-te
102b0 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74  rminated.  But t
102c0 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72  he .** z[n] char
102d0 61 63 74 65 72 20 69 73 20 67 75 61 72 61 6e 74  acter is guarant
102e0 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68  eed to be someth
102f0 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ing that does no
10300 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74  t look.** like t
10310 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20  he continuation 
10320 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a  of the number..*
10330 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
10340 64 65 49 6e 74 65 67 65 72 28 50 61 72 73 65 20  deInteger(Parse 
10350 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
10360 45 78 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61  Expr, int negFla
10370 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20  g, int iMem){.  
10380 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
10390 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 70  ->pVdbe;.  if( p
103a0 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
103b0 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
103c0 20 69 6e 74 20 69 20 3d 20 70 45 78 70 72 2d 3e   int i = pExpr->
103d0 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 69 66  u.iValue;.    if
103e0 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20  ( negFlag ) i = 
103f0 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  -i;.    sqlite3V
10400 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10410 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d  Integer, i, iMem
10420 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
10430 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
10440 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
10450 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d  .    assert( z!=
10460 30 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  0 );.    if( sql
10470 69 74 65 33 46 69 74 73 49 6e 36 34 42 69 74 73  ite3FitsIn64Bits
10480 28 7a 2c 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a  (z, negFlag) ){.
10490 20 20 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b        i64 value;
104a0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56 3b  .      char *zV;
104b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 74  .      sqlite3At
104c0 6f 69 36 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b  oi64(z, &value);
104d0 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c  .      if( negFl
104e0 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61  ag ) value = -va
104f0 6c 75 65 3b 0a 20 20 20 20 20 20 7a 56 20 3d 20  lue;.      zV = 
10500 64 75 70 38 62 79 74 65 73 28 76 2c 20 28 63 68  dup8bytes(v, (ch
10510 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20 20  ar*)&value);.   
10520 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10530 64 4f 70 34 28 76 2c 20 4f 50 5f 49 6e 74 36 34  dOp4(v, OP_Int64
10540 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56  , 0, iMem, 0, zV
10550 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20  , P4_INT64);.   
10560 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53   }else{.#ifdef S
10570 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
10580 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20  ING_POINT.      
10590 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
105a0 70 50 61 72 73 65 2c 20 22 6f 76 65 72 73 69 7a  pParse, "oversiz
105b0 65 64 20 69 6e 74 65 67 65 72 3a 20 25 73 25 73  ed integer: %s%s
105c0 22 2c 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22  ", negFlag ? "-"
105d0 20 3a 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65   : "", z);.#else
105e0 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28  .      codeReal(
105f0 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69  v, z, negFlag, i
10600 4d 65 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Mem);.#endif.   
10610 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
10620 43 6c 65 61 72 20 61 20 63 61 63 68 65 20 65 6e  Clear a cache en
10630 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  try..*/.static v
10640 6f 69 64 20 63 61 63 68 65 45 6e 74 72 79 43 6c  oid cacheEntryCl
10650 65 61 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ear(Parse *pPars
10660 65 2c 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  e, struct yColCa
10670 63 68 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  che *p){.  if( p
10680 2d 3e 74 65 6d 70 52 65 67 20 29 7b 0a 20 20 20  ->tempReg ){.   
10690 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65   if( pParse->nTe
106a0 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28  mpReg<ArraySize(
106b0 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
106c0 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  ) ){.      pPars
106d0 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72  e->aTempReg[pPar
106e0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20  se->nTempReg++] 
106f0 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d  = p->iReg;.    }
10700 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20  .    p->tempReg 
10710 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  = 0;.  }.}.../*.
10720 2a 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65  ** Record in the
10730 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 74 68   column cache th
10740 61 74 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  at a particular 
10750 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a  column from a.**
10760 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c   particular tabl
10770 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  e is stored in a
10780 20 70 61 72 74 69 63 75 6c 61 72 20 72 65 67 69   particular regi
10790 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ster..*/.void sq
107a0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
107b0 6f 72 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ore(Parse *pPars
107c0 65 2c 20 69 6e 74 20 69 54 61 62 2c 20 69 6e 74  e, int iTab, int
107d0 20 69 43 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29   iCol, int iReg)
107e0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
107f0 20 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69   minLru;.  int i
10800 64 78 4c 72 75 3b 0a 20 20 73 74 72 75 63 74 20  dxLru;.  struct 
10810 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20  yColCache *p;.. 
10820 20 61 73 73 65 72 74 28 20 69 52 65 67 3e 30 20   assert( iReg>0 
10830 29 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  );  /* Register 
10840 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 77 61  numbers are alwa
10850 79 73 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20  ys positive */. 
10860 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d   assert( iCol>=-
10870 31 20 26 26 20 69 43 6f 6c 3c 33 32 37 36 38 20  1 && iCol<32768 
10880 29 3b 20 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f  );  /* Finite co
10890 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a  lumn numbers */.
108a0 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54 45  .  /* The SQLITE
108b0 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20 66 6c 61  _ColumnCache fla
108c0 67 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 63  g disables the c
108d0 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 20 20 54 68  olumn cache.  Th
108e0 69 73 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20  is is used.  ** 
108f0 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79  for testing only
10900 20 2d 20 74 6f 20 76 65 72 69 66 79 20 74 68 61   - to verify tha
10910 74 20 53 51 4c 69 74 65 20 61 6c 77 61 79 73 20  t SQLite always 
10920 67 65 74 73 20 74 68 65 20 73 61 6d 65 20 61 6e  gets the same an
10930 73 77 65 72 0a 20 20 2a 2a 20 77 69 74 68 20 61  swer.  ** with a
10940 6e 64 20 77 69 74 68 6f 75 74 20 74 68 65 20 63  nd without the c
10950 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a  olumn cache..  *
10960 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
10970 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
10980 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20 29  TE_ColumnCache )
10990 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46   return;..  /* F
109a0 69 72 73 74 20 72 65 70 6c 61 63 65 20 61 6e 79  irst replace any
109b0 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 2e   existing entry.
109c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61  .  **.  ** Actua
109d0 6c 6c 79 2c 20 74 68 65 20 77 61 79 20 74 68 65  lly, the way the
109e0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 69 73   column cache is
109f0 20 63 75 72 72 65 6e 74 6c 79 20 75 73 65 64 2c   currently used,
10a00 20 77 65 20 61 72 65 20 67 75 61 72 61 6e 74 65   we are guarante
10a10 65 64 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  ed.  ** that the
10a20 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 6e 65 76   object will nev
10a30 65 72 20 61 6c 72 65 61 64 79 20 62 65 20 69 6e  er already be in
10a40 20 63 61 63 68 65 2e 20 20 56 65 72 69 66 79 20   cache.  Verify 
10a50 74 68 69 73 20 67 75 61 72 61 6e 74 65 65 2e 0a  this guarantee..
10a60 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45    */.#ifndef NDE
10a70 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  BUG.  for(i=0, p
10a80 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
10a90 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
10aa0 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
10ab0 2b 29 7b 0a 23 69 66 20 30 20 2f 2a 20 54 68 69  +){.#if 0 /* Thi
10ac0 73 20 63 6f 64 65 20 77 6f 6c 64 20 72 65 6d 6f  s code wold remo
10ad0 76 65 20 74 68 65 20 65 6e 74 72 79 20 66 72 6f  ve the entry fro
10ae0 6d 20 74 68 65 20 63 61 63 68 65 20 69 66 20 69  m the cache if i
10af0 74 20 65 78 69 73 74 65 64 20 2a 2f 0a 20 20 20  t existed */.   
10b00 20 69 66 28 20 70 2d 3e 69 52 65 67 20 26 26 20   if( p->iReg && 
10b10 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20  p->iTable==iTab 
10b20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69  && p->iColumn==i
10b30 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 63 61 63  Col ){.      cac
10b40 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61  heEntryClear(pPa
10b50 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70  rse, p);.      p
10b60 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73  ->iLevel = pPars
10b70 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a  e->iCacheLevel;.
10b80 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20        p->iReg = 
10b90 69 52 65 67 3b 0a 20 20 20 20 20 20 70 2d 3e 6c  iReg;.      p->l
10ba0 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  ru = pParse->iCa
10bb0 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  cheCnt++;.      
10bc0 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 23 65  return;.    }.#e
10bd0 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28  ndif.    assert(
10be0 20 70 2d 3e 69 52 65 67 3d 3d 30 20 7c 7c 20 70   p->iReg==0 || p
10bf0 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c  ->iTable!=iTab |
10c00 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43  | p->iColumn!=iC
10c10 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ol );.  }.#endif
10c20 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 6e 20 65  ..  /* Find an e
10c30 6d 70 74 79 20 73 6c 6f 74 20 61 6e 64 20 72 65  mpty slot and re
10c40 70 6c 61 63 65 20 69 74 20 2a 2f 0a 20 20 66 6f  place it */.  fo
10c50 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
10c60 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
10c70 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
10c80 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
10c90 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20 29  if( p->iReg==0 )
10ca0 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 65 76 65  {.      p->iLeve
10cb0 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
10cc0 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20 70  heLevel;.      p
10cd0 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b  ->iTable = iTab;
10ce0 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d  .      p->iColum
10cf0 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  n = iCol;.      
10d00 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a  p->iReg = iReg;.
10d10 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67        p->tempReg
10d20 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6c   = 0;.      p->l
10d30 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  ru = pParse->iCa
10d40 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  cheCnt++;.      
10d50 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
10d60 7d 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20  }..  /* Replace 
10d70 74 68 65 20 6c 61 73 74 20 72 65 63 65 6e 74 6c  the last recentl
10d80 79 20 75 73 65 64 20 2a 2f 0a 20 20 6d 69 6e 4c  y used */.  minL
10d90 72 75 20 3d 20 30 78 37 66 66 66 66 66 66 66 3b  ru = 0x7fffffff;
10da0 0a 20 20 69 64 78 4c 72 75 20 3d 20 2d 31 3b 0a  .  idxLru = -1;.
10db0 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
10dc0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
10dd0 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
10de0 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
10df0 20 20 20 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d      if( p->lru<m
10e00 69 6e 4c 72 75 20 29 7b 0a 20 20 20 20 20 20 69  inLru ){.      i
10e10 64 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20 20  dxLru = i;.     
10e20 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75   minLru = p->lru
10e30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
10e40 28 20 41 4c 57 41 59 53 28 69 64 78 4c 72 75 3e  ( ALWAYS(idxLru>
10e50 3d 30 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 26  =0) ){.    p = &
10e60 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
10e70 65 5b 69 64 78 4c 72 75 5d 3b 0a 20 20 20 20 70  e[idxLru];.    p
10e80 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73  ->iLevel = pPars
10e90 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a  e->iCacheLevel;.
10ea0 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20      p->iTable = 
10eb0 69 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69 43 6f  iTab;.    p->iCo
10ec0 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  lumn = iCol;.   
10ed0 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b   p->iReg = iReg;
10ee0 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20  .    p->tempReg 
10ef0 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 72 75 20  = 0;.    p->lru 
10f00 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
10f10 43 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Cnt++;.    retur
10f20 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n;.  }.}../*.** 
10f30 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 72 65  Indicate that re
10f40 67 69 73 74 65 72 73 20 62 65 74 77 65 65 6e 20  gisters between 
10f50 69 52 65 67 2e 2e 69 52 65 67 2b 6e 52 65 67 2d  iReg..iReg+nReg-
10f60 31 20 61 72 65 20 62 65 69 6e 67 20 6f 76 65 72  1 are being over
10f70 77 72 69 74 74 65 6e 2e 0a 2a 2a 20 50 75 72 67  written..** Purg
10f80 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 72  e the range of r
10f90 65 67 69 73 74 65 72 73 20 66 72 6f 6d 20 74 68  egisters from th
10fa0 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
10fb0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
10fc0 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 50  xprCacheRemove(P
10fd0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
10fe0 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67  t iReg, int nReg
10ff0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
11000 74 20 69 4c 61 73 74 20 3d 20 69 52 65 67 20 2b  t iLast = iReg +
11010 20 6e 52 65 67 20 2d 20 31 3b 0a 20 20 73 74 72   nReg - 1;.  str
11020 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
11030 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ;.  for(i=0, p=p
11040 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
11050 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
11060 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
11070 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d  {.    int r = p-
11080 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72  >iReg;.    if( r
11090 3e 3d 69 52 65 67 20 26 26 20 72 3c 3d 69 4c 61  >=iReg && r<=iLa
110a0 73 74 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68  st ){.      cach
110b0 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72  eEntryClear(pPar
110c0 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d  se, p);.      p-
110d0 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  >iReg = 0;.    }
110e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
110f0 6d 65 6d 62 65 72 20 74 68 65 20 63 75 72 72 65  member the curre
11100 6e 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  nt column cache 
11110 63 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20 6e 65  context.  Any ne
11120 77 20 65 6e 74 72 69 65 73 20 61 64 64 65 64 0a  w entries added.
11130 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ** added to the 
11140 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 66 74  column cache aft
11150 65 72 20 74 68 69 73 20 63 61 6c 6c 20 61 72 65  er this call are
11160 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 20 74 68   removed when th
11170 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
11180 6e 67 20 70 6f 70 20 6f 63 63 75 72 73 2e 0a 2a  ng pop occurs..*
11190 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
111a0 70 72 43 61 63 68 65 50 75 73 68 28 50 61 72 73  prCachePush(Pars
111b0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50  e *pParse){.  pP
111c0 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
111d0 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  l++;.}../*.** Re
111e0 6d 6f 76 65 20 66 72 6f 6d 20 74 68 65 20 63 6f  move from the co
111f0 6c 75 6d 6e 20 63 61 63 68 65 20 61 6e 79 20 65  lumn cache any e
11200 6e 74 72 69 65 73 20 74 68 61 74 20 77 65 72 65  ntries that were
11210 20 61 64 64 65 64 20 73 69 6e 63 65 20 74 68 65   added since the
11220 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73  .** the previous
11230 20 4e 20 50 75 73 68 20 6f 70 65 72 61 74 69 6f   N Push operatio
11240 6e 73 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ns.  In other wo
11250 72 64 73 2c 20 72 65 73 74 6f 72 65 20 74 68 65  rds, restore the
11260 20 63 61 63 68 65 0a 2a 2a 20 74 6f 20 74 68 65   cache.** to the
11270 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
11280 20 4e 20 50 75 73 68 65 73 20 61 67 6f 2e 0a 2a   N Pushes ago..*
11290 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
112a0 70 72 43 61 63 68 65 50 6f 70 28 50 61 72 73 65  prCachePop(Parse
112b0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 4e 29   *pParse, int N)
112c0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
112d0 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
112e0 3b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 30 20  ;.  assert( N>0 
112f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
11300 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
11310 3e 3d 4e 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  >=N );.  pParse-
11320 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 2d 3d 20  >iCacheLevel -= 
11330 4e 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  N;.  for(i=0, p=
11340 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
11350 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
11360 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
11370 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
11380 65 67 20 26 26 20 70 2d 3e 69 4c 65 76 65 6c 3e  eg && p->iLevel>
11390 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
113a0 76 65 6c 20 29 7b 0a 20 20 20 20 20 20 63 61 63  vel ){.      cac
113b0 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61  heEntryClear(pPa
113c0 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70  rse, p);.      p
113d0 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  ->iReg = 0;.    
113e0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  }.  }.}../*.** W
113f0 68 65 6e 20 61 20 63 61 63 68 65 64 20 63 6f 6c  hen a cached col
11400 75 6d 6e 20 69 73 20 72 65 75 73 65 64 2c 20 6d  umn is reused, m
11410 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 69 74  ake sure that it
11420 73 20 72 65 67 69 73 74 65 72 20 69 73 0a 2a 2a  s register is.**
11430 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c   no longer avail
11440 61 62 6c 65 20 61 73 20 61 20 74 65 6d 70 20 72  able as a temp r
11450 65 67 69 73 74 65 72 2e 20 20 74 69 63 6b 65 74  egister.  ticket
11460 20 23 33 38 37 39 3a 20 20 74 68 61 74 20 73 61   #3879:  that sa
11470 6d 65 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 6d  me.** register m
11480 69 67 68 74 20 62 65 20 69 6e 20 74 68 65 20 63  ight be in the c
11490 61 63 68 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65  ache in multiple
114a0 20 70 6c 61 63 65 73 2c 20 73 6f 20 62 65 20 73   places, so be s
114b0 75 72 65 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68  ure to.** get th
114c0 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  em all..*/.stati
114d0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  c void sqlite3Ex
114e0 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74  prCachePinRegist
114f0 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  er(Parse *pParse
11500 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69  , int iReg){.  i
11510 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
11520 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66  ColCache *p;.  f
11530 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
11540 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
11550 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
11560 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
11570 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52   if( p->iReg==iR
11580 65 67 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74  eg ){.      p->t
11590 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  empReg = 0;.    
115a0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
115b0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
115c0 65 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  extract the valu
115d0 65 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68  e of the iCol-th
115e0 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62   column of a tab
115f0 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
11600 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
11610 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56  lumnOfTable(.  V
11620 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 2f  dbe *v,        /
11630 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64 65 72  * The VDBE under
11640 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
11650 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
11660 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
11670 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76  containing the v
11680 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  alue */.  int iT
11690 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 54 68 65  abCur,    /* The
116a0 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 69 73   cursor for this
116b0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
116c0 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49  iCol,       /* I
116d0 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
116e0 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20 2a 2f  mn to extract */
116f0 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20  .  int regOut   
11700 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68     /* Extract th
11710 65 20 76 61 6c 75 64 20 69 6e 74 6f 20 74 68 69  e valud into thi
11720 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b  s register */.){
11730 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c  .  if( iCol<0 ||
11740 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b   iCol==pTab->iPK
11750 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
11760 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11770 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 43 75 72  P_Rowid, iTabCur
11780 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c  , regOut);.  }el
11790 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d  se{.    int op =
117a0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
117b0 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20   ? OP_VColumn : 
117c0 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73  OP_Column;.    s
117d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
117e0 28 76 2c 20 6f 70 2c 20 69 54 61 62 43 75 72 2c  (v, op, iTabCur,
117f0 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a   iCol, regOut);.
11800 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d    }.  if( iCol>=
11810 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
11820 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c  ColumnDefault(v,
11830 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67   pTab, iCol, reg
11840 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Out);.  }.}../*.
11850 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
11860 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61   that will extra
11870 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  ct the iColumn-t
11880 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a  h column from.**
11890 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20   table pTab and 
118a0 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e  store the column
118b0 20 76 61 6c 75 65 20 69 6e 20 61 20 72 65 67 69   value in a regi
118c0 73 74 65 72 2e 20 20 41 6e 20 65 66 66 6f 72 74  ster.  An effort
118d0 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 73  .** is made to s
118e0 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  tore the column 
118f0 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
11900 72 20 69 52 65 67 2c 20 62 75 74 20 74 68 69 73  r iReg, but this
11910 20 69 73 0a 2a 2a 20 6e 6f 74 20 67 75 61 72 61   is.** not guara
11920 6e 74 65 65 64 2e 20 20 54 68 65 20 6c 6f 63 61  nteed.  The loca
11930 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c 75  tion of the colu
11940 6d 6e 20 76 61 6c 75 65 20 69 73 20 72 65 74 75  mn value is retu
11950 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  rned..**.** Ther
11960 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65  e must be an ope
11970 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62  n cursor to pTab
11980 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20   in iTable when 
11990 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
119a0 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69  is called.  If i
119b0 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f  Column<0 then co
119c0 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
119d0 74 68 61 74 20 65 78 74 72 61 63 74 73 20 74 68  that extracts th
119e0 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20  e rowid..*/.int 
119f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
11a00 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73  etColumn(.  Pars
11a10 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
11a20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
11a30 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
11a40 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
11a50 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73  pTab,     /* Des
11a60 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
11a70 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61  table we are rea
11a80 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  ding from */.  i
11a90 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
11aa0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
11ab0 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  table column */.
11ac0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
11ad0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
11ae0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
11af0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
11b00 69 52 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20  iReg         /* 
11b10 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65  Store results he
11b20 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  re */.){.  Vdbe 
11b30 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
11b40 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
11b50 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
11b60 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20  *p;..  for(i=0, 
11b70 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
11b80 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
11b90 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
11ba0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
11bb0 69 52 65 67 3e 30 20 26 26 20 70 2d 3e 69 54 61  iReg>0 && p->iTa
11bc0 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
11bd0 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  ->iColumn==iColu
11be0 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c  mn ){.      p->l
11bf0 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  ru = pParse->iCa
11c00 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  cheCnt++;.      
11c10 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
11c20 50 69 6e 52 65 67 69 73 74 65 72 28 70 50 61 72  PinRegister(pPar
11c30 73 65 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20  se, p->iReg);.  
11c40 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 52      return p->iR
11c50 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a  eg;.    }.  }  .
11c60 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
11c70 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
11c80 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61  odeGetColumnOfTa
11c90 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61  ble(v, pTab, iTa
11ca0 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52  ble, iColumn, iR
11cb0 65 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  eg);.  sqlite3Ex
11cc0 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61  prCacheStore(pPa
11cd0 72 73 65 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f  rse, iTable, iCo
11ce0 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 72  lumn, iReg);.  r
11cf0 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f  eturn iReg;.}../
11d00 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63  *.** Clear all c
11d10 6f 6c 75 6d 6e 20 63 61 63 68 65 20 65 6e 74 72  olumn cache entr
11d20 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ies..*/.void sql
11d30 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
11d40 61 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ar(Parse *pParse
11d50 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
11d60 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
11d70 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  p;..  for(i=0, p
11d80 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
11d90 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
11da0 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
11db0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
11dc0 52 65 67 20 29 7b 0a 20 20 20 20 20 20 63 61 63  Reg ){.      cac
11dd0 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61  heEntryClear(pPa
11de0 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70  rse, p);.      p
11df0 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  ->iReg = 0;.    
11e00 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
11e10 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
11e20 68 61 74 20 61 6e 20 61 66 66 69 6e 69 74 79 20  hat an affinity 
11e30 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63 75 72  change has occur
11e40 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a  red on iCount.**
11e50 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
11e60 69 6e 67 20 77 69 74 68 20 69 53 74 61 72 74 2e  ing with iStart.
11e70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
11e80 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
11e90 79 43 68 61 6e 67 65 28 50 61 72 73 65 20 2a 70  yChange(Parse *p
11ea0 50 61 72 73 65 2c 20 69 6e 74 20 69 53 74 61 72  Parse, int iStar
11eb0 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b 0a  t, int iCount){.
11ec0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
11ed0 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
11ee0 20 69 53 74 61 72 74 2c 20 69 43 6f 75 6e 74 29   iStart, iCount)
11ef0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
11f00 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65  ate code to move
11f10 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65   content from re
11f20 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e  gisters iFrom...
11f30 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20  iFrom+nReg-1.** 
11f40 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f  over to iTo..iTo
11f50 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20 74 68  +nReg-1. Keep th
11f60 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 75  e column cache u
11f70 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f  p-to-date..*/.vo
11f80 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
11f90 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a 70 50  deMove(Parse *pP
11fa0 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c  arse, int iFrom,
11fb0 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52   int iTo, int nR
11fc0 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  eg){.  int i;.  
11fd0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
11fe0 20 2a 70 3b 0a 20 20 69 66 28 20 4e 45 56 45 52   *p;.  if( NEVER
11ff0 28 69 46 72 6f 6d 3d 3d 69 54 6f 29 20 29 20 72  (iFrom==iTo) ) r
12000 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
12010 56 64 62 65 41 64 64 4f 70 33 28 70 50 61 72 73  VdbeAddOp3(pPars
12020 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76  e->pVdbe, OP_Mov
12030 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e  e, iFrom, iTo, n
12040 52 65 67 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  Reg);.  for(i=0,
12050 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
12060 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
12070 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
12080 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 78 20  p++){.    int x 
12090 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69  = p->iReg;.    i
120a0 66 28 20 78 3e 3d 69 46 72 6f 6d 20 26 26 20 78  f( x>=iFrom && x
120b0 3c 69 46 72 6f 6d 2b 6e 52 65 67 20 29 7b 0a 20  <iFrom+nReg ){. 
120c0 20 20 20 20 20 70 2d 3e 69 52 65 67 20 2b 3d 20       p->iReg += 
120d0 69 54 6f 2d 69 46 72 6f 6d 3b 0a 20 20 20 20 7d  iTo-iFrom;.    }
120e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
120f0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63  nerate code to c
12100 6f 70 79 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  opy content from
12110 20 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d   registers iFrom
12120 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a  ...iFrom+nReg-1.
12130 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e  ** over to iTo..
12140 69 54 6f 2b 6e 52 65 67 2d 31 2e 0a 2a 2f 0a 76  iTo+nReg-1..*/.v
12150 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
12160 6f 64 65 43 6f 70 79 28 50 61 72 73 65 20 2a 70  odeCopy(Parse *p
12170 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d  Parse, int iFrom
12180 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e  , int iTo, int n
12190 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Reg){.  int i;. 
121a0 20 69 66 28 20 4e 45 56 45 52 28 69 46 72 6f 6d   if( NEVER(iFrom
121b0 3d 3d 69 54 6f 29 20 29 20 72 65 74 75 72 6e 3b  ==iTo) ) return;
121c0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52  .  for(i=0; i<nR
121d0 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  eg; i++){.    sq
121e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
121f0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
12200 50 5f 43 6f 70 79 2c 20 69 46 72 6f 6d 2b 69 2c  P_Copy, iFrom+i,
12210 20 69 54 6f 2b 69 29 3b 0a 20 20 7d 0a 7d 0a 0a   iTo+i);.  }.}..
12220 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
12230 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
12240 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45  ined(SQLITE_COVE
12250 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  RAGE_TEST)./*.**
12260 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
12270 61 6e 79 20 72 65 67 69 73 74 65 72 20 69 6e 20  any register in 
12280 74 68 65 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e  the range iFrom.
12290 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69 76 65 29  .iTo (inclusive)
122a0 0a 2a 2a 20 69 73 20 75 73 65 64 20 61 73 20 70  .** is used as p
122b0 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  art of the colum
122c0 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54  n cache..**.** T
122d0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
122e0 73 65 64 20 77 69 74 68 69 6e 20 61 73 73 65 72  sed within asser
122f0 74 28 29 20 61 6e 64 20 74 65 73 74 63 61 73 65  t() and testcase
12300 28 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a  () macros only.*
12310 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61  * and does not a
12320 70 70 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61  ppear in a norma
12330 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74  l build..*/.stat
12340 69 63 20 69 6e 74 20 75 73 65 64 41 73 43 6f 6c  ic int usedAsCol
12350 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a  umnCache(Parse *
12360 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f  pParse, int iFro
12370 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69  m, int iTo){.  i
12380 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
12390 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66  ColCache *p;.  f
123a0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
123b0 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
123c0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
123d0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
123e0 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67   int r = p->iReg
123f0 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 46 72  ;.    if( r>=iFr
12400 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29 20 72  om && r<=iTo ) r
12410 65 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f  eturn 1;    /*NO
12420 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65  _TEST*/.  }.  re
12430 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
12440 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
12450 20 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45 52   || SQLITE_COVER
12460 41 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a  AGE_TEST */../*.
12470 2a 2a 20 49 66 20 74 68 65 20 6c 61 73 74 20 69  ** If the last i
12480 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 64 65 64  nstruction coded
12490 20 69 73 20 61 6e 20 65 70 68 65 6d 65 72 61 6c   is an ephemeral
124a0 20 63 6f 70 79 20 6f 66 20 61 6e 79 20 6f 66 0a   copy of any of.
124b0 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 73  ** the registers
124c0 20 69 6e 20 74 68 65 20 6e 52 65 67 20 72 65 67   in the nReg reg
124d0 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67  isters beginning
124e0 20 77 69 74 68 20 69 52 65 67 2c 20 74 68 65 6e   with iReg, then
124f0 0a 2a 2a 20 63 6f 6e 76 65 72 74 20 74 68 65 20  .** convert the 
12500 6c 61 73 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  last instruction
12510 20 66 72 6f 6d 20 4f 50 5f 53 43 6f 70 79 20 74   from OP_SCopy t
12520 6f 20 4f 50 5f 43 6f 70 79 2e 0a 2a 2f 0a 76 6f  o OP_Copy..*/.vo
12530 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 48 61  id sqlite3ExprHa
12540 72 64 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50  rdCopy(Parse *pP
12550 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20  arse, int iReg, 
12560 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 56 64 62  int nReg){.  Vdb
12570 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65  eOp *pOp;.  Vdbe
12580 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *v;..  assert( 
12590 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
125a0 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20  ocFailed==0 );. 
125b0 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
125c0 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  be;.  assert( v!
125d0 3d 30 20 29 3b 0a 20 20 70 4f 70 20 3d 20 73 71  =0 );.  pOp = sq
125e0 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
125f0 2c 20 2d 31 29 3b 0a 20 20 61 73 73 65 72 74 28  , -1);.  assert(
12600 20 70 4f 70 21 3d 30 20 29 3b 0a 20 20 69 66 28   pOp!=0 );.  if(
12610 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
12620 5f 53 43 6f 70 79 20 26 26 20 70 4f 70 2d 3e 70  _SCopy && pOp->p
12630 31 3e 3d 69 52 65 67 20 26 26 20 70 4f 70 2d 3e  1>=iReg && pOp->
12640 70 31 3c 69 52 65 67 2b 6e 52 65 67 20 29 7b 0a  p1<iReg+nReg ){.
12650 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
12660 3d 20 4f 50 5f 43 6f 70 79 3b 0a 20 20 7d 0a 7d  = OP_Copy;.  }.}
12670 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
12680 20 63 6f 64 65 20 74 6f 20 73 74 6f 72 65 20 74   code to store t
12690 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
126a0 69 41 6c 69 61 73 2d 74 68 20 61 6c 69 61 73 20  iAlias-th alias 
126b0 69 6e 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 74  in register.** t
126c0 61 72 67 65 74 2e 20 20 54 68 65 20 66 69 72 73  arget.  The firs
126d0 74 20 74 69 6d 65 20 74 68 69 73 20 69 73 20 63  t time this is c
126e0 61 6c 6c 65 64 2c 20 70 45 78 70 72 20 69 73 20  alled, pExpr is 
126f0 65 76 61 6c 75 61 74 65 64 20 74 6f 20 63 6f 6d  evaluated to com
12700 70 75 74 65 0a 2a 2a 20 74 68 65 20 76 61 6c 75  pute.** the valu
12710 65 20 6f 66 20 74 68 65 20 61 6c 69 61 73 2e 20  e of the alias. 
12720 20 54 68 65 20 76 61 6c 75 65 20 69 73 20 73 74   The value is st
12730 6f 72 65 64 20 69 6e 20 61 6e 20 61 75 78 69 6c  ored in an auxil
12740 69 61 72 79 20 72 65 67 69 73 74 65 72 0a 2a 2a  iary register.**
12750 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
12760 6f 66 20 74 68 61 74 20 72 65 67 69 73 74 65 72  of that register
12770 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 4f   is returned.  O
12780 6e 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  n subsequent cal
12790 6c 73 2c 0a 2a 2a 20 74 68 65 20 72 65 67 69 73  ls,.** the regis
127a0 74 65 72 20 6e 75 6d 62 65 72 20 69 73 20 72 65  ter number is re
127b0 74 75 72 6e 65 64 20 77 69 74 68 6f 75 74 20 67  turned without g
127c0 65 6e 65 72 61 74 69 6e 67 20 61 6e 79 20 63 6f  enerating any co
127d0 64 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  de..**.** Note t
127e0 68 61 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  hat in order for
127f0 20 74 68 69 73 20 74 6f 20 77 6f 72 6b 2c 20 63   this to work, c
12800 6f 64 65 20 6d 75 73 74 20 62 65 20 67 65 6e 65  ode must be gene
12810 72 61 74 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  rated in the.** 
12820 73 61 6d 65 20 6f 72 64 65 72 20 74 68 61 74 20  same order that 
12830 69 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a  it is executed..
12840 2a 2a 0a 2a 2a 20 41 6c 69 61 73 65 73 20 61 72  **.** Aliases ar
12850 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74  e numbered start
12860 69 6e 67 20 77 69 74 68 20 31 2e 20 20 53 6f 20  ing with 1.  So 
12870 69 41 6c 69 61 73 20 69 73 20 69 6e 20 74 68 65  iAlias is in the
12880 20 72 61 6e 67 65 0a 2a 2a 20 6f 66 20 31 20 74   range.** of 1 t
12890 6f 20 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73  o pParse->nAlias
128a0 20 69 6e 63 6c 75 73 69 76 65 2e 20 20 0a 2a 2a   inclusive.  .**
128b0 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 61 41 6c 69  .** pParse->aAli
128c0 61 73 5b 69 41 6c 69 61 73 2d 31 5d 20 72 65 63  as[iAlias-1] rec
128d0 6f 72 64 73 20 74 68 65 20 72 65 67 69 73 74 65  ords the registe
128e0 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74  r number where t
128f0 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74  he value.** of t
12900 68 65 20 69 41 6c 69 61 73 2d 74 68 20 61 6c 69  he iAlias-th ali
12910 61 73 20 69 73 20 73 74 6f 72 65 64 2e 20 20 49  as is stored.  I
12920 66 20 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61  f zero, that mea
12930 6e 73 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 61  ns that the.** a
12940 6c 69 61 73 20 68 61 73 20 6e 6f 74 20 79 65 74  lias has not yet
12950 20 62 65 65 6e 20 63 6f 6d 70 75 74 65 64 2e 0a   been computed..
12960 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
12970 64 65 41 6c 69 61 73 28 50 61 72 73 65 20 2a 70  deAlias(Parse *p
12980 50 61 72 73 65 2c 20 69 6e 74 20 69 41 6c 69 61  Parse, int iAlia
12990 73 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  s, Expr *pExpr, 
129a0 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 23 69 66  int target){.#if
129b0 20 30 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62   0.  sqlite3 *db
129c0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
129d0 20 69 6e 74 20 69 52 65 67 3b 0a 20 20 69 66 28   int iReg;.  if(
129e0 20 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 41   pParse->nAliasA
129f0 6c 6c 6f 63 3c 70 50 61 72 73 65 2d 3e 6e 41 6c  lloc<pParse->nAl
12a00 69 61 73 20 29 7b 0a 20 20 20 20 70 50 61 72 73  ias ){.    pPars
12a10 65 2d 3e 61 41 6c 69 61 73 20 3d 20 73 71 6c 69  e->aAlias = sqli
12a20 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
12a30 65 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 61  ee(db, pParse->a
12a40 41 6c 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20  Alias,.         
12a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a60 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70          sizeof(p
12a70 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b 30 5d  Parse->aAlias[0]
12a80 29 2a 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73  )*pParse->nAlias
12a90 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
12aa0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
12ab0 65 64 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 41  ed && pParse->nA
12ac0 6c 69 61 73 41 6c 6c 6f 63 3e 30 20 29 3b 0a 20  liasAlloc>0 );. 
12ad0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
12ae0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
12af0 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   0;.    memset(&
12b00 70 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b 70  pParse->aAlias[p
12b10 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c  Parse->nAliasAll
12b20 6f 63 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  oc], 0,.        
12b30 20 20 20 28 70 50 61 72 73 65 2d 3e 6e 41 6c 69     (pParse->nAli
12b40 61 73 2d 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61  as-pParse->nAlia
12b50 73 41 6c 6c 6f 63 29 2a 73 69 7a 65 6f 66 28 70  sAlloc)*sizeof(p
12b60 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b 30 5d  Parse->aAlias[0]
12b70 29 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  ));.    pParse->
12b80 6e 41 6c 69 61 73 41 6c 6c 6f 63 20 3d 20 70 50  nAliasAlloc = pP
12b90 61 72 73 65 2d 3e 6e 41 6c 69 61 73 3b 0a 20 20  arse->nAlias;.  
12ba0 7d 0a 20 20 61 73 73 65 72 74 28 20 69 41 6c 69  }.  assert( iAli
12bb0 61 73 3e 30 20 26 26 20 69 41 6c 69 61 73 3c 3d  as>0 && iAlias<=
12bc0 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 20 29  pParse->nAlias )
12bd0 3b 0a 20 20 69 52 65 67 20 3d 20 70 50 61 72 73  ;.  iReg = pPars
12be0 65 2d 3e 61 41 6c 69 61 73 5b 69 41 6c 69 61 73  e->aAlias[iAlias
12bf0 2d 31 5d 3b 0a 20 20 69 66 28 20 69 52 65 67 3d  -1];.  if( iReg=
12c00 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  =0 ){.    if( pP
12c10 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
12c20 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 52 65  l>0 ){.      iRe
12c30 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
12c40 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
12c50 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
12c60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12c70 20 20 20 69 52 65 67 20 3d 20 2b 2b 70 50 61 72     iReg = ++pPar
12c80 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
12c90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
12ca0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 69  pParse, pExpr, i
12cb0 52 65 67 29 3b 0a 20 20 20 20 20 20 70 50 61 72  Reg);.      pPar
12cc0 73 65 2d 3e 61 41 6c 69 61 73 5b 69 41 6c 69 61  se->aAlias[iAlia
12cd0 73 2d 31 5d 20 3d 20 69 52 65 67 3b 0a 20 20 20  s-1] = iReg;.   
12ce0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
12cf0 69 52 65 67 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  iReg;.#else.  UN
12d00 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
12d10 41 6c 69 61 73 29 3b 0a 20 20 72 65 74 75 72 6e  Alias);.  return
12d20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
12d30 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
12d40 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 23  Expr, target);.#
12d50 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  endif.}../*.** G
12d60 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
12d70 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64  o the current Vd
12d80 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  be to evaluate t
12d90 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
12da0 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74  ession.  Attempt
12db0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65   to store the re
12dc0 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
12dd0 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52  r "target"..** R
12de0 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
12df0 65 72 20 77 68 65 72 65 20 72 65 73 75 6c 74 73  er where results
12e00 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a   are stored..**.
12e10 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f 75  ** With this rou
12e20 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e  tine, there is n
12e30 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  o guarantee that
12e40 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a   results will.**
12e50 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61   be stored in ta
12e60 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
12e70 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65  t might be store
12e80 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a  d in some other.
12e90 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66 20 69  ** register if i
12ea0 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20  t is convenient 
12eb0 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63  to do so.  The c
12ec0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
12ed0 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68  ** must check th
12ee0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e  e return code an
12ef0 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c  d move the resul
12f00 74 73 20 74 6f 20 74 68 65 20 64 65 73 69 72 65  ts to the desire
12f10 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a  d.** register..*
12f20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
12f30 72 43 6f 64 65 54 61 72 67 65 74 28 50 61 72 73  rCodeTarget(Pars
12f40 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
12f50 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
12f60 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  et){.  Vdbe *v =
12f70 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
12f80 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72   /* The VM under
12f90 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
12fa0 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
12fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12fc0 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67  The opcode being
12fd0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
12fe0 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20  inReg = target; 
12ff0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73        /* Results
13000 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
13010 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69  ter inReg */.  i
13020 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
13030 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
13040 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69  on-zero free thi
13050 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  s temporary regi
13060 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ster */.  int re
13070 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20  gFree2 = 0;     
13080 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
13090 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
130a0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
130b0 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 2c  */.  int r1, r2,
130c0 20 72 33 2c 20 72 34 3b 20 20 20 20 20 20 20 2f   r3, r4;       /
130d0 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69 73 74  * Various regist
130e0 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20  er numbers */.  
130f0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
13100 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65  arse->db; /* The
13110 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
13120 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tion */..  asser
13130 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74  t( target>0 && t
13140 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e  arget<=pParse->n
13150 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d  Mem );.  if( v==
13160 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
13170 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
13180 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
13190 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
131a0 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
131b0 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55  {.    op = TK_NU
131c0 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
131d0 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
131e0 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f  .  }.  switch( o
131f0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
13200 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  _AGG_COLUMN: {. 
13210 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41       AggInfo *pA
13220 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  ggInfo = pExpr->
13230 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
13240 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
13250 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67  ol *pCol = &pAgg
13260 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72  Info->aCol[pExpr
13270 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69  ->iAgg];.      i
13280 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69  f( !pAggInfo->di
13290 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20  rectMode ){.    
132a0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
132b0 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20  ->iMem>0 );.    
132c0 20 20 20 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c      inReg = pCol
132d0 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->iMem;.        
132e0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
132f0 73 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d  se if( pAggInfo-
13300 3e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29  >useSortingIdx )
13310 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13320 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
13330 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e  P_Column, pAggIn
13340 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 2c 0a  fo->sortingIdx,.
13350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
13370 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
13380 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  n, target);.    
13390 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
133a0 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65   }.      /* Othe
133b0 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75  rwise, fall thru
133c0 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c   into the TK_COL
133d0 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  UMN case */.    
133e0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
133f0 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  LUMN: {.      if
13400 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c  ( pExpr->iTable<
13410 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
13420 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
13430 73 20 77 68 65 6e 20 63 6f 64 69 6e 67 20 63 68  s when coding ch
13440 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  eck constraints 
13450 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
13460 74 28 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73  t( pParse->ckBas
13470 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  e>0 );.        i
13480 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 43  nReg = pExpr->iC
13490 6f 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e  olumn + pParse->
134a0 63 6b 42 61 73 65 3b 0a 20 20 20 20 20 20 7d 65  ckBase;.      }e
134b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52  lse{.        inR
134c0 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
134d0 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50  CodeGetColumn(pP
134e0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61  arse, pExpr->pTa
134f0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
13500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13510 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
13520 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  mn, pExpr->iTabl
13530 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  e, target);.    
13540 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
13550 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
13560 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
13570 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
13580 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30  pParse, pExpr, 0
13590 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
135a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
135b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
135c0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
135d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
135e0 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  AT: {.      asse
135f0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
13600 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
13610 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
13620 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 45    codeReal(v, pE
13630 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
13640 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
13650 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
13660 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
13670 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
13680 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
13690 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
136a0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
136b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
136c0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
136d0 74 72 69 6e 67 38 2c 20 30 2c 20 74 61 72 67 65  tring8, 0, targe
136e0 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  t, 0, pExpr->u.z
136f0 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20  Token, 0);.     
13700 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
13710 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20    case TK_NULL: 
13720 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
13730 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13740 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
13750 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
13760 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
13770 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49  ITE_OMIT_BLOB_LI
13780 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54  TERAL.    case T
13790 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  K_BLOB: {.      
137a0 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e  int n;.      con
137b0 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20  st char *z;.    
137c0 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20    char *zBlob;. 
137d0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
137e0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
137f0 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
13800 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
13810 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
13820 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45  en[0]=='x' || pE
13830 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d  xpr->u.zToken[0]
13840 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20 20 61  =='X' );.      a
13850 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
13860 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20  zToken[1]=='\'' 
13870 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26 70 45  );.      z = &pE
13880 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d  xpr->u.zToken[2]
13890 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69  ;.      n = sqli
138a0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d  te3Strlen30(z) -
138b0 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   1;.      assert
138c0 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a  ( z[n]=='\'' );.
138d0 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71        zBlob = sq
138e0 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f 62 28 73  lite3HexToBlob(s
138f0 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2c  qlite3VdbeDb(v),
13900 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71   z, n);.      sq
13910 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
13920 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c  v, OP_Blob, n/2,
13930 20 74 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f   target, 0, zBlo
13940 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  b, P4_DYNAMIC);.
13950 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13960 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
13970 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20  se TK_VARIABLE: 
13980 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
13990 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
139a0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
139b0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73  lue) );.      as
139c0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
139d0 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20  Token!=0 );.    
139e0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
139f0 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20  >u.zToken[0]!=0 
13a00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13a10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13a20 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72  _Variable, pExpr
13a30 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65  ->iColumn, targe
13a40 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  t);.      if( pE
13a50 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d  xpr->u.zToken[1]
13a60 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
13a70 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
13a80 50 34 28 76 2c 20 2d 31 2c 20 70 45 78 70 72 2d  P4(v, -1, pExpr-
13a90 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20  >u.zToken, 0);. 
13aa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
13ab0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
13ac0 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20  se TK_REGISTER: 
13ad0 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  {.      inReg = 
13ae0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
13af0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13b00 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53  }.    case TK_AS
13b10 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20  : {.      inReg 
13b20 3d 20 63 6f 64 65 41 6c 69 61 73 28 70 50 61 72  = codeAlias(pPar
13b30 73 65 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  se, pExpr->iTabl
13b40 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
13b50 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
13b60 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
13b70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13b80 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54  _CAST.    case T
13b90 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20  K_CAST: {.      
13ba0 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  /* Expressions o
13bb0 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41  f the form:   CA
13bc0 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65  ST(pLeft AS toke
13bd0 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  n) */.      int 
13be0 61 66 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20 20  aff, to_op;.    
13bf0 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
13c00 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
13c10 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
13c20 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  Left, target);. 
13c30 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
13c40 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
13c50 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
13c60 29 20 29 3b 0a 20 20 20 20 20 20 61 66 66 20 3d  ) );.      aff =
13c70 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
13c80 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54  Type(pExpr->u.zT
13c90 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 74 6f 5f  oken);.      to_
13ca0 6f 70 20 3d 20 61 66 66 20 2d 20 53 51 4c 49 54  op = aff - SQLIT
13cb0 45 5f 41 46 46 5f 54 45 58 54 20 2b 20 4f 50 5f  E_AFF_TEXT + OP_
13cc0 54 6f 54 65 78 74 3b 0a 20 20 20 20 20 20 61 73  ToText;.      as
13cd0 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  sert( to_op==OP_
13ce0 54 6f 54 65 78 74 20 20 20 20 7c 7c 20 61 66 66  ToText    || aff
13cf0 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  !=SQLITE_AFF_TEX
13d00 54 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73  T    );.      as
13d10 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  sert( to_op==OP_
13d20 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20 61 66 66  ToBlob    || aff
13d30 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  !=SQLITE_AFF_NON
13d40 45 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73  E    );.      as
13d50 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  sert( to_op==OP_
13d60 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20 61 66 66  ToNumeric || aff
13d70 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  !=SQLITE_AFF_NUM
13d80 45 52 49 43 20 29 3b 0a 20 20 20 20 20 20 61 73  ERIC );.      as
13d90 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  sert( to_op==OP_
13da0 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20 61 66 66  ToInt     || aff
13db0 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  !=SQLITE_AFF_INT
13dc0 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20 61 73  EGER );.      as
13dd0 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  sert( to_op==OP_
13de0 54 6f 52 65 61 6c 20 20 20 20 7c 7c 20 61 66 66  ToReal    || aff
13df0 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  !=SQLITE_AFF_REA
13e00 4c 20 20 20 20 29 3b 0a 20 20 20 20 20 20 74 65  L    );.      te
13e10 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f  stcase( to_op==O
13e20 50 5f 54 6f 54 65 78 74 20 29 3b 0a 20 20 20 20  P_ToText );.    
13e30 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f    testcase( to_o
13e40 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 29 3b 0a  p==OP_ToBlob );.
13e50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13e60 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65  to_op==OP_ToNume
13e70 72 69 63 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ric );.      tes
13e80 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50  tcase( to_op==OP
13e90 5f 54 6f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20  _ToInt );.      
13ea0 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d  testcase( to_op=
13eb0 3d 4f 50 5f 54 6f 52 65 61 6c 20 29 3b 0a 20 20  =OP_ToReal );.  
13ec0 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74      if( inReg!=t
13ed0 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20  arget ){.       
13ee0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13ef0 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
13f00 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a  inReg, target);.
13f10 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
13f20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a  target;.      }.
13f30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13f40 65 41 64 64 4f 70 31 28 76 2c 20 74 6f 5f 6f 70  eAddOp1(v, to_op
13f50 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20  , inReg);.      
13f60 74 65 73 74 63 61 73 65 28 20 75 73 65 64 41 73  testcase( usedAs
13f70 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
13f80 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67  se, inReg, inReg
13f90 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
13fa0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
13fb0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
13fc0 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20  , inReg, 1);.   
13fd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
13fe0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
13ff0 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20  _OMIT_CAST */.  
14000 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
14010 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
14020 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
14030 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
14040 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
14050 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
14060 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14070 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20  _LT==OP_Lt );.  
14080 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
14090 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20  E==OP_Le );.    
140a0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d    assert( TK_GT=
140b0 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20  =OP_Gt );.      
140c0 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f  assert( TK_GE==O
140d0 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Ge );.      as
140e0 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f  sert( TK_EQ==OP_
140f0 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Eq );.      asse
14100 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  rt( TK_NE==OP_Ne
14110 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14120 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b  se( op==TK_LT );
14130 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14140 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20   op==TK_LE );.  
14150 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
14160 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20  ==TK_GT );.     
14170 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
14180 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_GE );.      te
14190 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45  stcase( op==TK_E
141a0 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Q );.      testc
141b0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29  ase( op==TK_NE )
141c0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
141d0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
141e0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
141f0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
14200 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
14210 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
14220 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
14230 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
14240 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e2);.      codeC
14250 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
14260 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
14270 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
14280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14290 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c    r1, r2, inReg,
142a0 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29   SQLITE_STOREP2)
142b0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
142c0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
142d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
142e0 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
142f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14300 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
14310 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
14320 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  SNOT: {.      te
14330 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
14340 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
14350 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  ase( op==TK_ISNO
14360 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
14370 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
14380 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
14390 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
143a0 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
143b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
143c0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
143d0 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
143e0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70  Free2);.      op
143f0 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f   = (op==TK_IS) ?
14400 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a   TK_EQ : TK_NE;.
14410 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
14420 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
14430 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
14440 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
14450 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
14460 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49   r2, inReg, SQLI
14470 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 53 51 4c  TE_STOREP2 | SQL
14480 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
14490 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
144a0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
144b0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
144c0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
144d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
144e0 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20    case TK_AND:. 
144f0 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20     case TK_OR:. 
14500 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
14510 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
14520 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d  R:.    case TK_M
14530 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  INUS:.    case T
14540 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20  K_REM:.    case 
14550 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63  TK_BITAND:.    c
14560 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20  ase TK_BITOR:.  
14570 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a    case TK_SLASH:
14580 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48  .    case TK_LSH
14590 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  IFT:.    case TK
145a0 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61  _RSHIFT: .    ca
145b0 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a  se TK_CONCAT: {.
145c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
145d0 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a  _AND==OP_And );.
145e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
145f0 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20  _OR==OP_Or );.  
14600 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50      assert( TK_P
14610 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20  LUS==OP_Add );. 
14620 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
14630 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61  MINUS==OP_Subtra
14640 63 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ct );.      asse
14650 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52  rt( TK_REM==OP_R
14660 65 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20 20 20  emainder );.    
14670 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
14680 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29  AND==OP_BitAnd )
14690 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
146a0 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74  TK_BITOR==OP_Bit
146b0 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Or );.      asse
146c0 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50  rt( TK_SLASH==OP
146d0 5f 44 69 76 69 64 65 20 29 3b 0a 20 20 20 20 20  _Divide );.     
146e0 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49   assert( TK_LSHI
146f0 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74  FT==OP_ShiftLeft
14700 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14710 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_RSHIFT==OP_
14720 53 68 69 66 74 52 69 67 68 74 20 29 3b 0a 20 20  ShiftRight );.  
14730 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43      assert( TK_C
14740 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74  ONCAT==OP_Concat
14750 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14760 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  se( op==TK_AND )
14770 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14780 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20  ( op==TK_OR );. 
14790 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
147a0 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20  p==TK_PLUS );.  
147b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
147c0 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20  ==TK_MINUS );.  
147d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
147e0 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20  ==TK_REM );.    
147f0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
14800 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20  TK_BITAND );.   
14810 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14820 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20  =TK_BITOR );.   
14830 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14840 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20  =TK_SLASH );.   
14850 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14860 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20  =TK_LSHIFT );.  
14870 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
14880 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20  ==TK_RSHIFT );. 
14890 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
148a0 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a  p==TK_CONCAT );.
148b0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
148c0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
148d0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
148e0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
148f0 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
14900 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
14910 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
14920 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
14930 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14940 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
14950 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74  , r2, r1, target
14960 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14970 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
14980 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14990 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
149a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
149b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
149c0 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
149d0 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
149e0 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
149f0 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20    assert( pLeft 
14a00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
14a10 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47  ft->op==TK_INTEG
14a20 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  ER ){.        co
14a30 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  deInteger(pParse
14a40 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67  , pLeft, 1, targ
14a50 65 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  et);.#ifndef SQL
14a60 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
14a70 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65  G_POINT.      }e
14a80 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f  lse if( pLeft->o
14a90 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20  p==TK_FLOAT ){. 
14aa0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
14ab0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
14ac0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
14ad0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63  ue) );.        c
14ae0 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74  odeReal(v, pLeft
14af0 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74  ->u.zToken, 1, t
14b00 61 72 67 65 74 29 3b 0a 23 65 6e 64 69 66 0a 20  arget);.#endif. 
14b10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14b20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20 72      regFree1 = r
14b30 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
14b40 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
14b50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14b60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
14b70 6e 74 65 67 65 72 2c 20 30 2c 20 72 31 29 3b 0a  nteger, 0, r1);.
14b80 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
14b90 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
14ba0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
14bb0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 32  pLeft, &regFree2
14bc0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
14bd0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
14be0 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c  OP_Subtract, r2,
14bf0 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   r1, target);.  
14c00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14c10 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
14c20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52       }.      inR
14c30 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
14c40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14c50 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e      case TK_BITN
14c60 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
14c70 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  NOT: {.      ass
14c80 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d  ert( TK_BITNOT==
14c90 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20 20 20  OP_BitNot );.   
14ca0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
14cb0 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20 20  T==OP_Not );.   
14cc0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14cd0 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20  =TK_BITNOT );.  
14ce0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
14cf0 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20  ==TK_NOT );.    
14d00 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
14d10 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
14d20 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
14d30 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
14d40 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
14d50 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
14d60 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74    inReg = target
14d70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
14d80 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
14d90 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20   r1, inReg);.   
14da0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14db0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
14dc0 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
14dd0 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
14de0 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
14df0 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55   assert( TK_ISNU
14e00 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  LL==OP_IsNull );
14e10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
14e20 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
14e30 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 74  tNull );.      t
14e40 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
14e50 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
14e60 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
14e70 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  _NOTNULL );.    
14e80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14e90 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
14ea0 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 1, target);. 
14eb0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
14ec0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
14ed0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
14ee0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
14ef0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14f00 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
14f10 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
14f20 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
14f30 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20   op, r1);.      
14f40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14f50 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
14f60 74 61 72 67 65 74 2c 20 2d 31 29 3b 0a 20 20 20  target, -1);.   
14f70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
14f80 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
14f90 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14fa0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
14fb0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
14fc0 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70        AggInfo *p
14fd0 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41  Info = pExpr->pA
14fe0 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66  ggInfo;.      if
14ff0 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  ( pInfo==0 ){.  
15000 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
15010 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
15020 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
15030 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e) );.        sq
15040 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
15050 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66  arse, "misuse of
15060 20 61 67 67 72 65 67 61 74 65 3a 20 25 73 28 29   aggregate: %s()
15070 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  ", pExpr->u.zTok
15080 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  en);.      }else
15090 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  {.        inReg 
150a0 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70  = pInfo->aFunc[p
150b0 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d  Expr->iAgg].iMem
150c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
150d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
150e0 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46   case TK_CONST_F
150f0 55 4e 43 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UNC:.    case TK
15100 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
15110 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61     ExprList *pFa
15120 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  rg;       /* Lis
15130 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  t of function ar
15140 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
15150 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20   int nFarg;     
15160 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
15170 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  r of function ar
15180 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
15190 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20   FuncDef *pDef; 
151a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
151b0 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69  unction definiti
151c0 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  on object */.   
151d0 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20 20 20     int nId;     
151e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
151f0 67 74 68 20 6f 66 20 74 68 65 20 66 75 6e 63 74  gth of the funct
15200 69 6f 6e 20 6e 61 6d 65 20 69 6e 20 62 79 74 65  ion name in byte
15210 73 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74  s */.      const
15220 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20   char *zId;     
15230 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f    /* The functio
15240 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
15250 69 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20  int constMask = 
15260 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f  0;     /* Mask o
15270 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
15280 65 6e 74 73 20 74 68 61 74 20 61 72 65 20 63 6f  ents that are co
15290 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20  nstant */.      
152a0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
152b0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
152c0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
152d0 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  u8 enc = ENC(db)
152e0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65  ;      /* The te
152f0 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64  xt encoding used
15300 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73   by this databas
15310 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53  e */.      CollS
15320 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20  eq *pColl = 0;  
15330 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67    /* A collating
15340 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20   sequence */..  
15350 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
15360 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
15370 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
15380 29 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ) );.      testc
15390 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 53  ase( op==TK_CONS
153a0 54 5f 46 55 4e 43 20 29 3b 0a 20 20 20 20 20 20  T_FUNC );.      
153b0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
153c0 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
153d0 20 20 20 69 66 28 20 45 78 70 72 48 61 73 41 6e     if( ExprHasAn
153e0 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  yProperty(pExpr,
153f0 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
15400 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20  {.        pFarg 
15410 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
15420 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20  {.        pFarg 
15430 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
15440 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15450 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20  nFarg = pFarg ? 
15460 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30  pFarg->nExpr : 0
15470 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15480 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
15490 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
154a0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49  lue) );.      zI
154b0 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  d = pExpr->u.zTo
154c0 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d  ken;.      nId =
154d0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
154e0 28 7a 49 64 29 3b 0a 20 20 20 20 20 20 70 44 65  (zId);.      pDe
154f0 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
15500 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c  unction(db, zId,
15510 20 6e 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63   nId, nFarg, enc
15520 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
15530 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pDef==0 ){.     
15540 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15550 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
15560 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e  own function: %.
15570 2a 73 28 29 22 2c 20 6e 49 64 2c 20 7a 49 64 29  *s()", nId, zId)
15580 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
15590 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
155a0 2f 2a 20 41 74 74 65 6d 70 74 20 61 20 64 69 72  /* Attempt a dir
155b0 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ect implementati
155c0 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d  on of the built-
155d0 69 6e 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e  in COALESCE() an
155e0 64 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c  d.      ** IFNUL
155f0 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  L() functions.  
15600 54 68 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65  This avoids unne
15610 63 65 73 73 61 72 79 20 65 76 61 6c 61 74 69 6f  cessary evalatio
15620 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72  n of.      ** ar
15630 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65  guments past the
15640 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20   first non-NULL 
15650 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20  argument..      
15660 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  */.      if( pDe
15670 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f->flags & SQLIT
15680 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20  E_FUNC_COALESCE 
15690 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65  ){.        int e
156a0 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c  ndCoalesce = sql
156b0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
156c0 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 61 73  l(v);.        as
156d0 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 32 20 29  sert( nFarg>=2 )
156e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
156f0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
15700 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  , pFarg->a[0].pE
15710 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
15720 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
15730 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  <nFarg; i++){.  
15740 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15750 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15760 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c  NotNull, target,
15770 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20   endCoalesce);. 
15780 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15790 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
157a0 70 50 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20  pParse, target, 
157b0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  1);.          sq
157c0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
157d0 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
157e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
157f0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46  rCode(pParse, pF
15800 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  arg->a[i].pExpr,
15810 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
15820 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
15830 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20  achePop(pParse, 
15840 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
15850 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15860 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
15870 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20   endCoalesce);. 
15880 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
15890 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20 69 66      }...      if
158a0 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20  ( pFarg ){.     
158b0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
158c0 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
158d0 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20  se, nFarg);.    
158e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
158f0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
15900 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20  ;     /* Ticket 
15910 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a  2ea2425d34be */.
15920 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
15930 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
15940 70 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72  pParse, pFarg, r
15950 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73  1, 1);.        s
15960 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
15970 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 20 20  op(pParse, 1);  
15980 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34   /* Ticket 2ea24
15990 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20  25d34be */.     
159a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
159b0 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  r1 = 0;.      }.
159c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
159d0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
159e0 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62  .      /* Possib
159f0 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20  ly overload the 
15a00 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20  function if the 
15a10 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
15a20 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72  s.      ** a vir
15a30 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d  tual table colum
15a40 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  n..      **.    
15a50 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66    ** For infix f
15a60 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20  unctions (LIKE, 
15a70 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e  GLOB, REGEXP, an
15a80 64 20 4d 41 54 43 48 29 20 75 73 65 20 74 68 65  d MATCH) use the
15a90 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64  .      ** second
15aa0 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74   argument, not t
15ab0 68 65 20 66 69 72 73 74 2c 20 61 73 20 74 68 65  he first, as the
15ac0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73   argument to tes
15ad0 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65  t to.      ** se
15ae0 65 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c  e if it is a col
15af0 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c  umn in a virtual
15b00 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73   table.  This is
15b10 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20   done because.  
15b20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20      ** the left 
15b30 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78  operand of infix
15b40 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20   functions (the 
15b50 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20  operand we want 
15b60 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  to.      ** cont
15b70 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29  rol overloading)
15b80 20 65 6e 64 73 20 75 70 20 61 73 20 74 68 65 20   ends up as the 
15b90 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
15ba0 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
15bb0 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65  function.  The e
15bc0 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f  xpression "A glo
15bd0 62 20 42 22 20 69 73 20 65 71 75 69 76 61 6c 65  b B" is equivale
15be0 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  nt to .      ** 
15bf0 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20  "glob(B,A).  We 
15c00 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20  want to use the 
15c10 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20  A in "A glob B" 
15c20 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a  to test.      **
15c30 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76   for function ov
15c40 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20  erloading.  But 
15c50 77 65 20 75 73 65 20 74 68 65 20 42 20 74 65 72  we use the B ter
15c60 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22  m in "glob(B,A)"
15c70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
15c80 20 69 66 28 20 6e 46 61 72 67 3e 3d 32 20 26 26   if( nFarg>=2 &&
15c90 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26   (pExpr->flags &
15ca0 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29   EP_InfixFunc) )
15cb0 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
15cc0 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72   sqlite3VtabOver
15cd0 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  loadFunction(db,
15ce0 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46   pDef, nFarg, pF
15cf0 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29  arg->a[1].pExpr)
15d00 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
15d10 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20 20  ( nFarg>0 ){.   
15d20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
15d30 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46  te3VtabOverloadF
15d40 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66  unction(db, pDef
15d50 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e  , nFarg, pFarg->
15d60 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
15d70 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
15d80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61    for(i=0; i<nFa
15d90 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
15da0 20 20 69 66 28 20 69 3c 33 32 20 26 26 20 73 71    if( i<32 && sq
15db0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
15dc0 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  ant(pFarg->a[i].
15dd0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
15de0 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d      constMask |=
15df0 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20   (1<<i);.       
15e00 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
15e10 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51  pDef->flags & SQ
15e20 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
15e30 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c  LL)!=0 && !pColl
15e40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
15e50 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
15e60 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
15e70 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78   pFarg->a[i].pEx
15e80 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
15e90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
15ea0 20 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53   pDef->flags & S
15eb0 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43  QLITE_FUNC_NEEDC
15ec0 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69  OLL ){.        i
15ed0 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
15ee0 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
15ef0 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l; .        sqli
15f00 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
15f10 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20   OP_CollSeq, 0, 
15f20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43  0, 0, (char *)pC
15f30 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
15f40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15f50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15f60 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  4(v, OP_Function
15f70 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c  , constMask, r1,
15f80 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
15f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fa0 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34   (char*)pDef, P4
15fb0 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20  _FUNCDEF);.     
15fc0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
15fd0 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72  geP5(v, (u8)nFar
15fe0 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 46  g);.      if( nF
15ff0 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  arg ){.        s
16000 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
16010 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
16020 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20  1, nFarg);.     
16030 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
16040 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
16050 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
16060 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  RY.    case TK_E
16070 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20  XISTS:.    case 
16080 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
16090 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
160a0 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20  =TK_EXISTS );.  
160b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
160c0 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
160d0 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
160e0 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
160f0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
16100 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   0, 0);.      br
16110 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
16120 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
16130 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c     int destIfFal
16140 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
16150 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
16160 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
16170 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ll = sqlite3Vdbe
16180 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
16190 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
161a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
161b0 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
161c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
161d0 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
161e0 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65  xpr, destIfFalse
161f0 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
16200 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16210 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
16220 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29  eger, 1, target)
16230 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16240 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
16250 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
16260 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16270 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
16280 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30  ddImm, target, 0
16290 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
162a0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
162b0 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  (v, destIfNull);
162c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
162d0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
162e0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
162f0 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20  RY */...    /*. 
16300 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45     **    x BETWE
16310 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a  EN y AND z.    *
16320 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73  *.    ** This is
16330 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20   equivalent to. 
16340 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
16350 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20  x>=y AND x<=z.  
16360 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73    **.    ** X is
16370 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
16380 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20  ->pLeft..    ** 
16390 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  Y is stored in p
163a0 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30  Expr->pList->a[0
163b0 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20  ].pExpr..    ** 
163c0 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  Z is stored in p
163d0 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31  Expr->pList->a[1
163e0 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a  ].pExpr..    */.
163f0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
16400 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  EEN: {.      Exp
16410 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
16420 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73  ->pLeft;.      s
16430 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
16440 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45  tem *pLItem = pE
16450 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 3b  xpr->x.pList->a;
16460 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
16470 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45  ght = pLItem->pE
16480 78 70 72 3b 0a 0a 20 20 20 20 20 20 72 31 20 3d  xpr;..      r1 =
16490 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
164a0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 65  Temp(pParse, pLe
164b0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
164c0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
164d0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
164e0 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 26  Parse, pRight, &
164f0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
16500 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
16510 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
16520 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
16530 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  e2==0 );.      r
16540 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  3 = sqlite3GetTe
16550 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
16560 20 20 20 20 20 72 34 20 3d 20 73 71 6c 69 74 65       r4 = sqlite
16570 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
16580 73 65 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  se);.      codeC
16590 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
165a0 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50  Left, pRight, OP
165b0 5f 47 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _Ge,.           
165c0 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 72         r1, r2, r
165d0 33 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50  3, SQLITE_STOREP
165e0 32 29 3b 0a 20 20 20 20 20 20 70 4c 49 74 65 6d  2);.      pLItem
165f0 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  ++;.      pRight
16600 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72   = pLItem->pExpr
16610 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
16620 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
16630 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
16640 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
16650 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
16660 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
16670 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
16680 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
16690 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
166a0 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
166b0 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
166c0 68 74 2c 20 4f 50 5f 4c 65 2c 20 72 31 2c 20 72  ht, OP_Le, r1, r
166d0 32 2c 20 72 34 2c 20 53 51 4c 49 54 45 5f 53 54  2, r4, SQLITE_ST
166e0 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 73 71  OREP2);.      sq
166f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16700 76 2c 20 4f 50 5f 41 6e 64 2c 20 72 33 2c 20 72  v, OP_And, r3, r
16710 34 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  4, target);.    
16720 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
16730 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
16740 72 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r3);.      sqlit
16750 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
16760 28 70 50 61 72 73 65 2c 20 72 34 29 3b 0a 20 20  (pParse, r4);.  
16770 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16780 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
16790 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65  US: {.      inRe
167a0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
167b0 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
167c0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
167d0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
167e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
167f0 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52   case TK_TRIGGER
16800 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  : {.      /* If 
16810 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b  the opcode is TK
16820 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74  _TRIGGER, then t
16830 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
16840 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20   a reference.   
16850 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d     ** to a colum
16860 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f  n in the new.* o
16870 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  r old.* pseudo-t
16880 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20  ables available 
16890 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67  to.      ** trig
168a0 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e  ger programs. In
168b0 20 74 68 69 73 20 63 61 73 65 20 45 78 70 72 2e   this case Expr.
168c0 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  iTable is set to
168d0 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20   1 for the.     
168e0 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f   ** new.* pseudo
168f0 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72  -table, or 0 for
16900 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64   the old.* pseud
16910 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43  o-table. Expr.iC
16920 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69  olumn.      ** i
16930 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c  s set to the col
16940 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64  umn of the pseud
16950 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c  o-table to read,
16960 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20   or to -1 to.   
16970 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72     ** read the r
16980 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20  owid field..    
16990 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
169a0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
169b0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
169c0 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70  g an OP_Param op
169d0 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20 20  code. The p1.   
169e0 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20     ** parameter 
169f0 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72 20  is set to 0 for 
16a00 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66  an old.rowid ref
16a10 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69  erence, or to (i
16a20 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  +1).      ** to 
16a30 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68 65  reference anothe
16a40 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  r column of the 
16a50 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
16a60 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20 20  le, where .     
16a70 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64   ** i is the ind
16a80 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
16a90 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69  . For a new.rowi
16aa0 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31 20  d reference, p1 
16ab0 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20  is.      ** set 
16ac0 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65 20  to (n+1), where 
16ad0 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
16ae0 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61  of columns in ea
16af0 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e  ch pseudo-table.
16b00 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20  .      ** For a 
16b10 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79  reference to any
16b20 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e   other column in
16b30 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75 64   the new.* pseud
16b40 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20 20  o-table, p1.    
16b50 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 28    ** is set to (
16b60 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e 20  n+2+i), where n 
16b70 61 6e 64 20 69 20 61 72 65 20 61 73 20 64 65 66  and i are as def
16b80 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79 2e  ined previously.
16b90 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65 78   For.      ** ex
16ba0 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61  ample, if the ta
16bb0 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72 69  ble on which tri
16bc0 67 67 65 72 73 20 61 72 65 20 62 65 69 6e 67 20  ggers are being 
16bd0 66 69 72 65 64 20 69 73 0a 20 20 20 20 20 20 2a  fired is.      *
16be0 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a 20  * declared as:. 
16bf0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
16c00 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
16c10 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t1(a, b);.      
16c20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e  **.      ** Then
16c30 20 70 31 20 69 73 20 69 6e 74 65 72 70 72 65 74   p1 is interpret
16c40 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  ed as follows:. 
16c50 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
16c60 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20     p1==0   ->   
16c70 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20 70   old.rowid     p
16c80 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==3   ->    new
16c90 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20  .rowid.      ** 
16ca0 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20    p1==1   ->    
16cb0 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70 31  old.a         p1
16cc0 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e  ==4   ->    new.
16cd0 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d  a.      **   p1=
16ce0 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62  =2   ->    old.b
16cf0 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20 20           p1==5  
16d00 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20 20   ->    new.b    
16d10 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20     .      */.   
16d20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
16d30 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20   pExpr->pTab;.  
16d40 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78      int p1 = pEx
16d50 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54  pr->iTable * (pT
16d60 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20  ab->nCol+1) + 1 
16d70 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  + pExpr->iColumn
16d80 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
16d90 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
16da0 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  0 || pExpr->iTab
16db0 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61  le==1 );.      a
16dc0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43  ssert( pExpr->iC
16dd0 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78  olumn>=-1 && pEx
16de0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62  pr->iColumn<pTab
16df0 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ->nCol );.      
16e00 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50  assert( pTab->iP
16e10 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e  Key<0 || pExpr->
16e20 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69  iColumn!=pTab->i
16e30 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73  PKey );.      as
16e40 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70  sert( p1>=0 && p
16e50 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b  1<(pTab->nCol*2+
16e60 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  2) );..      sql
16e70 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16e80 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20  , OP_Param, p1, 
16e90 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56  target);.      V
16ea0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
16eb0 25 73 2e 25 73 20 2d 3e 20 24 25 64 22 2c 0a 20  %s.%s -> $%d",. 
16ec0 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69         (pExpr->i
16ed0 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20  Table ? "new" : 
16ee0 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20 20 20  "old"),.        
16ef0 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c  (pExpr->iColumn<
16f00 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70 45  0 ? "rowid" : pE
16f10 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  xpr->pTab->aCol[
16f20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
16f30 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  zName),.        
16f40 74 61 72 67 65 74 0a 20 20 20 20 20 20 29 29 3b  target.      ));
16f50 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
16f60 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
16f70 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49 66  OINT.      /* If
16f80 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20   the column has 
16f90 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69  REAL affinity, i
16fa0 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20  t may currently 
16fb0 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 6e 0a  be stored as an.
16fc0 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72        ** integer
16fd0 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41 66 66  . Use OP_RealAff
16fe0 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 73 75  inity to make su
16ff0 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20  re it is really 
17000 72 65 61 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20  real.  */.      
17010 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
17020 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26  mn>=0 .       &&
17030 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70   pTab->aCol[pExp
17040 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  r->iColumn].affi
17050 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
17060 5f 52 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20  _REAL.      ){. 
17070 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17080 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
17090 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74 61 72  ealAffinity, tar
170a0 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  get);.      }.#e
170b0 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b  ndif.      break
170c0 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a  ;.    }...    /*
170d0 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a  .    ** Form A:.
170e0 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20      **   CASE x 
170f0 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20  WHEN e1 THEN r1 
17100 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20  WHEN e2 THEN r2 
17110 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e  ... WHEN eN THEN
17120 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
17130 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
17140 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  m B:.    **   CA
17150 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20  SE WHEN e1 THEN 
17160 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
17170 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
17180 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
17190 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
171a0 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65  Form A is can be
171b0 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   transformed int
171c0 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  o the equivalent
171d0 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f   form B as follo
171e0 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53  ws:.    **   CAS
171f0 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e  E WHEN x=e1 THEN
17200 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48   r1 WHEN x=e2 TH
17210 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a  EN r2 ....    **
17220 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65          WHEN x=e
17230 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
17240 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
17250 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69 73  ** X (if it exis
17260 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d  ts) is in pExpr-
17270 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
17280 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 52   is in pExpr->pR
17290 69 67 68 74 2e 20 20 54 68 65 20 59 20 69 73 20  ight.  The Y is 
172a0 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20  also optional.  
172b0 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 20  If there is no. 
172c0 20 20 20 2a 2a 20 45 4c 53 45 20 63 6c 61 75 73     ** ELSE claus
172d0 65 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 74  e and no other t
172e0 65 72 6d 20 6d 61 74 63 68 65 73 2c 20 74 68 65  erm matches, the
172f0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  n the result of 
17300 74 68 65 0a 20 20 20 20 2a 2a 20 65 78 70 72 73  the.    ** exprs
17310 73 69 6f 6e 20 69 73 20 4e 55 4c 4c 2e 0a 20 20  sion is NULL..  
17320 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20 70 45    ** Ei is in pE
17330 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a  xpr->pList->a[i*
17340 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70 45 78  2] and Ri is pEx
17350 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32  pr->pList->a[i*2
17360 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  +1]..    **.    
17370 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66  ** The result of
17380 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
17390 69 73 20 74 68 65 20 52 69 20 66 6f 72 20 74 68  is the Ri for th
173a0 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
173b0 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69   Ei,.    ** or i
173c0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  f there is no ma
173d0 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65 20 45  tching Ei, the E
173e0 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72 20 69  LSE term Y, or i
173f0 66 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a  f there is.    *
17400 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20  * no ELSE term, 
17410 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  NULL..    */.   
17420 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
17430 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b  ( op==TK_CASE );
17440 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64   {.      int end
17450 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20  Label;          
17460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f             /* GO
17470 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64  TO label for end
17480 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20 2a 2f   of CASE stmt */
17490 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78 74 43  .      int nextC
174a0 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
174b0 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f           /* GOTO
174c0 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78 74 20   label for next 
174d0 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20  WHEN clause */. 
174e0 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 20       int nExpr; 
174f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17500 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d         /* 2x num
17510 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ber of WHEN term
17520 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  s */.      int i
17530 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17540 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17550 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
17560 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
17570 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  pEList;         
17580 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
17590 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
175a0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
175b0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69  prList_item *aLi
175c0 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61  stelem;  /* Arra
175d0 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  y of WHEN terms 
175e0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 6f 70  */.      Expr op
175f0 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20 20 20  Compare;        
17600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
17610 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73 73 69  e X==Ei expressi
17620 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
17630 20 63 61 63 68 65 58 3b 20 20 20 20 20 20 20 20   cacheX;        
17640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17650 20 43 61 63 68 65 64 20 65 78 70 72 65 73 73 69   Cached expressi
17660 6f 6e 20 58 20 2a 2f 0a 20 20 20 20 20 20 45 78  on X */.      Ex
17670 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  pr *pX;         
17680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17690 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65 73 73  /* The X express
176a0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
176b0 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20  r *pTest = 0;   
176c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
176d0 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29  * X==Ei (form A)
176e0 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72   or just Ei (for
176f0 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20 20 56 56  m B) */.      VV
17700 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69 43 61 63  A_ONLY( int iCac
17710 68 65 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65  heLevel = pParse
17720 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 20 29  ->iCacheLevel; )
17730 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
17740 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
17750 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
17760 6c 65 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e  lect) && pExpr->
17770 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  x.pList );.     
17780 20 61 73 73 65 72 74 28 28 70 45 78 70 72 2d 3e   assert((pExpr->
17790 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25  x.pList->nExpr %
177a0 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20   2) == 0);.     
177b0 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78   assert(pExpr->x
177c0 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20  .pList->nExpr > 
177d0 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74  0);.      pEList
177e0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
177f0 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c  t;.      aListel
17800 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  em = pEList->a;.
17810 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45        nExpr = pE
17820 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
17830 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71     endLabel = sq
17840 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
17850 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28  el(v);.      if(
17860 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c   (pX = pExpr->pL
17870 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eft)!=0 ){.     
17880 20 20 20 63 61 63 68 65 58 20 3d 20 2a 70 58 3b     cacheX = *pX;
17890 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
178a0 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  e( pX->op==TK_CO
178b0 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
178c0 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70  testcase( pX->op
178d0 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b  ==TK_REGISTER );
178e0 0a 20 20 20 20 20 20 20 20 63 61 63 68 65 58 2e  .        cacheX.
178f0 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  iTable = sqlite3
17900 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
17910 72 73 65 2c 20 70 58 2c 20 26 72 65 67 46 72 65  rse, pX, &regFre
17920 65 31 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  e1);.        tes
17930 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
17940 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 63 61  =0 );.        ca
17950 63 68 65 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47  cheX.op = TK_REG
17960 49 53 54 45 52 3b 0a 20 20 20 20 20 20 20 20 6f  ISTER;.        o
17970 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b  pCompare.op = TK
17980 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43  _EQ;.        opC
17990 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26  ompare.pLeft = &
179a0 63 61 63 68 65 58 3b 0a 20 20 20 20 20 20 20 20  cacheX;.        
179b0 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61  pTest = &opCompa
179c0 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  re;.      }.    
179d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
179e0 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20  pr; i=i+2){.    
179f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
17a00 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
17a10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 58  ;.        if( pX
17a20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
17a30 73 65 72 74 28 20 70 54 65 73 74 21 3d 30 20 29  sert( pTest!=0 )
17a40 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f  ;.          opCo
17a50 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61  mpare.pRight = a
17a60 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
17a70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  r;.        }else
17a80 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 73  {.          pTes
17a90 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d  t = aListelem[i]
17aa0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
17ab0 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74 43 61  }.        nextCa
17ac0 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
17ad0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
17ae0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17af0 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pTest->op==TK_CO
17b00 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
17b10 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
17b20 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 73 74  se(pParse, pTest
17b30 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49  , nextCase, SQLI
17b40 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
17b50 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
17b60 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d  ( aListelem[i+1]
17b70 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43  .pExpr->op==TK_C
17b80 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20  OLUMN );.       
17b90 20 74 65 73 74 63 61 73 65 28 20 61 4c 69 73 74   testcase( aList
17ba0 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d  elem[i+1].pExpr-
17bb0 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
17bc0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
17bd0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
17be0 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se, aListelem[i+
17bf0 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  1].pExpr, target
17c00 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
17c10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17c20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 4c  OP_Goto, 0, endL
17c30 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  abel);.        s
17c40 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
17c50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20  op(pParse, 1);. 
17c60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17c70 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
17c80 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20  , nextCase);.   
17c90 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
17ca0 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a  Expr->pRight ){.
17cb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
17cc0 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
17cd0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
17ce0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
17cf0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
17d00 67 68 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  ght, target);.  
17d10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17d20 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
17d30 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 1);.      }els
17d40 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
17d50 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17d60 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
17d70 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  et);.      }.   
17d80 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
17d90 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
17da0 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 0a 20  Parse->nErr>0 . 
17db0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
17dc0 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
17dd0 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c 20 29 3b  ==iCacheLevel );
17de0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17df0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
17e00 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20  , endLabel);.   
17e10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17e20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17e30 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20  MIT_TRIGGER.    
17e40 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b  case TK_RAISE: {
17e50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17e60 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
17e70 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20  OE_Rollback .   
17e80 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72          || pExpr
17e90 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41  ->affinity==OE_A
17ea0 62 6f 72 74 0a 20 20 20 20 20 20 20 20 20 20 20  bort.           
17eb0 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  || pExpr->affini
17ec0 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20  ty==OE_Fail.    
17ed0 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
17ee0 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67  >affinity==OE_Ig
17ef0 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  nore.      );.  
17f00 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d      if( !pParse-
17f10 3e 70 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a  >pTriggerTab ){.
17f20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
17f30 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
17f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f50 20 20 20 20 20 20 20 22 52 41 49 53 45 28 29 20         "RAISE() 
17f60 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  may only be used
17f70 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65   within a trigge
17f80 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20  r-program");.   
17f90 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
17fa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
17fb0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
17fc0 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20  ==OE_Abort ){.  
17fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79        sqlite3May
17fe0 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20  Abort(pParse);. 
17ff0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
18000 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
18010 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
18020 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
18030 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66     if( pExpr->af
18040 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72  finity==OE_Ignor
18050 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
18060 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a  ite3VdbeAddOp4(.
18070 20 20 20 20 20 20 20 20 20 20 20 20 76 2c 20 4f              v, O
18080 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f  P_Halt, SQLITE_O
18090 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c  K, OE_Ignore, 0,
180a0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
180b0 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ,0);.      }else
180c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
180d0 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
180e0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 61  pParse, pExpr->a
180f0 66 66 69 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e  ffinity, pExpr->
18100 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20  u.zToken, 0);.  
18110 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72 65      }..      bre
18120 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
18130 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
18140 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
18150 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
18160 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
18170 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
18180 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74  regFree2);.  ret
18190 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a  urn inReg;.}../*
181a0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
181b0 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e  e to evaluate an
181c0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
181d0 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
181e0 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69  s.** into a regi
181f0 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68  ster.  Return th
18200 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  e register numbe
18210 72 20 77 68 65 72 65 20 74 68 65 20 72 65 73 75  r where the resu
18220 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65  lts.** are store
18230 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
18240 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65  register is a te
18250 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
18260 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 65 61   that can be dea
18270 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65  llocated,.** the
18280 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62  n write its numb
18290 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20  er into *pReg.  
182a0 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72 65  If the result re
182b0 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a  gister is not.**
182c0 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68   a temporary, th
182d0 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20  en set *pReg to 
182e0 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  zero..*/.int sql
182f0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
18300 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
18310 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
18320 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72   *pReg){.  int r
18330 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
18340 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
18350 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65   int r2 = sqlite
18360 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
18370 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72  pParse, pExpr, r
18380 31 29 3b 0a 20 20 69 66 28 20 72 32 3d 3d 72 31  1);.  if( r2==r1
18390 20 29 7b 0a 20 20 20 20 2a 70 52 65 67 20 3d 20   ){.    *pReg = 
183a0 72 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r1;.  }else{.   
183b0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
183c0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
183d0 31 29 3b 0a 20 20 20 20 2a 70 52 65 67 20 3d 20  1);.    *pReg = 
183e0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
183f0 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  r2;.}../*.** Gen
18400 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
18410 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78  will evaluate ex
18420 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61  pression pExpr a
18430 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20  nd store the.** 
18440 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73  results in regis
18450 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65  ter target.  The
18460 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61   results are gua
18470 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61  ranteed to appea
18480 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  r.** in register
18490 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 69 6e 74 20   target..*/.int 
184a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
184b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
184c0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
184d0 74 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69  target){.  int i
184e0 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  nReg;..  assert(
184f0 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72   target>0 && tar
18500 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65  get<=pParse->nMe
18510 6d 20 29 3b 0a 20 20 69 6e 52 65 67 20 3d 20 73  m );.  inReg = s
18520 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
18530 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
18540 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 61  pr, target);.  a
18550 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
18560 56 64 62 65 20 7c 7c 20 70 50 61 72 73 65 2d 3e  Vdbe || pParse->
18570 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
18580 20 29 3b 0a 20 20 69 66 28 20 69 6e 52 65 67 21   );.  if( inReg!
18590 3d 74 61 72 67 65 74 20 26 26 20 70 50 61 72 73  =target && pPars
185a0 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  e->pVdbe ){.    
185b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
185c0 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  2(pParse->pVdbe,
185d0 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67   OP_SCopy, inReg
185e0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a 20  , target);.  }. 
185f0 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
18600 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
18610 65 20 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c  e code that eval
18620 75 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 65  utes the given e
18630 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75  xpression and pu
18640 74 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  ts the result.**
18650 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
18660 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  get..**.** Also 
18670 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
18680 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
18690 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68  sults into anoth
186a0 65 72 20 22 63 61 63 68 65 22 20 72 65 67 69 73  er "cache" regis
186b0 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66  ter.** and modif
186c0 79 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  y the expression
186d0 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78   so that the nex
186e0 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 76 61  t time it is eva
186f0 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72  luated,.** the r
18700 65 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20  esult is a copy 
18710 6f 66 20 74 68 65 20 63 61 63 68 65 20 72 65 67  of the cache reg
18720 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ister..**.** Thi
18730 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
18740 64 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  d for expression
18750 73 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20  s that are used 
18760 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d  multiple .** tim
18770 65 73 2e 20 20 54 68 65 79 20 61 72 65 20 65 76  es.  They are ev
18780 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64  aluated once and
18790 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
187a0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
187b0 2a 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f  * are reused..*/
187c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
187d0 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72  CodeAndCache(Par
187e0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
187f0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
18800 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  get){.  Vdbe *v 
18810 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
18820 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 20 20  .  int inReg;.  
18830 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
18840 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
18850 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
18860 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
18870 3e 30 20 29 3b 0a 20 20 2f 2a 20 54 68 69 73 20  >0 );.  /* This 
18880 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
18890 64 20 66 6f 72 20 74 65 72 6d 73 20 74 6f 20 49  d for terms to I
188a0 4e 53 45 52 54 20 6f 72 20 55 50 44 41 54 45 2e  NSERT or UPDATE.
188b0 20 20 41 6e 64 20 74 68 65 20 6f 6e 6c 79 0a 20    And the only. 
188c0 20 2a 2a 20 6f 74 68 65 72 20 70 6c 61 63 65 20   ** other place 
188d0 77 68 65 72 65 20 65 78 70 72 65 73 73 69 6f 6e  where expression
188e0 73 20 63 61 6e 20 62 65 20 63 6f 6e 76 65 72 74  s can be convert
188f0 65 64 20 69 6e 74 6f 20 54 4b 5f 52 45 47 49 53  ed into TK_REGIS
18900 54 45 52 20 69 73 0a 20 20 2a 2a 20 69 6e 20 57  TER is.  ** in W
18910 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
18920 65 73 73 69 6e 67 2e 20 20 53 6f 20 61 73 20 63  essing.  So as c
18930 75 72 72 65 6e 74 6c 79 20 69 6d 70 6c 65 6d 65  urrently impleme
18940 6e 74 65 64 2c 20 74 68 65 72 65 20 69 73 0a 20  nted, there is. 
18950 20 2a 2a 20 6e 6f 20 77 61 79 20 66 6f 72 20 61   ** no way for a
18960 20 54 4b 5f 52 45 47 49 53 54 45 52 20 74 6f 20   TK_REGISTER to 
18970 65 78 69 73 74 20 68 65 72 65 2e 20 20 42 75 74  exist here.  But
18980 20 69 74 20 73 65 65 6d 73 20 70 72 75 64 65 6e   it seems pruden
18990 74 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 74  t to.  ** keep t
189a0 68 65 20 41 4c 57 41 59 53 28 29 20 69 6e 20 63  he ALWAYS() in c
189b0 61 73 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  ase the conditio
189c0 6e 73 20 61 62 6f 76 65 20 63 68 61 6e 67 65 20  ns above change 
189d0 77 69 74 68 20 66 75 74 75 72 65 0a 20 20 2a 2a  with future.  **
189e0 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 6f   modifications o
189f0 72 20 65 6e 68 61 6e 63 65 6d 65 6e 74 73 2e 20  r enhancements. 
18a00 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  */.  if( ALWAYS(
18a10 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45  pExpr->op!=TK_RE
18a20 47 49 53 54 45 52 29 20 29 7b 20 20 0a 20 20 20  GISTER) ){  .   
18a30 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 20 20 69   int iMem;.    i
18a40 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
18a50 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
18a60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18a70 50 5f 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 69  P_Copy, inReg, i
18a80 4d 65 6d 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  Mem);.    pExpr-
18a90 3e 69 54 61 62 6c 65 20 3d 20 69 4d 65 6d 3b 0a  >iTable = iMem;.
18aa0 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d      pExpr->op2 =
18ab0 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20   pExpr->op;.    
18ac0 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52  pExpr->op = TK_R
18ad0 45 47 49 53 54 45 52 3b 0a 20 20 7d 0a 20 20 72  EGISTER;.  }.  r
18ae0 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a  eturn inReg;.}..
18af0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
18b00 45 20 69 66 20 70 45 78 70 72 20 69 73 20 61 6e  E if pExpr is an
18b10 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73   constant expres
18b20 73 69 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70  sion that is app
18b30 72 6f 70 72 69 61 74 65 0a 2a 2a 20 66 6f 72 20  ropriate.** for 
18b40 66 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66  factoring out of
18b50 20 61 20 6c 6f 6f 70 2e 20 20 41 70 70 72 6f 70   a loop.  Approp
18b60 72 69 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  riate expression
18b70 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  s are:.**.**    
18b80 2a 20 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f  *  Any expressio
18b90 6e 20 74 68 61 74 20 65 76 61 6c 75 61 74 65 73  n that evaluates
18ba0 20 74 6f 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   to two or more 
18bb0 6f 70 63 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  opcodes..**.**  
18bc0 20 20 2a 20 20 41 6e 79 20 4f 50 5f 49 6e 74 65    *  Any OP_Inte
18bd0 67 65 72 2c 20 4f 50 5f 52 65 61 6c 2c 20 4f 50  ger, OP_Real, OP
18be0 5f 53 74 72 69 6e 67 2c 20 4f 50 5f 42 6c 6f 62  _String, OP_Blob
18bf0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 0a 2a 2a 20 20  , OP_Null, .**  
18c00 20 20 20 20 20 6f 72 20 4f 50 5f 56 61 72 69 61       or OP_Varia
18c10 62 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ble that does no
18c20 74 20 6e 65 65 64 20 74 6f 20 62 65 20 70 6c 61  t need to be pla
18c30 63 65 64 20 69 6e 20 61 20 0a 2a 2a 20 20 20 20  ced in a .**    
18c40 20 20 20 73 70 65 63 69 66 69 63 20 72 65 67 69     specific regi
18c50 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  ster..**.** Ther
18c60 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e  e is no point in
18c70 20 66 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 73   factoring out s
18c80 69 6e 67 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f  ingle-instructio
18c90 6e 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78  n constant.** ex
18ca0 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 6e  pressions that n
18cb0 65 65 64 20 74 6f 20 62 65 20 70 6c 61 63 65 64  eed to be placed
18cc0 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   in a particular
18cd0 20 72 65 67 69 73 74 65 72 2e 20 20 0a 2a 2a 20   register.  .** 
18ce0 57 65 20 63 6f 75 6c 64 20 66 61 63 74 6f 72 20  We could factor 
18cf0 74 68 65 6d 20 6f 75 74 2c 20 62 75 74 20 74 68  them out, but th
18d00 65 6e 20 77 65 20 77 6f 75 6c 64 20 65 6e 64 20  en we would end 
18d10 75 70 20 61 64 64 69 6e 67 20 61 6e 0a 2a 2a 20  up adding an.** 
18d20 4f 50 5f 53 43 6f 70 79 20 69 6e 73 74 72 75 63  OP_SCopy instruc
18d30 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 74 68 65  tion to move the
18d40 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20   value into the 
18d50 63 6f 72 72 65 63 74 20 72 65 67 69 73 74 65 72  correct register
18d60 0a 2a 2a 20 6c 61 74 65 72 2e 20 20 57 65 20 6d  .** later.  We m
18d70 69 67 68 74 20 61 73 20 77 65 6c 6c 20 6a 75 73  ight as well jus
18d80 74 20 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e  t use the origin
18d90 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  al instruction a
18da0 6e 64 0a 2a 2a 20 61 76 6f 69 64 20 74 68 65 20  nd.** avoid the 
18db0 4f 50 5f 53 43 6f 70 79 2e 0a 2a 2f 0a 73 74 61  OP_SCopy..*/.sta
18dc0 74 69 63 20 69 6e 74 20 69 73 41 70 70 72 6f 70  tic int isApprop
18dd0 72 69 61 74 65 46 6f 72 46 61 63 74 6f 72 69 6e  riateForFactorin
18de0 67 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  g(Expr *p){.  if
18df0 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  ( !sqlite3ExprIs
18e00 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
18e10 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  p) ){.    return
18e20 20 30 3b 20 20 2f 2a 20 4f 6e 6c 79 20 63 6f 6e   0;  /* Only con
18e30 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  stant expression
18e40 73 20 61 72 65 20 61 70 70 72 6f 70 72 69 61 74  s are appropriat
18e50 65 20 66 6f 72 20 66 61 63 74 6f 72 69 6e 67 20  e for factoring 
18e60 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d  */.  }.  if( (p-
18e70 3e 66 6c 61 67 73 20 26 20 45 50 5f 46 69 78 65  >flags & EP_Fixe
18e80 64 44 65 73 74 29 3d 3d 30 20 29 7b 0a 20 20 20  dDest)==0 ){.   
18e90 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41   return 1;  /* A
18ea0 6e 79 20 63 6f 6e 73 74 61 6e 74 20 77 69 74 68  ny constant with
18eb0 6f 75 74 20 61 20 66 69 78 65 64 20 64 65 73 74  out a fixed dest
18ec0 69 6e 61 74 69 6f 6e 20 69 73 20 61 70 70 72 6f  ination is appro
18ed0 70 72 69 61 74 65 20 2a 2f 0a 20 20 7d 0a 20 20  priate */.  }.  
18ee0 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  while( p->op==TK
18ef0 5f 55 50 4c 55 53 20 29 20 70 20 3d 20 70 2d 3e  _UPLUS ) p = p->
18f00 70 4c 65 66 74 3b 0a 20 20 73 77 69 74 63 68 28  pLeft;.  switch(
18f10 20 70 2d 3e 6f 70 20 29 7b 0a 23 69 66 6e 64 65   p->op ){.#ifnde
18f20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c  f SQLITE_OMIT_BL
18f30 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63  OB_LITERAL.    c
18f40 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 23 65 6e  ase TK_BLOB:.#en
18f50 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
18f60 56 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 63 61  VARIABLE:.    ca
18f70 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20  se TK_INTEGER:. 
18f80 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
18f90 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55  :.    case TK_NU
18fa0 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
18fb0 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
18fc0 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
18fd0 3d 54 4b 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20  =TK_BLOB );.    
18fe0 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
18ff0 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29  p==TK_VARIABLE )
19000 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
19010 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  ( p->op==TK_INTE
19020 47 45 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73  GER );.      tes
19030 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
19040 5f 46 4c 4f 41 54 20 29 3b 0a 20 20 20 20 20 20  _FLOAT );.      
19050 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
19060 3d 54 4b 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  =TK_NULL );.    
19070 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
19080 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 3b 0a  p==TK_STRING );.
19090 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 2d        /* Single-
190a0 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73  instruction cons
190b0 74 61 6e 74 73 20 77 69 74 68 20 61 20 66 69 78  tants with a fix
190c0 65 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 61  ed destination a
190d0 72 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 74 74  re.      ** bett
190e0 65 72 20 64 6f 6e 65 20 69 6e 2d 6c 69 6e 65 2e  er done in-line.
190f0 20 20 49 66 20 77 65 20 66 61 63 74 6f 72 20 74    If we factor t
19100 68 65 6d 2c 20 74 68 65 79 20 77 69 6c 6c 20 6a  hem, they will j
19110 75 73 74 20 65 6e 64 0a 20 20 20 20 20 20 2a 2a  ust end.      **
19120 20 75 70 20 67 65 6e 65 72 61 74 69 6e 67 20 61   up generating a
19130 6e 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 6d 6f  n OP_SCopy to mo
19140 76 65 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20  ve the value to 
19150 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  the destination.
19160 20 20 20 20 20 20 2a 2a 20 72 65 67 69 73 74 65        ** registe
19170 72 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  r. */.      retu
19180 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
19190 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
191a0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
191b0 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f  Left->op==TK_FLO
191c0 41 54 20 7c 7c 20 70 2d 3e 70 4c 65 66 74 2d 3e  AT || p->pLeft->
191d0 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29  op==TK_INTEGER )
191e0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
191f0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
19200 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
19210 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
19220 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19230 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
19240 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 45 78  .}../*.** If pEx
19250 70 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  pr is a constant
19260 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
19270 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
19280 66 6f 72 0a 2a 2a 20 66 61 63 74 6f 72 69 6e 67  for.** factoring
19290 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2c 20   out of a loop, 
192a0 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68  then evaluate th
192b0 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
192c0 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 20  into a register 
192d0 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 68 65 20  and convert the 
192e0 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20  expression into 
192f0 61 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2a  a TK_REGISTER.**
19300 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a   expression..*/.
19310 73 74 61 74 69 63 20 69 6e 74 20 65 76 61 6c 43  static int evalC
19320 6f 6e 73 74 45 78 70 72 28 57 61 6c 6b 65 72 20  onstExpr(Walker 
19330 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
19340 70 45 78 70 72 29 7b 0a 20 20 50 61 72 73 65 20  pExpr){.  Parse 
19350 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
19360 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 77 69  r->pParse;.  swi
19370 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
19380 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  {.    case TK_IN
19390 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  :.    case TK_RE
193a0 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  GISTER: {.      
193b0 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
193c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
193d0 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20   TK_FUNCTION:.  
193e0 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
193f0 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65  NCTION:.    case
19400 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 20   TK_CONST_FUNC: 
19410 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  {.      /* The a
19420 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 20 66 75  rguments to a fu
19430 6e 63 74 69 6f 6e 20 68 61 76 65 20 61 20 66 69  nction have a fi
19440 78 65 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e  xed destination.
19450 0a 20 20 20 20 20 20 2a 2a 20 4d 61 72 6b 20 74  .      ** Mark t
19460 68 65 6d 20 74 68 69 73 20 77 61 79 20 74 6f 20  hem this way to 
19470 61 76 6f 69 64 20 67 65 6e 65 72 61 74 65 64 20  avoid generated 
19480 75 6e 6e 65 65 64 65 64 20 4f 50 5f 53 43 6f 70  unneeded OP_SCop
19490 79 0a 20 20 20 20 20 20 2a 2a 20 69 6e 73 74 72  y.      ** instr
194a0 75 63 74 69 6f 6e 73 2e 20 0a 20 20 20 20 20 20  uctions. .      
194b0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
194c0 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
194d0 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
194e0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
194f0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
19500 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
19510 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
19520 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  t ){.        int
19530 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70   i = pList->nExp
19540 72 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  r;.        struc
19550 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
19560 2a 70 49 74 65 6d 20 3d 20 70 4c 69 73 74 2d 3e  *pItem = pList->
19570 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b  a;.        for(;
19580 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
19590 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
195a0 66 28 20 41 4c 57 41 59 53 28 70 49 74 65 6d 2d  f( ALWAYS(pItem-
195b0 3e 70 45 78 70 72 29 20 29 20 70 49 74 65 6d 2d  >pExpr) ) pItem-
195c0 3e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d  >pExpr->flags |=
195d0 20 45 50 5f 46 69 78 65 64 44 65 73 74 3b 0a 20   EP_FixedDest;. 
195e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
195f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19600 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73    }.  }.  if( is
19610 41 70 70 72 6f 70 72 69 61 74 65 46 6f 72 46 61  AppropriateForFa
19620 63 74 6f 72 69 6e 67 28 70 45 78 70 72 29 20 29  ctoring(pExpr) )
19630 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 2b  {.    int r1 = +
19640 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
19650 20 20 20 69 6e 74 20 72 32 3b 0a 20 20 20 20 72     int r2;.    r
19660 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
19670 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
19680 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20  , pExpr, r1);.  
19690 20 20 69 66 28 20 4e 45 56 45 52 28 72 31 21 3d    if( NEVER(r1!=
196a0 72 32 29 20 29 20 73 71 6c 69 74 65 33 52 65 6c  r2) ) sqlite3Rel
196b0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
196c0 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 70 45 78  se, r1);.    pEx
196d0 70 72 2d 3e 6f 70 32 20 3d 20 70 45 78 70 72 2d  pr->op2 = pExpr-
196e0 3e 6f 70 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  >op;.    pExpr->
196f0 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52  op = TK_REGISTER
19700 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61  ;.    pExpr->iTa
19710 62 6c 65 20 3d 20 72 32 3b 0a 20 20 20 20 72 65  ble = r2;.    re
19720 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
19730 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
19740 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
19750 0a 2a 2a 20 50 72 65 65 76 61 6c 75 61 74 65 20  .** Preevaluate 
19760 63 6f 6e 73 74 61 6e 74 20 73 75 62 65 78 70 72  constant subexpr
19770 65 73 73 69 6f 6e 73 20 77 69 74 68 69 6e 20 70  essions within p
19780 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74  Expr and store t
19790 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e  he.** results in
197a0 20 72 65 67 69 73 74 65 72 73 2e 20 20 4d 6f 64   registers.  Mod
197b0 69 66 79 20 70 45 78 70 72 20 73 6f 20 74 68 61  ify pExpr so tha
197c0 74 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 73  t the constant s
197d0 75 62 65 78 70 72 65 73 69 6f 6e 73 0a 2a 2a 20  ubexpresions.** 
197e0 61 72 65 20 54 4b 5f 52 45 47 49 53 54 45 52 20  are TK_REGISTER 
197f0 6f 70 63 6f 64 65 73 20 74 68 61 74 20 72 65 66  opcodes that ref
19800 65 72 20 74 6f 20 74 68 65 20 70 72 65 63 6f 6d  er to the precom
19810 70 75 74 65 64 20 76 61 6c 75 65 73 2e 0a 2a 2f  puted values..*/
19820 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
19830 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73 28 50  rCodeConstants(P
19840 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
19850 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61  pr *pExpr){.  Wa
19860 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70  lker w;.  w.xExp
19870 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 76 61 6c  rCallback = eval
19880 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 77 2e 78  ConstExpr;.  w.x
19890 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
198a0 20 30 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d   0;.  w.pParse =
198b0 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74   pParse;.  sqlit
198c0 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
198d0 45 78 70 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  Expr);.}.../*.**
198e0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
198f0 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76  hat pushes the v
19900 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c  alue of every el
19910 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76  ement of the giv
19920 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  en.** expression
19930 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71   list into a seq
19940 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
19950 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  rs beginning at 
19960 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65  target..**.** Re
19970 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
19980 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c  of elements eval
19990 75 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  uated..*/.int sq
199a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
199b0 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
199c0 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
199d0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
199e0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
199f0 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78  ist,   /* The ex
19a00 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
19a10 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69   be coded */.  i
19a20 6e 74 20 74 61 72 67 65 74 2c 20 20 20 20 20 20  nt target,      
19a30 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
19a40 69 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ite results */. 
19a50 20 69 6e 74 20 64 6f 48 61 72 64 43 6f 70 79 20   int doHardCopy 
19a60 20 20 20 20 2f 2a 20 4d 61 6b 65 20 61 20 68 61      /* Make a ha
19a70 72 64 20 63 6f 70 79 20 6f 66 20 65 76 65 72 79  rd copy of every
19a80 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20   element */.){. 
19a90 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
19aa0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
19ab0 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 61 73 73 65  int i, n;.  asse
19ac0 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a  rt( pList!=0 );.
19ad0 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
19ae0 3e 30 20 29 3b 0a 20 20 6e 20 3d 20 70 4c 69 73  >0 );.  n = pLis
19af0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28  t->nExpr;.  for(
19b00 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
19b10 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70  i=0; i<n; i++, p
19b20 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Item++){.    if(
19b30 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 29   pItem->iAlias )
19b40 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 52 65 67  {.      int iReg
19b50 20 3d 20 63 6f 64 65 41 6c 69 61 73 28 70 50 61   = codeAlias(pPa
19b60 72 73 65 2c 20 70 49 74 65 6d 2d 3e 69 41 6c 69  rse, pItem->iAli
19b70 61 73 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  as, pItem->pExpr
19b80 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20  , target+i);.   
19b90 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
19ba0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
19bb0 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  se);.      if( i
19bc0 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b  Reg!=target+i ){
19bd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19be0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19bf0 5f 53 43 6f 70 79 2c 20 69 52 65 67 2c 20 74 61  _SCopy, iReg, ta
19c00 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 7d  rget+i);.      }
19c10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19c20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
19c30 65 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  e(pParse, pItem-
19c40 3e 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69  >pExpr, target+i
19c50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
19c60 20 64 6f 48 61 72 64 43 6f 70 79 20 26 26 20 21   doHardCopy && !
19c70 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
19c80 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
19c90 20 20 73 71 6c 69 74 65 33 45 78 70 72 48 61 72    sqlite3ExprHar
19ca0 64 43 6f 70 79 28 70 50 61 72 73 65 2c 20 74 61  dCopy(pParse, ta
19cb0 72 67 65 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a  rget, n);.    }.
19cc0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
19cd0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
19ce0 65 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45 54  e code for a BET
19cf0 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  WEEN operator..*
19d00 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45  *.**    x BETWEE
19d10 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20  N y AND z.**.** 
19d20 54 68 65 20 61 62 6f 76 65 20 69 73 20 65 71 75  The above is equ
19d30 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a  ivalent to .**.*
19d40 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c  *    x>=y AND x<
19d50 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69 74  =z.**.** Code it
19d60 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67   as such, taking
19d70 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20   care to do the 
19d80 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73  common subexpres
19d90 73 69 6f 6e 0a 2a 2a 20 65 6c 65 6d 65 6e 74 61  sion.** elementa
19da0 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2f 0a 73 74  tion of x..*/.st
19db0 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f  atic void exprCo
19dc0 64 65 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72  deBetween(.  Par
19dd0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
19de0 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
19df0 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
19e00 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
19e10 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20  *pExpr,      /* 
19e20 54 68 65 20 42 45 54 57 45 45 4e 20 65 78 70 72  The BETWEEN expr
19e30 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
19e40 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  dest,         /*
19e50 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68   Jump here if th
19e60 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20  e jump is taken 
19e70 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 54  */.  int jumpIfT
19e80 72 75 65 2c 20 20 20 2f 2a 20 54 61 6b 65 20 74  rue,   /* Take t
19e90 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42  he jump if the B
19ea0 45 54 57 45 45 4e 20 69 73 20 74 72 75 65 20 2a  ETWEEN is true *
19eb0 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  /.  int jumpIfNu
19ec0 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20 74 68  ll    /* Take th
19ed0 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45  e jump if the BE
19ee0 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f  TWEEN is NULL */
19ef0 0a 29 7b 0a 20 20 45 78 70 72 20 65 78 70 72 41  .){.  Expr exprA
19f00 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 41  nd;     /* The A
19f10 4e 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 20  ND operator in  
19f20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a  x>=y AND x<=z  *
19f30 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66  /.  Expr compLef
19f40 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78 3e  t;    /* The  x>
19f50 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78  =y  term */.  Ex
19f60 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20 20  pr compRight;   
19f70 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74 65  /* The  x<=z  te
19f80 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65 78 70  rm */.  Expr exp
19f90 72 58 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  rX;       /* The
19fa0 20 20 78 20 20 73 75 62 65 78 70 72 65 73 73 69    x  subexpressi
19fb0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  on */.  int regF
19fc0 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d  ree1 = 0; /* Tem
19fd0 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73  porary use regis
19fe0 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
19ff0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1a000 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
1a010 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 65 78 70  Select) );.  exp
1a020 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65  rX = *pExpr->pLe
1a030 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70  ft;.  exprAnd.op
1a040 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70   = TK_AND;.  exp
1a050 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f  rAnd.pLeft = &co
1a060 6d 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e  mpLeft;.  exprAn
1a070 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70  d.pRight = &comp
1a080 52 69 67 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66  Right;.  compLef
1a090 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20  t.op = TK_GE;.  
1a0a0 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d  compLeft.pLeft =
1a0b0 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c   &exprX;.  compL
1a0c0 65 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78  eft.pRight = pEx
1a0d0 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30  pr->x.pList->a[0
1a0e0 5d 2e 70 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52  ].pExpr;.  compR
1a0f0 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b  ight.op = TK_LE;
1a100 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65  .  compRight.pLe
1a110 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63  ft = &exprX;.  c
1a120 6f 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74 20  ompRight.pRight 
1a130 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
1a140 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
1a150 65 78 70 72 58 2e 69 54 61 62 6c 65 20 3d 20 73  exprX.iTable = s
1a160 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1a170 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78 70 72  mp(pParse, &expr
1a180 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  X, &regFree1);. 
1a190 20 65 78 70 72 58 2e 6f 70 20 3d 20 54 4b 5f 52   exprX.op = TK_R
1a1a0 45 47 49 53 54 45 52 3b 0a 20 20 69 66 28 20 6a  EGISTER;.  if( j
1a1b0 75 6d 70 49 66 54 72 75 65 20 29 7b 0a 20 20 20  umpIfTrue ){.   
1a1c0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
1a1d0 75 65 28 70 50 61 72 73 65 2c 20 26 65 78 70 72  ue(pParse, &expr
1a1e0 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  And, dest, jumpI
1a1f0 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b  fNull);.  }else{
1a200 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1a210 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1a220 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20  &exprAnd, dest, 
1a230 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d  jumpIfNull);.  }
1a240 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
1a250 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1a260 20 72 65 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f   regFree1);..  /
1a270 2a 20 45 6e 73 75 72 65 20 61 64 65 71 75 61 74  * Ensure adequat
1a280 65 20 74 65 73 74 20 63 6f 76 65 72 61 67 65 20  e test coverage 
1a290 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  */.  testcase( j
1a2a0 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20  umpIfTrue==0 && 
1a2b0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
1a2c0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1a2d0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1a2e0 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d  IfTrue==0 && jum
1a2f0 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
1a300 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
1a310 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1a320 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue==0 && jumpIf
1a330 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
1a340 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
1a350 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
1a360 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ==0 && jumpIfNul
1a370 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
1a380 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
1a390 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30  e( jumpIfTrue!=0
1a3a0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
1a3b0 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
1a3c0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1a3d0 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26  jumpIfTrue!=0 &&
1a3e0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
1a3f0 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
1a400 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
1a410 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75  pIfTrue!=0 && ju
1a420 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
1a430 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1a440 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1a450 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49  True!=0 && jumpI
1a460 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
1a470 72 65 65 31 21 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a  ree1!=0 );.}../*
1a480 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1a490 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
1a4a0 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
1a4b0 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
1a4c0 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
1a4d0 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
1a4e0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1a4f0 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69  true but executi
1a500 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
1a510 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
1a520 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1a530 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20  is false..**.** 
1a540 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
1a550 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
1a560 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
1a570 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68  e nor false), th
1a580 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a  en.** take the j
1a590 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49  ump if the jumpI
1a5a0 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51  fNull flag is SQ
1a5b0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e  LITE_JUMPIFNULL.
1a5c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65  .**.** This code
1a5d0 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
1a5e0 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69  fact that certai
1a5f0 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28  n token values (
1a600 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72  ex: TK_EQ).** ar
1a610 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70  e the same as op
1a620 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a  code values (ex:
1a630 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70   OP_Eq) that imp
1a640 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65  lement the corre
1a650 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72  sponding.** oper
1a660 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20  ation.  Special 
1a670 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65  comments in vdbe
1a680 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63  .c and the mkopc
1a690 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20  odeh.awk script 
1a6a0 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70  in.** the make p
1a6b0 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65  rocess cause the
1a6c0 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69  se values to ali
1a6d0 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69  gn.  Assert()s i
1a6e0 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65  n the code.** be
1a6f0 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20  low verify that 
1a700 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20  the numbers are 
1a710 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c  aligned correctl
1a720 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
1a730 65 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72  e3ExprIfTrue(Par
1a740 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1a750 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
1a760 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
1a770 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
1a780 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1a790 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
1a7a0 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
1a7b0 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
1a7c0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72  = 0;.  int r1, r
1a7d0 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75  2;..  assert( ju
1a7e0 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
1a7f0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a  _JUMPIFNULL || j
1a800 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1a810 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
1a820 29 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20  ) )     return; 
1a830 20 2f 2a 20 45 78 69 73 74 61 6e 63 65 20 6f 66   /* Existance of
1a840 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79   VDBE checked by
1a850 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28   caller */.  if(
1a860 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29   NEVER(pExpr==0)
1a870 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e   ) return;  /* N
1a880 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68  o way this can h
1a890 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20  appen */.  op = 
1a8a0 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69  pExpr->op;.  swi
1a8b0 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
1a8c0 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
1a8d0 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
1a8e0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1a8f0 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74  l(v);.      test
1a900 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1a910 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1a920 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
1a930 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
1a940 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
1a950 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
1a960 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d  r->pLeft, d2,jum
1a970 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a  pIfNull^SQLITE_J
1a980 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
1a990 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
1a9a0 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
1a9b0 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
1a9c0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1a9d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1a9e0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
1a9f0 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
1aa00 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
1aa10 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  arse, 1);.      
1aa20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1aa30 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20   case TK_OR: {. 
1aa40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1aa50 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1aa60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1aa70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
1aa80 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
1aa90 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1aaa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1aab0 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
1aac0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1aad0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1aae0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1aaf0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1ab00 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  K_NOT: {.      t
1ab10 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1ab20 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1ab30 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1ab40 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
1ab50 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
1ab60 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1ab70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1ab80 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
1ab90 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
1aba0 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
1abb0 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
1abc0 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
1abd0 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
1abe0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1abf0 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20  K_LT==OP_Lt );. 
1ac00 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1ac10 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20  LE==OP_Le );.   
1ac20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
1ac30 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20  ==OP_Gt );.     
1ac40 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
1ac50 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61  OP_Ge );.      a
1ac60 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50  ssert( TK_EQ==OP
1ac70 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Eq );.      ass
1ac80 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  ert( TK_NE==OP_N
1ac90 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
1aca0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29  ase( op==TK_LT )
1acb0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1acc0 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20  ( op==TK_LE );. 
1acd0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1ace0 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20  p==TK_GT );.    
1acf0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1ad00 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_GE );.      t
1ad10 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1ad20 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  EQ );.      test
1ad30 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20  case( op==TK_NE 
1ad40 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1ad50 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1ad60 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
1ad70 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1ad80 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1ad90 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1ada0 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
1adb0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1adc0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1add0 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
1ade0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
1adf0 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
1ae00 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
1ae10 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
1ae20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ae30 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
1ae40 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1ae50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1ae60 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1ae70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1ae80 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
1ae90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1aea0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
1aeb0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
1aec0 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
1aed0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29  ase( op==TK_IS )
1aee0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1aef0 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ( op==TK_ISNOT )
1af00 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
1af10 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1af20 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1af30 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1af40 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
1af50 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1af60 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1af70 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
1af80 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20  e2);.      op = 
1af90 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  (op==TK_IS) ? TK
1afa0 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20  _EQ : TK_NE;.   
1afb0 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1afc0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1afd0 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
1afe0 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
1aff0 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
1b000 2c 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e  , dest, SQLITE_N
1b010 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65  ULLEQ);.      te
1b020 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1b030 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
1b040 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
1b050 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1b060 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1b070 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
1b080 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
1b090 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1b0a0 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f  ( TK_ISNULL==OP_
1b0b0 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20  IsNull );.      
1b0c0 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55  assert( TK_NOTNU
1b0d0 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  LL==OP_NotNull )
1b0e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1b0f0 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
1b100 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1b110 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
1b120 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  L );.      r1 = 
1b130 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1b140 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1b150 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1b160 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
1b170 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b180 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a   op, r1, dest);.
1b190 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1b1a0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1b1b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b1c0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  }.    case TK_BE
1b1d0 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74  TWEEN: {.      t
1b1e0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1b1f0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1b200 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
1b210 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
1b220 65 73 74 2c 20 31 2c 20 6a 75 6d 70 49 66 4e 75  est, 1, jumpIfNu
1b230 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
1b240 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1b250 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
1b260 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20  int destIfFalse 
1b270 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1b280 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1b290 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
1b2a0 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64  = jumpIfNull ? d
1b2b0 65 73 74 20 3a 20 64 65 73 74 49 66 46 61 6c 73  est : destIfFals
1b2c0 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
1b2d0 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
1b2e0 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49 66  e, pExpr, destIf
1b2f0 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c  False, destIfNul
1b300 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1b310 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b320 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29  P_Goto, 0, dest)
1b330 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1b340 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1b350 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
1b360 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1b370 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
1b380 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71   {.      r1 = sq
1b390 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1b3a0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  p(pParse, pExpr,
1b3b0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1b3c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b3d0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp3(v, OP_If, r
1b3e0 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  1, dest, jumpIfN
1b3f0 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 74  ull!=0);.      t
1b400 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1b410 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
1b420 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1b430 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  ll==0 );.      b
1b440 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1b450 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1b460 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1b470 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
1b480 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1b490 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
1b4a0 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee2);  .}../*.**
1b4b0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
1b4c0 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
1b4d0 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
1b4e0 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
1b4f0 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
1b500 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
1b510 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
1b520 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  se but execution
1b530 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
1b540 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
1b550 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
1b560 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   true..**.** If 
1b570 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
1b580 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
1b590 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
1b5a0 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a  or false) then.*
1b5b0 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66  * jump if jumpIf
1b5c0 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a  Null is SQLITE_J
1b5d0 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c  UMPIFNULL or fal
1b5e0 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d  l through if jum
1b5f0 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e  pIfNull.** is 0.
1b600 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1b610 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73  ExprIfFalse(Pars
1b620 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1b630 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
1b640 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
1b650 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1b660 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1b670 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
1b680 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a  t regFree1 = 0;.
1b690 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
1b6a0 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   0;.  int r1, r2
1b6b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d  ;..  assert( jum
1b6c0 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
1b6d0 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75  JUMPIFNULL || ju
1b6e0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1b6f0 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
1b700 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78   ) return; /* Ex
1b710 69 73 74 61 6e 63 65 20 6f 66 20 56 44 42 45 20  istance of VDBE 
1b720 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65  checked by calle
1b730 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72  r */.  if( pExpr
1b740 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e 3b  ==0 )    return;
1b750 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  ..  /* The value
1b760 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e   of pExpr->op an
1b770 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64  d op are related
1b780 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
1b790 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78  *.  **       pEx
1b7a0 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20  pr->op          
1b7b0 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20    op.  **       
1b7c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20  ---------       
1b7d0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20     ----------.  
1b7e0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55  **       TK_ISNU
1b7f0 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e  LL          OP_N
1b800 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  otNull.  **     
1b810 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20    TK_NOTNULL    
1b820 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20       OP_IsNull. 
1b830 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20   **       TK_NE 
1b840 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
1b850 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Eq.  **       TK
1b860 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20  _EQ             
1b870 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Ne.  **     
1b880 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20    TK_GT         
1b890 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20       OP_Le.  ** 
1b8a0 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20        TK_LE     
1b8b0 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20           OP_Gt. 
1b8c0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20   **       TK_GE 
1b8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
1b8e0 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Lt.  **       TK
1b8f0 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _LT             
1b900 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a   OP_Ge.  **.  **
1b910 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65   For other value
1b920 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20  s of pExpr->op, 
1b930 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  op is undefined 
1b940 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a  and unused..  **
1b950 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b   The value of TK
1b960 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
1b970 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64  nts are arranged
1b980 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20   such that we.  
1b990 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ** can compute t
1b9a0 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65  he mapping above
1b9b0 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f   using the follo
1b9c0 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e  wing expression.
1b9d0 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20  .  ** Assert()s 
1b9e0 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
1b9f0 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63  computation is c
1ba00 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f  orrect..  */.  o
1ba10 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b  p = ((pExpr->op+
1ba20 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31  (TK_ISNULL&1))^1
1ba30 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b  )-(TK_ISNULL&1);
1ba40 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f  ..  /* Verify co
1ba50 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20  rrect alignment 
1ba60 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63  of TK_ and OP_ c
1ba70 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20  onstants.  */.  
1ba80 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1ba90 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20  p!=TK_ISNULL || 
1baa0 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  op==OP_NotNull )
1bab0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1bac0 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c  r->op!=TK_NOTNUL
1bad0 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75  L || op==OP_IsNu
1bae0 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
1baf0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45  pExpr->op!=TK_NE
1bb00 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b   || op==OP_Eq );
1bb10 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1bb20 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f  ->op!=TK_EQ || o
1bb30 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73  p==OP_Ne );.  as
1bb40 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
1bb50 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LT || op==OP
1bb60 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ge );.  assert(
1bb70 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
1bb80 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29  E || op==OP_Gt )
1bb90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1bba0 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20  r->op!=TK_GT || 
1bbb0 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61  op==OP_Le );.  a
1bbc0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1bbd0 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GE || op==O
1bbe0 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63  P_Lt );..  switc
1bbf0 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
1bc00 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
1bc10 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1bc20 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1bc30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1bc40 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1bc50 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1bc60 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1bc70 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
1bc80 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
1bc90 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1bca0 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
1bcb0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
1bcc0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1bcd0 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
1bce0 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
1bcf0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1bd00 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74  l(v);.      test
1bd10 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1bd20 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1bd30 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
1bd40 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
1bd50 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
1bd60 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
1bd70 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d  ->pLeft, d2, jum
1bd80 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a  pIfNull^SQLITE_J
1bd90 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
1bda0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
1bdb0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
1bdc0 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
1bdd0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1bde0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1bdf0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1be00 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d2);.      sqlit
1be10 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
1be20 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20  Parse, 1);.     
1be30 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1be40 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
1be50 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1be60 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1be70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1be80 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
1be90 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1bea0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1beb0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1bec0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1bed0 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
1bee0 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
1bef0 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
1bf00 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
1bf10 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
1bf20 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 74 65  K_EQ: {.      te
1bf30 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
1bf40 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
1bf50 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29  ase( op==TK_LE )
1bf60 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1bf70 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20  ( op==TK_GT );. 
1bf80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1bf90 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20  p==TK_GE );.    
1bfa0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1bfb0 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74  TK_EQ );.      t
1bfc0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1bfd0 4e 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  NE );.      test
1bfe0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1bff0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ==0 );.      r1 
1c000 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1c010 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1c020 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1c030 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
1c040 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1c050 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1c060 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
1c070 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1c080 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
1c090 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1c0a0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1c0b0 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
1c0c0 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64         r1, r2, d
1c0d0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1c0e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1c0f0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1c100 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1c110 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
1c120 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c130 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
1c140 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
1c150 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  SNOT: {.      te
1c160 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
1c170 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20  p==TK_IS );.    
1c180 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
1c190 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20  r->op==TK_ISNOT 
1c1a0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1c1b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1c1c0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1c1d0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1c1e0 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
1c1f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1c200 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1c210 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
1c220 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d  ee2);.      op =
1c230 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f   (pExpr->op==TK_
1c240 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b  IS) ? TK_NE : TK
1c250 5f 45 51 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  _EQ;.      codeC
1c260 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
1c270 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
1c280 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
1c290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c2a0 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20    r1, r2, dest, 
1c2b0 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
1c2c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c2d0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1c2e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1c2f0 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
1c300 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c310 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
1c320 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
1c330 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
1c340 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1c350 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  TK_ISNULL );.   
1c360 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1c370 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20  =TK_NOTNULL );. 
1c380 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1c390 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1c3a0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1c3b0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1c3c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1c3d0 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72  eAddOp2(v, op, r
1c3e0 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  1, dest);.      
1c3f0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1c400 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e1==0 );.      b
1c410 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1c420 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
1c430 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1c440 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1c450 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f   );.      exprCo
1c460 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65  deBetween(pParse
1c470 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 30  , pExpr, dest, 0
1c480 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1c490 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c4a0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
1c4b0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75  : {.      if( ju
1c4c0 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  mpIfNull ){.    
1c4d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1c4e0 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
1c4f0 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29  xpr, dest, dest)
1c500 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1c510 20 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49         int destI
1c520 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56  fNull = sqlite3V
1c530 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1c540 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c550 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
1c560 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
1c570 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
1c580 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1c590 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1c5a0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
1c5b0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
1c5c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
1c5d0 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 31 20  ult: {.      r1 
1c5e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1c5f0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1c600 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b  xpr, &regFree1);
1c610 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1c620 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
1c630 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20  fNot, r1, dest, 
1c640 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
1c650 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c660 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1c670 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1c680 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1c690 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c6a0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
1c6b0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1c6c0 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
1c6d0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
1c6e0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1c6f0 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a  , regFree2);.}..
1c700 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20  /*.** Do a deep 
1c710 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77  comparison of tw
1c720 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  o expression tre
1c730 65 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  es.  Return 0 if
1c740 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72   the two.** expr
1c750 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70  essions are comp
1c760 6c 65 74 65 6c 79 20 69 64 65 6e 74 69 63 61 6c  letely identical
1c770 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
1c780 68 65 79 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a  hey differ only.
1c790 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54 45 20  ** by a COLLATE 
1c7a0 6f 70 65 72 61 74 6f 72 20 61 74 20 74 68 65 20  operator at the 
1c7b0 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65 74 75  top level.  Retu
1c7c0 72 6e 20 32 20 69 66 20 74 68 65 72 65 20 61 72  rn 2 if there ar
1c7d0 65 20 64 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a  e differences.**
1c7e0 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
1c7f0 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54  top-level COLLAT
1c800 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a  E operator..**.*
1c810 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73  * Sometimes this
1c820 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
1c830 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20 74  turn 2 even if t
1c840 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  he two expressio
1c850 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65  ns.** really are
1c860 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66   equivalent.  If
1c870 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65   we cannot prove
1c880 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
1c890 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65  sions are.** ide
1c8a0 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72  ntical, we retur
1c8b0 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20 73  n 2 just to be s
1c8c0 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73  afe.  So if this
1c8d0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
1c8e0 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75 20  rns 2, then you 
1c8f0 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e  do not really kn
1c900 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69  ow for certain i
1c910 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70  f the two.** exp
1c920 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65  ressions are the
1c930 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79   same.  But if y
1c940 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20 31 20  ou get a 0 or 1 
1c950 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75  return, then you
1c960 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20  .** can be sure 
1c970 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
1c980 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49  are the same.  I
1c990 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68 65  n the places whe
1c9a0 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
1c9b0 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20 64  ne is used, it d
1c9c0 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20  oes not hurt to 
1c9d0 67 65 74 20 61 6e 20 65 78 74 72 61 20 32 20 2d  get an extra 2 -
1c9e0 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69   that.** just mi
1c9f0 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f  ght result in so
1ca00 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77  me slightly slow
1ca10 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65  er code.  But re
1ca20 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e  turning.** an in
1ca30 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20 63  correct 0 or 1 c
1ca40 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d  ould lead to a m
1ca50 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  alfunction..*/.i
1ca60 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
1ca70 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20  mpare(Expr *pA, 
1ca80 45 78 70 72 20 2a 70 42 29 7b 0a 20 20 69 66 28  Expr *pB){.  if(
1ca90 20 70 41 3d 3d 30 7c 7c 70 42 3d 3d 30 20 29 7b   pA==0||pB==0 ){
1caa0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d  .    return pB==
1cab0 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a  pA ? 0 : 2;.  }.
1cac0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1cad0 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 41  asAnyProperty(pA
1cae0 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
1caf0 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
1cb00 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1cb10 41 6e 79 50 72 6f 70 65 72 74 79 28 70 42 2c 20  AnyProperty(pB, 
1cb20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
1cb30 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 69 66  Reduced) );.  if
1cb40 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1cb50 79 28 70 41 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pA, EP_xIsSele
1cb60 63 74 29 20 7c 7c 20 45 78 70 72 48 61 73 50 72  ct) || ExprHasPr
1cb70 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f 78 49  operty(pB, EP_xI
1cb80 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
1cb90 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20  return 2;.  }.  
1cba0 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26  if( (pA->flags &
1cbb0 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28   EP_Distinct)!=(
1cbc0 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pB->flags & EP_D
1cbd0 69 73 74 69 6e 63 74 29 20 29 20 72 65 74 75 72  istinct) ) retur
1cbe0 6e 20 32 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6f  n 2;.  if( pA->o
1cbf0 70 21 3d 70 42 2d 3e 6f 70 20 29 20 72 65 74 75  p!=pB->op ) retu
1cc00 72 6e 20 32 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 2;.  if( sqli
1cc10 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
1cc20 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c  A->pLeft, pB->pL
1cc30 65 66 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b  eft) ) return 2;
1cc40 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
1cc50 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52  prCompare(pA->pR
1cc60 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74  ight, pB->pRight
1cc70 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
1cc80 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
1cc90 69 73 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78  istCompare(pA->x
1cca0 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c  .pList, pB->x.pL
1ccb0 69 73 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b  ist) ) return 2;
1ccc0 0a 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c  .  if( pA->iTabl
1ccd0 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c  e!=pB->iTable ||
1cce0 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42   pA->iColumn!=pB
1ccf0 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75  ->iColumn ) retu
1cd00 72 6e 20 32 3b 0a 20 20 69 66 28 20 45 78 70 72  rn 2;.  if( Expr
1cd10 48 61 73 50 72 6f 70 65 72 74 79 28 70 41 2c 20  HasProperty(pA, 
1cd20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 7b 0a  EP_IntValue) ){.
1cd30 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
1cd40 50 72 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f  Property(pB, EP_
1cd50 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70 41 2d  IntValue) || pA-
1cd60 3e 75 2e 69 56 61 6c 75 65 21 3d 70 42 2d 3e 75  >u.iValue!=pB->u
1cd70 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20  .iValue ){.     
1cd80 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
1cd90 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 2d  .  }else if( pA-
1cda0 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op!=TK_COLUMN &
1cdb0 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  & pA->u.zToken )
1cdc0 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  {.    if( ExprHa
1cdd0 73 50 72 6f 70 65 72 74 79 28 70 42 2c 20 45 50  sProperty(pB, EP
1cde0 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 4e 45  _IntValue) || NE
1cdf0 56 45 52 28 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e  VER(pB->u.zToken
1ce00 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 32 3b  ==0) ) return 2;
1ce10 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1ce20 53 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e 7a 54  StrICmp(pA->u.zT
1ce30 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65  oken,pB->u.zToke
1ce40 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  n)!=0 ){.      r
1ce50 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20  eturn 2;.    }. 
1ce60 20 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c   }.  if( (pA->fl
1ce70 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
1ce80 61 74 65 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73  ate)!=(pB->flags
1ce90 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65   & EP_ExpCollate
1cea0 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
1ceb0 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26  if( (pA->flags &
1cec0 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 21   EP_ExpCollate)!
1ced0 3d 30 20 26 26 20 70 41 2d 3e 70 43 6f 6c 6c 21  =0 && pA->pColl!
1cee0 3d 70 42 2d 3e 70 43 6f 6c 6c 20 29 20 72 65 74  =pB->pColl ) ret
1cef0 75 72 6e 20 32 3b 0a 20 20 72 65 74 75 72 6e 20  urn 2;.  return 
1cf00 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  0;.}../*.** Comp
1cf10 61 72 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74  are two ExprList
1cf20 20 6f 62 6a 65 63 74 73 2e 20 20 52 65 74 75 72   objects.  Retur
1cf30 6e 20 30 20 69 66 20 74 68 65 79 20 61 72 65 20  n 0 if they are 
1cf40 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a  identical and .*
1cf50 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  * non-zero if th
1cf60 65 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79  ey differ in any
1cf70 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   way..**.** This
1cf80 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72   routine might r
1cf90 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66  eturn non-zero f
1cfa0 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 45 78  or equivalent Ex
1cfb0 70 72 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a  prLists.  The.**
1cfc0 20 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63   only consequenc
1cfd0 65 20 77 69 6c 6c 20 62 65 20 64 69 73 61 62 6c  e will be disabl
1cfe0 65 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  ed optimizations
1cff0 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74  .  But this rout
1d000 69 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65  ine.** must neve
1d010 72 20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68  r return 0 if th
1d020 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f  e two ExprList o
1d030 62 6a 65 63 74 73 20 61 72 65 20 64 69 66 66 65  bjects are diffe
1d040 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61  rent, or.** a ma
1d050 6c 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72  lfunction will r
1d060 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f  esult..**.** Two
1d070 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61   NULL pointers a
1d080 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  re considered to
1d090 20 62 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42   be the same.  B
1d0a0 75 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  ut a NULL pointe
1d0b0 72 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69 66 66  r.** always diff
1d0c0 65 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e  ers from a non-N
1d0d0 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  ULL pointer..*/.
1d0e0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4c  int sqlite3ExprL
1d0f0 69 73 74 43 6f 6d 70 61 72 65 28 45 78 70 72 4c  istCompare(ExprL
1d100 69 73 74 20 2a 70 41 2c 20 45 78 70 72 4c 69 73  ist *pA, ExprLis
1d110 74 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b  t *pB){.  int i;
1d120 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 26 26 20  .  if( pA==0 && 
1d130 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  pB==0 ) return 0
1d140 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c  ;.  if( pA==0 ||
1d150 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   pB==0 ) return 
1d160 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45 78  1;.  if( pA->nEx
1d170 70 72 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20  pr!=pB->nExpr ) 
1d180 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28  return 1;.  for(
1d190 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72  i=0; i<pA->nExpr
1d1a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
1d1b0 20 2a 70 45 78 70 72 41 20 3d 20 70 41 2d 3e 61   *pExprA = pA->a
1d1c0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 45  [i].pExpr;.    E
1d1d0 78 70 72 20 2a 70 45 78 70 72 42 20 3d 20 70 42  xpr *pExprB = pB
1d1e0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
1d1f0 20 20 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73    if( pA->a[i].s
1d200 6f 72 74 4f 72 64 65 72 21 3d 70 42 2d 3e 61 5b  ortOrder!=pB->a[
1d210 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72  i].sortOrder ) r
1d220 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28  eturn 1;.    if(
1d230 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
1d240 61 72 65 28 70 45 78 70 72 41 2c 20 70 45 78 70  are(pExprA, pExp
1d250 72 42 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  rB) ) return 1;.
1d260 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1d270 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
1d280 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
1d290 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  e pAggInfo->aCol
1d2a0 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
1d2b0 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
1d2c0 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
1d2d0 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
1d2e0 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
1d2f0 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
1d300 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
1d310 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c  ggInfoColumn(sql
1d320 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66  ite3 *db, AggInf
1d330 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  o *pInfo){.  int
1d340 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f   i;.  pInfo->aCo
1d350 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  l = sqlite3Array
1d360 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
1d370 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66   db,.       pInf
1d380 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20  o->aCol,.       
1d390 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43  sizeof(pInfo->aC
1d3a0 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33  ol[0]),.       3
1d3b0 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d  ,.       &pInfo-
1d3c0 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  >nColumn,.      
1d3d0 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e   &pInfo->nColumn
1d3e0 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26 69  Alloc,.       &i
1d3f0 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
1d400 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41  ;.}    ../*.** A
1d410 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
1d420 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f   to the pAggInfo
1d430 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e  ->aFunc[] array.
1d440 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
1d450 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
1d460 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
1d470 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
1d480 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
1d490 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
1d4a0 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e  nt addAggInfoFun
1d4b0 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  c(sqlite3 *db, A
1d4c0 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
1d4d0 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
1d4e0 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ->aFunc = sqlite
1d4f0 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
1d500 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20         db, .    
1d510 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c     pInfo->aFunc,
1d520 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  .       sizeof(p
1d530 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c  Info->aFunc[0]),
1d540 0a 20 20 20 20 20 20 20 33 2c 0a 20 20 20 20 20  .       3,.     
1d550 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c    &pInfo->nFunc,
1d560 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
1d570 6e 46 75 6e 63 41 6c 6c 6f 63 2c 0a 20 20 20 20  nFuncAlloc,.    
1d580 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74     &i.  );.  ret
1d590 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a  urn i;.}    ../*
1d5a0 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
1d5b0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f  xExprCallback fo
1d5c0 72 20 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e  r a tree walker.
1d5d0 20 20 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a    It is used to.
1d5e0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c  ** implement sql
1d5f0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
1d600 67 67 72 65 67 61 74 65 73 28 29 2e 20 20 53 65  ggregates().  Se
1d610 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  e sqlite3ExprAna
1d620 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a  lyzeAggregates.*
1d630 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  * for additional
1d640 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
1d650 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c  .static int anal
1d660 79 7a 65 41 67 67 72 65 67 61 74 65 28 57 61 6c  yzeAggregate(Wal
1d670 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
1d680 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e  pr *pExpr){.  in
1d690 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  t i;.  NameConte
1d6a0 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65  xt *pNC = pWalke
1d6b0 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73  r->u.pNC;.  Pars
1d6c0 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  e *pParse = pNC-
1d6d0 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69  >pParse;.  SrcLi
1d6e0 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70  st *pSrcList = p
1d6f0 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
1d700 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1d710 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66  o = pNC->pAggInf
1d720 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  o;..  switch( pE
1d730 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
1d740 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
1d750 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  N:.    case TK_C
1d760 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74  OLUMN: {.      t
1d770 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
1d780 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
1d790 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
1d7a0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
1d7b0 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
1d7c0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
1d7d0 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ee if the column
1d7e0 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68   is in one of th
1d7f0 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  e tables in the 
1d800 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c  FROM.      ** cl
1d810 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72  ause of the aggr
1d820 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20  egate query */. 
1d830 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
1d840 70 53 72 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a  pSrcList!=0) ){.
1d850 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53          struct S
1d860 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1d870 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61  em = pSrcList->a
1d880 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
1d890 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e  0; i<pSrcList->n
1d8a0 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
1d8b0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  +){.          st
1d8c0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
1d8d0 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20   *pCol;.        
1d8e0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1d8f0 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45  asAnyProperty(pE
1d900 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
1d910 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
1d920 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1d930 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49  Expr->iTable==pI
1d940 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a  tem->iCursor ){.
1d950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1d960 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
1d970 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20  point, it means 
1d980 74 68 61 74 20 70 45 78 70 72 20 72 65 66 65 72  that pExpr refer
1d990 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20  s to a table.   
1d9a0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74           ** that
1d9b0 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20   is in the FROM 
1d9c0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67  clause of the ag
1d9d0 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 20 20  gregate query.  
1d9e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a  .            **.
1d9f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d              ** M
1da00 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72  ake an entry for
1da10 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70   the column in p
1da20 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
1da30 69 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 20  if there.       
1da40 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61       ** is not a
1da50 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c  n entry there al
1da60 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20  ready..         
1da70 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1da80 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
1da90 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67       pCol = pAgg
1daa0 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  Info->aCol;.    
1dab0 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b          for(k=0;
1dac0 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   k<pAggInfo->nCo
1dad0 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b  lumn; k++, pCol+
1dae0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
1daf0 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62    if( pCol->iTab
1db00 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  le==pExpr->iTabl
1db10 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  e &&.           
1db20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f         pCol->iCo
1db30 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f  lumn==pExpr->iCo
1db40 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
1db50 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1db60 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1db70 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1db80 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e           if( (k>
1db90 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  =pAggInfo->nColu
1dba0 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn).            
1dbb0 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49   && (k = addAggI
1dbc0 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  nfoColumn(pParse
1dbd0 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29  ->db, pAggInfo))
1dbe0 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  >=0 .           
1dbf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1dc00 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e    pCol = &pAggIn
1dc10 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20  fo->aCol[k];.   
1dc20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
1dc30 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70  >pTab = pExpr->p
1dc40 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Tab;.           
1dc50 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20     pCol->iTable 
1dc60 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
1dc70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1dc80 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70  Col->iColumn = p
1dc90 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
1dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1dcb0 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  l->iMem = ++pPar
1dcc0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
1dcd0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
1dce0 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31  orterColumn = -1
1dcf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1dd00 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45  pCol->pExpr = pE
1dd10 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
1dd20 20 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d     if( pAggInfo-
1dd30 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20  >pGroupBy ){.   
1dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
1dd50 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20   j, n;.         
1dd60 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
1dd70 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d  *pGB = pAggInfo-
1dd80 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20  >pGroupBy;.     
1dd90 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63             struc
1dda0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
1ddb0 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b  *pTerm = pGB->a;
1ddc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ddd0 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b   n = pGB->nExpr;
1dde0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ddf0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a   for(j=0; j<n; j
1de00 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
1de10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de20 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d  Expr *pE = pTerm
1de30 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
1de40 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
1de50 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  E->op==TK_COLUMN
1de60 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d   && pE->iTable==
1de70 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26  pExpr->iTable &&
1de80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1de90 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75         pE->iColu
1dea0 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75  mn==pExpr->iColu
1deb0 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
1dec0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
1ded0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20  iSorterColumn = 
1dee0 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  j;.             
1def0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1df00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df10 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
1df20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1df30 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1df40 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72    if( pCol->iSor
1df50 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  terColumn<0 ){. 
1df60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1df70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
1df80 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  mn = pAggInfo->n
1df90 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b  SortingColumn++;
1dfa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1dfb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1dfc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1dfd0 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e  ere is now an en
1dfe0 74 72 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e  try for pExpr in
1dff0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
1e000 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20 20 20  ] (either.      
1e010 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65        ** because
1e020 20 69 74 20 77 61 73 20 74 68 65 72 65 20 62 65   it was there be
1e030 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65 20  fore or because 
1e040 77 65 20 6a 75 73 74 20 63 72 65 61 74 65 64 20  we just created 
1e050 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20  it)..           
1e060 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   ** Convert the 
1e070 70 45 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b  pExpr to be a TK
1e080 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65  _AGG_COLUMN refe
1e090 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20  rring to that.  
1e0a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67            ** pAg
1e0b0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e  gInfo->aCol[] en
1e0c0 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20  try..           
1e0d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1e0e0 45 78 70 72 53 65 74 49 72 72 65 64 75 63 69 62  ExprSetIrreducib
1e0f0 6c 65 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20  le(pExpr);.     
1e100 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41         pExpr->pA
1e110 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66  ggInfo = pAggInf
1e120 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  o;.            p
1e130 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47  Expr->op = TK_AG
1e140 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  G_COLUMN;.      
1e150 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
1e160 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20  g = (i16)k;.    
1e170 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1e180 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e           } /* en
1e190 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  dif pExpr->iTabl
1e1a0 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e==pItem->iCurso
1e1b0 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f  r */.        } /
1e1c0 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20  * end loop over 
1e1d0 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20  pSrcList */.    
1e1e0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
1e1f0 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
1e200 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
1e210 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
1e220 20 20 20 20 2f 2a 20 54 68 65 20 70 4e 43 2d 3e      /* The pNC->
1e230 6e 44 65 70 74 68 3d 3d 30 20 74 65 73 74 20 63  nDepth==0 test c
1e240 61 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20  auses aggregate 
1e250 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 73 75 62  functions in sub
1e260 71 75 65 72 69 65 73 0a 20 20 20 20 20 20 2a 2a  queries.      **
1e270 20 74 6f 20 62 65 20 69 67 6e 6f 72 65 64 20 2a   to be ignored *
1e280 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d  /.      if( pNC-
1e290 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20  >nDepth==0 ){.  
1e2a0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
1e2b0 6f 20 73 65 65 20 69 66 20 70 45 78 70 72 20 69  o see if pExpr i
1e2c0 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66  s a duplicate of
1e2d0 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61   another aggrega
1e2e0 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  te .        ** f
1e2f0 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20  unction that is 
1e300 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70  already in the p
1e310 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
1e320 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  e.        */.   
1e330 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
1e340 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20  nfo_func *pItem 
1e350 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  = pAggInfo->aFun
1e360 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  c;.        for(i
1e370 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
1e380 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65  nFunc; i++, pIte
1e390 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
1e3a0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
1e3b0 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45  ompare(pItem->pE
1e3c0 78 70 72 2c 20 70 45 78 70 72 29 3d 3d 30 20 29  xpr, pExpr)==0 )
1e3d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  {.            br
1e3e0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
1e3f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1e400 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e     if( i>=pAggIn
1e410 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20  fo->nFunc ){.   
1e420 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20         /* pExpr 
1e430 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61  is original.  Ma
1e440 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ke a new entry i
1e450 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  n pAggInfo->aFun
1e460 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  c[].          */
1e470 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65 6e  .          u8 en
1e480 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e  c = ENC(pParse->
1e490 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  db);.          i
1e4a0 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e   = addAggInfoFun
1e4b0 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41  c(pParse->db, pA
1e4c0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ggInfo);.       
1e4d0 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20     if( i>=0 ){. 
1e4e0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
1e4f0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1e500 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
1e510 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
1e520 20 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20          pItem = 
1e530 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  &pAggInfo->aFunc
1e540 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [i];.           
1e550 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20   pItem->pExpr = 
1e560 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
1e570 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d     pItem->iMem =
1e580 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1e590 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
1e5a0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1e5b0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1e5c0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1e5d0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
1e5e0 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46  pFunc = sqlite3F
1e5f0 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
1e600 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  se->db,.        
1e610 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1e620 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 73 71 6c 69  ->u.zToken, sqli
1e630 74 65 33 53 74 72 6c 65 6e 33 30 28 70 45 78 70  te3Strlen30(pExp
1e640 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2c 0a 20 20  r->u.zToken),.  
1e650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e660 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20   pExpr->x.pList 
1e670 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ? pExpr->x.pList
1e680 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63  ->nExpr : 0, enc
1e690 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
1e6a0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
1e6b0 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
1e6c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e6d0 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e    pItem->iDistin
1e6e0 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
1e6f0 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b++;.           
1e700 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e710 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69        pItem->iDi
1e720 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
1e730 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e740 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1e750 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  .        /* Make
1e760 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20   pExpr point to 
1e770 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
1e780 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
1e790 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20  ] entry.        
1e7a0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
1e7b0 74 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72  t( !ExprHasAnyPr
1e7c0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1e7d0 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
1e7e0 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20  duced) );.      
1e7f0 20 20 45 78 70 72 53 65 74 49 72 72 65 64 75 63    ExprSetIrreduc
1e800 69 62 6c 65 28 70 45 78 70 72 29 3b 0a 20 20 20  ible(pExpr);.   
1e810 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
1e820 20 3d 20 28 69 31 36 29 69 3b 0a 20 20 20 20 20   = (i16)i;.     
1e830 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e     pExpr->pAggIn
1e840 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20  fo = pAggInfo;. 
1e850 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
1e860 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d  C_Prune;.      }
1e870 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1e880 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
1e890 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61  ;.}.static int a
1e8a0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
1e8b0 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65 72 20  InSelect(Walker 
1e8c0 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
1e8d0 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 4e 61   *pSelect){.  Na
1e8e0 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d  meContext *pNC =
1e8f0 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b   pWalker->u.pNC;
1e900 0a 20 20 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70  .  if( pNC->nDep
1e910 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 43  th==0 ){.    pNC
1e920 2d 3e 6e 44 65 70 74 68 2b 2b 3b 0a 20 20 20 20  ->nDepth++;.    
1e930 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
1e940 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 65  t(pWalker, pSele
1e950 63 74 29 3b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44  ct);.    pNC->nD
1e960 65 70 74 68 2d 2d 3b 0a 20 20 20 20 72 65 74 75  epth--;.    retu
1e970 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
1e980 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
1e990 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
1e9a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61    }.}../*.** Ana
1e9b0 6c 79 7a 65 20 74 68 65 20 67 69 76 65 6e 20 65  lyze the given e
1e9c0 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e  xpression lookin
1e9d0 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  g for aggregate 
1e9e0 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a  functions and.**
1e9f0 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74   for variables t
1ea00 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61  hat need to be a
1ea10 64 64 65 64 20 74 6f 20 74 68 65 20 70 50 61 72  dded to the pPar
1ea20 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79  se->aAgg[] array
1ea30 2e 0a 2a 2a 20 4d 61 6b 65 20 61 64 64 69 74 69  ..** Make additi
1ea40 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 74 6f 20  onal entries to 
1ea50 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67  the pParse->aAgg
1ea60 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63 65  [] array as nece
1ea70 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ssary..**.** Thi
1ea80 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
1ea90 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
1eaa0 61 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73  after the expres
1eab0 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a  sion has been.**
1eac0 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c   analyzed by sql
1ead0 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
1eae0 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  ames()..*/.void 
1eaf0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
1eb00 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d  zeAggregates(Nam
1eb10 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
1eb20 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57  xpr *pExpr){.  W
1eb30 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78  alker w;.  w.xEx
1eb40 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61  prCallback = ana
1eb50 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20  lyzeAggregate;. 
1eb60 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
1eb70 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72  ck = analyzeAggr
1eb80 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a  egatesInSelect;.
1eb90 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b    w.u.pNC = pNC;
1eba0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e  .  assert( pNC->
1ebb0 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20  pSrcList!=0 );. 
1ebc0 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
1ebd0 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a  (&w, pExpr);.}..
1ebe0 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74  /*.** Call sqlit
1ebf0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
1ec00 72 65 67 61 74 65 73 28 29 20 66 6f 72 20 65 76  regates() for ev
1ec10 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
1ec20 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  n an.** expressi
1ec30 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  on list.  Return
1ec40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
1ec50 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rrors..**.** If 
1ec60 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e  an error is foun
1ec70 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20  d, the analysis 
1ec80 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f  is cut short..*/
1ec90 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1eca0 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
1ecb0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
1ecc0 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
1ecd0 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  t){.  struct Exp
1ece0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
1ecf0 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  m;.  int i;.  if
1ed00 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
1ed10 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
1ed20 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
1ed30 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
1ed40 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c  em++){.      sql
1ed50 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
1ed60 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70  ggregates(pNC, p
1ed70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
1ed80 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1ed90 20 41 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67   Allocate a sing
1eda0 6c 65 20 6e 65 77 20 72 65 67 69 73 74 65 72 20  le new register 
1edb0 66 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20  for use to hold 
1edc0 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74  some intermediat
1edd0 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74  e result..*/.int
1ede0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1edf0 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eg(Parse *pParse
1ee00 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
1ee10 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a  >nTempReg==0 ){.
1ee20 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61      return ++pPa
1ee30 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20  rse->nMem;.  }. 
1ee40 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e   return pParse->
1ee50 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73  aTempReg[--pPars
1ee60 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a  e->nTempReg];.}.
1ee70 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
1ee80 65 20 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61  e a register, ma
1ee90 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66  king available f
1eea0 6f 72 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d  or reuse for som
1eeb0 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f  e other.** purpo
1eec0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72  se..**.** If a r
1eed0 65 67 69 73 74 65 72 20 69 73 20 63 75 72 72 65  egister is curre
1eee0 6e 74 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20  ntly being used 
1eef0 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  by the column ca
1ef00 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  che, then.** the
1ef10 20 64 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20   dallocation is 
1ef20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74  deferred until t
1ef30 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
1ef40 6c 69 6e 65 20 74 68 61 74 20 75 73 65 73 0a 2a  line that uses.*
1ef50 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20 62  * the register b
1ef60 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f  ecomes stale..*/
1ef70 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c  .void sqlite3Rel
1ef80 65 61 73 65 54 65 6d 70 52 65 67 28 50 61 72 73  easeTempReg(Pars
1ef90 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
1efa0 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67  Reg){.  if( iReg
1efb0 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d   && pParse->nTem
1efc0 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70  pReg<ArraySize(p
1efd0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29  Parse->aTempReg)
1efe0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
1eff0 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61     struct yColCa
1f000 63 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  che *p;.    for(
1f010 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
1f020 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
1f030 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
1f040 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20  ++, p++){.      
1f050 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65  if( p->iReg==iRe
1f060 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  g ){.        p->
1f070 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20 20  tempReg = 1;.   
1f080 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
1f090 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1f0a0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
1f0b0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
1f0c0 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a  ++] = iReg;.  }.
1f0d0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
1f0e0 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20  e or deallocate 
1f0f0 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20  a block of nReg 
1f100 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69  consecutive regi
1f110 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sters.*/.int sql
1f120 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
1f130 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1f140 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74  int nReg){.  int
1f150 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61   i, n;.  i = pPa
1f160 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a  rse->iRangeReg;.
1f170 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52    n = pParse->nR
1f180 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e  angeReg;.  if( n
1f190 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73  Reg<=n ){.    as
1f1a0 73 65 72 74 28 20 21 75 73 65 64 41 73 43 6f 6c  sert( !usedAsCol
1f1b0 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c  umnCache(pParse,
1f1c0 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20   i, i+n-1) );.  
1f1d0 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65    pParse->iRange
1f1e0 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20  Reg += nReg;.   
1f1f0 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
1f200 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65  eg -= nReg;.  }e
1f210 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61  lse{.    i = pPa
1f220 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
1f230 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
1f240 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74   nReg;.  }.  ret
1f250 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71  urn i;.}.void sq
1f260 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1f270 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
1f280 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69  rse, int iReg, i
1f290 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73 71 6c 69  nt nReg){.  sqli
1f2a0 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
1f2b0 76 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c  ve(pParse, iReg,
1f2c0 20 6e 52 65 67 29 3b 0a 20 20 69 66 28 20 6e 52   nReg);.  if( nR
1f2d0 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  eg>pParse->nRang
1f2e0 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72  eReg ){.    pPar
1f2f0 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
1f300 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65  nReg;.    pParse
1f310 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52  ->iRangeReg = iR
1f320 65 67 3b 0a 20 20 7d 0a 7d 0a                    eg;.  }.}.