/ Hex Artifact Content
Login

Artifact fd54c517869919c9b0b11dcadd43c66540ffa682:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 73   clause expresss
0370: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0380: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0390: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
03a0: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
03b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
03c0: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
03d0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
03e0: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
03f0: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0400: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
0410: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
0420: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
0430: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
0440: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
0450: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
0460: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
0470: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  .  if( op==TK_SE
0480: 4c 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65  LECT ){.    asse
0490: 72 74 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  rt( pExpr->flags
04a0: 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b  &EP_xIsSelect );
04b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
04c0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
04d0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
04e0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
04f0: 45 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  Expr);.  }.#ifnd
0500: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
0510: 41 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  AST.  if( op==TK
0520: 5f 43 41 53 54 20 29 7b 0a 20 20 20 20 61 73 73  _CAST ){.    ass
0530: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
0540: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
0550: 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
0560: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41   return sqlite3A
0570: 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70  ffinityType(pExp
0580: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
0590: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 28  }.#endif.  if( (
05a0: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
05b0: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  N || op==TK_COLU
05c0: 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47  MN || op==TK_REG
05d0: 49 53 54 45 52 29 20 0a 20 20 20 26 26 20 70 45  ISTER) .   && pE
05e0: 78 70 72 2d 3e 70 54 61 62 21 3d 30 0a 20 20 29  xpr->pTab!=0.  )
05f0: 7b 0a 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f  {.    /* op==TK_
0600: 52 45 47 49 53 54 45 52 20 26 26 20 70 45 78 70  REGISTER && pExp
0610: 72 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65  r->pTab!=0 happe
0620: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
0630: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
0640: 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20   ** a TK_COLUMN 
0650: 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  but was previous
0660: 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  ly evaluated and
0670: 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67   cached in a reg
0680: 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  ister */.    int
0690: 20 6a 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c   j = pExpr->iCol
06a0: 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30  umn;.    if( j<0
06b0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
06c0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
06d0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
06e0: 3e 70 54 61 62 20 26 26 20 6a 3c 70 45 78 70 72  >pTab && j<pExpr
06f0: 2d 3e 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  ->pTab->nCol );.
0700: 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
0710: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
0720: 61 66 66 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20  affinity;.  }.  
0730: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66  return pExpr->af
0740: 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  finity;.}../*.**
0750: 20 53 65 74 20 74 68 65 20 65 78 70 6c 69 63 69   Set the explici
0760: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
0770: 65 6e 63 65 20 66 6f 72 20 61 6e 20 65 78 70 72  ence for an expr
0780: 65 73 73 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a  ession to the.**
0790: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
07a0: 6e 63 65 20 73 75 70 70 6c 69 65 64 20 69 6e 20  nce supplied in 
07b0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
07c0: 65 6e 74 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ent..*/.Expr *sq
07d0: 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f 6c 6c  lite3ExprSetColl
07e0: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 43 6f  (Expr *pExpr, Co
07f0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
0800: 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70 43   if( pExpr && pC
0810: 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 45 78 70 72  oll ){.    pExpr
0820: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b  ->pColl = pColl;
0830: 0a 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67  .    pExpr->flag
0840: 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61  s |= EP_ExpColla
0850: 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  te;.  }.  return
0860: 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pExpr;.}../*.**
0870: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
0880: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
0890: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
08a0: 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61   to be the colla
08b0: 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
08c0: 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e   named by pToken
08d0: 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .   Return a poi
08e0: 6e 74 65 72 20 74 6f 20 74 68 65 20 72 65 76 69  nter to the revi
08f0: 73 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  sed expression..
0900: 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** The collating
0910: 20 73 65 71 75 65 6e 63 65 20 69 73 20 6d 61 72   sequence is mar
0920: 6b 65 64 20 61 73 20 22 65 78 70 6c 69 63 69 74  ked as "explicit
0930: 22 20 75 73 69 6e 67 20 74 68 65 20 45 50 5f 45  " using the EP_E
0940: 78 70 43 6f 6c 6c 61 74 65 0a 2a 2a 20 66 6c 61  xpCollate.** fla
0950: 67 2e 20 20 41 6e 20 65 78 70 6c 69 63 69 74 20  g.  An explicit 
0960: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0970: 63 65 20 77 69 6c 6c 20 6f 76 65 72 72 69 64 65  ce will override
0980: 20 69 6d 70 6c 69 63 69 74 0a 2a 2a 20 63 6f 6c   implicit.** col
0990: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
09a0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
09b0: 65 33 45 78 70 72 53 65 74 43 6f 6c 6c 42 79 54  e3ExprSetCollByT
09c0: 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72  oken(Parse *pPar
09d0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
09e0: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d   Token *pCollNam
09f0: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c  e){.  char *zCol
0a00: 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
0a10: 20 20 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61    /* Dequoted na
0a20: 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20  me of collation 
0a30: 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 43 6f  sequence */.  Co
0a40: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
0a50: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
0a60: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c  arse->db;.  zCol
0a70: 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
0a80: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 43 6f  romToken(db, pCo
0a90: 6c 6c 4e 61 6d 65 29 3b 0a 20 20 70 43 6f 6c 6c  llName);.  pColl
0aa0: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
0ab0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
0ac0: 7a 43 6f 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65  zColl);.  sqlite
0ad0: 33 45 78 70 72 53 65 74 43 6f 6c 6c 28 70 45 78  3ExprSetColl(pEx
0ae0: 70 72 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 73 71  pr, pColl);.  sq
0af0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
0b00: 7a 43 6f 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e  zColl);.  return
0b10: 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pExpr;.}../*.**
0b20: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66 61   Return the defa
0b30: 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ult collation se
0b40: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65  quence for the e
0b50: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
0b60: 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20   If.** there is 
0b70: 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  no default colla
0b80: 74 69 6f 6e 20 74 79 70 65 2c 20 72 65 74 75 72  tion type, retur
0b90: 6e 20 30 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  n 0..*/.CollSeq 
0ba0: 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c  *sqlite3ExprColl
0bb0: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
0bc0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
0bd0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
0be0: 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 70  l = 0;.  Expr *p
0bf0: 20 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69 6c   = pExpr;.  whil
0c00: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  e( p ){.    int 
0c10: 6f 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  op;.    pColl = 
0c20: 70 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 66  p->pColl;.    if
0c30: 28 20 70 43 6f 6c 6c 20 29 20 62 72 65 61 6b 3b  ( pColl ) break;
0c40: 0a 20 20 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b  .    op = p->op;
0c50: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 54 61 62  .    if( p->pTab
0c60: 21 3d 30 20 26 26 20 28 0a 20 20 20 20 20 20 20  !=0 && (.       
0c70: 20 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55   op==TK_AGG_COLU
0c80: 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c  MN || op==TK_COL
0c90: 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45  UMN || op==TK_RE
0ca0: 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b  GISTER || op==TK
0cb0: 5f 54 52 49 47 47 45 52 0a 20 20 20 20 29 29 7b  _TRIGGER.    )){
0cc0: 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b  .      /* op==TK
0cd0: 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e  _REGISTER && p->
0ce0: 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20  pTab!=0 happens 
0cf0: 77 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f  when pExpr was o
0d00: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20  riginally.      
0d10: 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62  ** a TK_COLUMN b
0d20: 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ut was previousl
0d30: 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  y evaluated and 
0d40: 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69  cached in a regi
0d50: 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f  ster */.      co
0d60: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b  nst char *zColl;
0d70: 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70  .      int j = p
0d80: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
0d90: 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20   if( j>=0 ){.   
0da0: 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
0db0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
0dc0: 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70         zColl = p
0dd0: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
0de0: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  zColl;.        p
0df0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
0e00: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
0e10: 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29  C(db), zColl, 0)
0e20: 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
0e30: 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a  >pColl = pColl;.
0e40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
0e50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
0e60: 66 28 20 6f 70 21 3d 54 4b 5f 43 41 53 54 20 26  f( op!=TK_CAST &
0e70: 26 20 6f 70 21 3d 54 4b 5f 55 50 4c 55 53 20 29  & op!=TK_UPLUS )
0e80: 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
0e90: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
0ea0: 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pLeft;.  }.  if(
0eb0: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c   sqlite3CheckCol
0ec0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f  lSeq(pParse, pCo
0ed0: 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c  ll) ){ .    pCol
0ee0: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  l = 0;.  }.  ret
0ef0: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a  urn pColl;.}../*
0f00: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20  .** pExpr is an 
0f10: 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d  operand of a com
0f20: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
0f30: 2e 20 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a  .  aff2 is the.*
0f40: 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20  * type affinity 
0f50: 6f 66 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65  of the other ope
0f60: 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74  rand.  This rout
0f70: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a  ine returns the.
0f80: 2a 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74 79  ** type affinity
0f90: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
0fa0: 75 73 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d  used for the com
0fb0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
0fc0: 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65  ..*/.char sqlite
0fd0: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
0fe0: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68  (Expr *pExpr, ch
0ff0: 61 72 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72  ar aff2){.  char
1000: 20 61 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45   aff1 = sqlite3E
1010: 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70  xprAffinity(pExp
1020: 72 29 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26  r);.  if( aff1 &
1030: 26 20 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a  & aff2 ){.    /*
1040: 20 42 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74   Both sides of t
1050: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72  he comparison ar
1060: 65 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e  e columns. If on
1070: 65 20 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20  e has numeric.  
1080: 20 20 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75    ** affinity, u
1090: 73 65 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69  se that. Otherwi
10a0: 73 65 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69  se use no affini
10b0: 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ty..    */.    i
10c0: 66 28 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  f( sqlite3IsNume
10d0: 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 31  ricAffinity(aff1
10e0: 29 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75  ) || sqlite3IsNu
10f0: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 61 66  mericAffinity(af
1100: 66 32 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  f2) ){.      ret
1110: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  urn SQLITE_AFF_N
1120: 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73  UMERIC;.    }els
1130: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
1140: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1150: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
1160: 66 28 20 21 61 66 66 31 20 26 26 20 21 61 66 66  f( !aff1 && !aff
1170: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74  2 ){.    /* Neit
1180: 68 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 20  her side of the 
1190: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20  comparison is a 
11a0: 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65  column.  Compare
11b0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75   the.    ** resu
11c0: 6c 74 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20  lts directly..  
11d0: 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20    */.    return 
11e0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
11f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1200: 20 4f 6e 65 20 73 69 64 65 20 69 73 20 61 20 63   One side is a c
1210: 6f 6c 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72  olumn, the other
1220: 20 69 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65   is not. Use the
1230: 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74   columns affinit
1240: 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  y. */.    assert
1250: 28 20 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66  ( aff1==0 || aff
1260: 32 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  2==0 );.    retu
1270: 72 6e 20 28 61 66 66 31 20 2b 20 61 66 66 32 29  rn (aff1 + aff2)
1280: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  ;.  }.}../*.** p
1290: 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72  Expr is a compar
12a0: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20  ison operator.  
12b0: 52 65 74 75 72 6e 20 74 68 65 20 74 79 70 65 20  Return the type 
12c0: 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68  affinity that sh
12d0: 6f 75 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69  ould.** be appli
12e0: 65 64 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61  ed to both opera
12f0: 6e 64 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69  nds prior to doi
1300: 6e 67 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  ng the compariso
1310: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  n..*/.static cha
1320: 72 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69  r comparisonAffi
1330: 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72  nity(Expr *pExpr
1340: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20  ){.  char aff;. 
1350: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1360: 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78  op==TK_EQ || pEx
1370: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c  pr->op==TK_IN ||
1380: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
1390: 54 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70  T ||.          p
13a0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20  Expr->op==TK_GT 
13b0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
13c0: 5f 47 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _GE || pExpr->op
13d0: 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20  ==TK_LE ||.     
13e0: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d       pExpr->op==
13f0: 54 4b 5f 4e 45 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_NE || pExpr->
1400: 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78  op==TK_IS || pEx
1410: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
1420: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1430: 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20  xpr->pLeft );.  
1440: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70  aff = sqlite3Exp
1450: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  rAffinity(pExpr-
1460: 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70  >pLeft);.  if( p
1470: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a  Expr->pRight ){.
1480: 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
1490: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
14a0: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  (pExpr->pRight, 
14b0: 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  aff);.  }else if
14c0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
14d0: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
14e0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 61 66  elect) ){.    af
14f0: 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
1500: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
1510: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
1520: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
1530: 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69   aff);.  }else i
1540: 66 28 20 21 61 66 66 20 29 7b 0a 20 20 20 20 61  f( !aff ){.    a
1550: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
1560: 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75  NONE;.  }.  retu
1570: 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aff;.}../*.**
1580: 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70   pExpr is a comp
1590: 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f  arison expressio
15a0: 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c  n, eg. '=', '<',
15b0: 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a   IN(...) etc..**
15c0: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73   idx_affinity is
15d0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
15e0: 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   an indexed colu
15f0: 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a  mn. Return true.
1600: 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ** if the index 
1610: 77 69 74 68 20 61 66 66 69 6e 69 74 79 20 69 64  with affinity id
1620: 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62  x_affinity may b
1630: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
1640: 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61  ent.** the compa
1650: 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a  rison in pExpr..
1660: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
1670: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78  dexAffinityOk(Ex
1680: 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20  pr *pExpr, char 
1690: 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20  idx_affinity){. 
16a0: 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70   char aff = comp
16b0: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70  arisonAffinity(p
16c0: 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28  Expr);.  switch(
16d0: 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65   aff ){.    case
16e0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
16f0: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  :.      return 1
1700: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1710: 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20  E_AFF_TEXT:.    
1720: 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66    return idx_aff
1730: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
1740: 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61  F_TEXT;.    defa
1750: 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
1760: 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  n sqlite3IsNumer
1770: 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61  icAffinity(idx_a
1780: 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a  ffinity);.  }.}.
1790: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
17a0: 65 20 50 35 20 76 61 6c 75 65 20 74 68 61 74 20  e P5 value that 
17b0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
17c0: 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70  or a binary comp
17d0: 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65  arison.** opcode
17e0: 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65   (OP_Eq, OP_Ge e
17f0: 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d  tc.) used to com
1800: 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64 20  pare pExpr1 and 
1810: 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74 69  pExpr2..*/.stati
1820: 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61  c u8 binaryCompa
1830: 72 65 50 35 28 45 78 70 72 20 2a 70 45 78 70 72  reP5(Expr *pExpr
1840: 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c  1, Expr *pExpr2,
1850: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
1860: 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28 63 68  {.  u8 aff = (ch
1870: 61 72 29 73 71 6c 69 74 65 33 45 78 70 72 41 66  ar)sqlite3ExprAf
1880: 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a  finity(pExpr2);.
1890: 20 20 61 66 66 20 3d 20 28 75 38 29 73 71 6c 69    aff = (u8)sqli
18a0: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
18b0: 74 79 28 70 45 78 70 72 31 2c 20 61 66 66 29 20  ty(pExpr1, aff) 
18c0: 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c 6c  | (u8)jumpIfNull
18d0: 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  ;.  return aff;.
18e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
18f0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1900: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1910: 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  nce that should 
1920: 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20  be used by.** a 
1930: 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f  binary compariso
1940: 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61  n operator compa
1950: 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70  ring pLeft and p
1960: 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Right..**.** If 
1970: 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78  the left hand ex
1980: 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63  pression has a c
1990: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
19a0: 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20  e type, then it 
19b0: 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65  is.** used. Othe
19c0: 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  rwise the collat
19d0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
19e0: 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20   the right hand 
19f0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
1a00: 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65   used, or the de
1a10: 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69  fault (BINARY) i
1a20: 66 20 6e 65 69 74 68 65 72 20 65 78 70 72 65 73  f neither expres
1a30: 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61  sion has a colla
1a40: 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a  ting.** type..**
1a50: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69  .** Argument pRi
1a60: 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65  ght (but not pLe
1a70: 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c  ft) may be a nul
1a80: 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68  l pointer. In th
1a90: 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69  is case,.** it i
1aa0: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
1ab0: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
1ac0: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
1ad0: 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72  reCollSeq(.  Par
1ae0: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45  se *pParse, .  E
1af0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45  xpr *pLeft, .  E
1b00: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
1b10: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
1b20: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74  .  assert( pLeft
1b30: 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d   );.  if( pLeft-
1b40: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
1b50: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 61 73  ollate ){.    as
1b60: 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 70 43 6f  sert( pLeft->pCo
1b70: 6c 6c 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  ll );.    pColl 
1b80: 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a  = pLeft->pColl;.
1b90: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
1ba0: 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 66 6c  ht && pRight->fl
1bb0: 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
1bc0: 61 74 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ate ){.    asser
1bd0: 74 28 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c  t( pRight->pColl
1be0: 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20   );.    pColl = 
1bf0: 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20  pRight->pColl;. 
1c00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c   }else{.    pCol
1c10: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
1c20: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1c30: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21  Left);.    if( !
1c40: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
1c50: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1c60: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
1c70: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  , pRight);.    }
1c80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
1c90: 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  oll;.}../*.** Ge
1ca0: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1cb0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1cc0: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
1cd0: 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65   int codeCompare
1ce0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1cf0: 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  e,    /* The par
1d00: 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67  sing (and code g
1d10: 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65  enerating) conte
1d20: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  xt */.  Expr *pL
1d30: 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  eft,      /* The
1d40: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
1d50: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
1d60: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
1d70: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  t operand */.  i
1d80: 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20  nt opcode,      
1d90: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73   /* The comparis
1da0: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  on opcode */.  i
1db0: 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c  nt in1, int in2,
1dc0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
1dd0: 64 69 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f  ding operands */
1de0: 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
1df0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
1e00: 65 20 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20  e if true.  */. 
1e10: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   int jumpIfNull 
1e20: 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a     /* If true, j
1e30: 75 6d 70 20 69 66 20 65 69 74 68 65 72 20 6f 70  ump if either op
1e40: 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f  erand is NULL */
1e50: 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20  .){.  int p5;.  
1e60: 69 6e 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c  int addr;.  Coll
1e70: 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d  Seq *p4;..  p4 =
1e80: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
1e90: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
1ea0: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
1eb0: 68 74 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61  ht);.  p5 = bina
1ec0: 72 79 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66  ryCompareP5(pLef
1ed0: 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49  t, pRight, jumpI
1ee0: 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d  fNull);.  addr =
1ef0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f00: 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p4(pParse->pVdbe
1f10: 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64  , opcode, in2, d
1f20: 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20  est, in1,.      
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f40: 20 20 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20       (void*)p4, 
1f50: 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73  P4_COLLSEQ);.  s
1f60: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1f70: 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  P5(pParse->pVdbe
1f80: 2c 20 28 75 38 29 70 35 29 3b 0a 20 20 72 65 74  , (u8)p5);.  ret
1f90: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23 69 66  urn addr;.}..#if
1fa0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
1fb0: 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43  _DEPTH>0./*.** C
1fc0: 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65  heck that argume
1fd0: 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65  nt nHeight is le
1fe0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
1ff0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a   to the maximum.
2000: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65  ** expression de
2010: 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20  pth allowed. If 
2020: 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65  it is not, leave
2030: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2040: 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a  e in.** pParse..
2050: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2060: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50 61  prCheckHeight(Pa
2070: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2080: 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74   nHeight){.  int
2090: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20a0: 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20  .  int mxHeight 
20b0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c  = pParse->db->aL
20c0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
20d0: 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20  T_EXPR_DEPTH];. 
20e0: 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48   if( nHeight>mxH
20f0: 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c  eight ){.    sql
2100: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2110: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78  rse, .       "Ex
2120: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73  pression tree is
2130: 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69   too large (maxi
2140: 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20  mum depth %d)", 
2150: 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a  mxHeight.    );.
2160: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2170: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
2180: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68  urn rc;.}../* Th
2190: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  e following thre
21a0: 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69  e functions, hei
21b0: 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69  ghtOfExpr(), hei
21c0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a  ghtOfExprList().
21d0: 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53  ** and heightOfS
21e0: 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73 65  elect(), are use
21f0: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
2200: 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68  he maximum heigh
2210: 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72  t.** of any expr
2220: 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65  ession tree refe
2230: 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 74  renced by the st
2240: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
2250: 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61  s the.** first a
2260: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
2270: 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68  f this maximum h
2280: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
2290: 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
22a0: 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a  t value pointed.
22b0: 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68  ** to by pnHeigh
22c0: 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  t, the second pa
22d0: 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65  rameter, then se
22e0: 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74  t *pnHeight to t
22f0: 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f  hat.** value..*/
2300: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
2310: 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a  ghtOfExpr(Expr *
2320: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
2330: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
2340: 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74    if( p->nHeight
2350: 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20  >*pnHeight ){.  
2360: 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20      *pnHeight = 
2370: 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20  p->nHeight;.    
2380: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
2390: 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72  oid heightOfExpr
23a0: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
23b0: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
23c0: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
23d0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
23e0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
23f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69   i++){.      hei
2400: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69  ghtOfExpr(p->a[i
2410: 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68  ].pExpr, pnHeigh
2420: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
2430: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
2440: 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63  htOfSelect(Selec
2450: 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69  t *p, int *pnHei
2460: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ght){.  if( p ){
2470: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2480: 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48  r(p->pWhere, pnH
2490: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
24a0: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76  htOfExpr(p->pHav
24b0: 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ing, pnHeight);.
24c0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
24d0: 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65  (p->pLimit, pnHe
24e0: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
24f0: 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66 66 73  tOfExpr(p->pOffs
2500: 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  et, pnHeight);. 
2510: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
2520: 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70  ist(p->pEList, p
2530: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2540: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
2550: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48 65  ->pGroupBy, pnHe
2560: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
2570: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  tOfExprList(p->p
2580: 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67 68  OrderBy, pnHeigh
2590: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
25a0: 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f 72  Select(p->pPrior
25b0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  , pnHeight);.  }
25c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
25d0: 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76  e Expr.nHeight v
25e0: 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65 20 73  ariable in the s
25f0: 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
2600: 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65  as an .** argume
2610: 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73 69 6f  nt. An expressio
2620: 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c 64 72  n with no childr
2630: 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74 20 6f  en, Expr.pList o
2640: 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65  r .** Expr.pSele
2650: 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20 61 20  ct member has a 
2660: 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41 6e 79  height of 1. Any
2670: 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
2680: 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69 67 68  n.** has a heigh
2690: 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d  t equal to the m
26a0: 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66  aximum height of
26b0: 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72   any other .** r
26c0: 65 66 65 72 65 6e 63 65 64 20 45 78 70 72 20 70  eferenced Expr p
26d0: 6c 75 73 20 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74  lus one..*/.stat
26e0: 69 63 20 76 6f 69 64 20 65 78 70 72 53 65 74 48  ic void exprSetH
26f0: 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a  eight(Expr *p){.
2700: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
2710: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70  0;.  heightOfExp
2720: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65  r(p->pLeft, &nHe
2730: 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f  ight);.  heightO
2740: 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c  fExpr(p->pRight,
2750: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 69 66   &nHeight);.  if
2760: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
2770: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
2780: 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74  t) ){.    height
2790: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53  OfSelect(p->x.pS
27a0: 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29  elect, &nHeight)
27b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68  ;.  }else{.    h
27c0: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
27d0: 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65  p->x.pList, &nHe
27e0: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ight);.  }.  p->
27f0: 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68  nHeight = nHeigh
2800: 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t + 1;.}../*.** 
2810: 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65  Set the Expr.nHe
2820: 69 67 68 74 20 76 61 72 69 61 62 6c 65 20 75 73  ight variable us
2830: 69 6e 67 20 74 68 65 20 65 78 70 72 53 65 74 48  ing the exprSetH
2840: 65 69 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e  eight() function
2850: 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67  . If.** the heig
2860: 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ht is greater th
2870: 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  an the maximum a
2880: 6c 6c 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f  llowed expressio
2890: 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76  n depth,.** leav
28a0: 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  e an error in pP
28b0: 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  arse..*/.void sq
28c0: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
28d0: 68 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ht(Parse *pParse
28e0: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 65 78  , Expr *p){.  ex
28f0: 70 72 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a  prSetHeight(p);.
2900: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65    sqlite3ExprChe
2910: 63 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c  ckHeight(pParse,
2920: 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a   p->nHeight);.}.
2930: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2940: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
2950: 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69   of any expressi
2960: 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63  on tree referenc
2970: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c  ed.** by the sel
2980: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ect statement pa
2990: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
29a0: 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
29b0: 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
29c0: 67 68 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ght(Select *p){.
29d0: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
29e0: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c  0;.  heightOfSel
29f0: 65 63 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29  ect(p, &nHeight)
2a00: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67  ;.  return nHeig
2a10: 68 74 3b 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ht;.}.#else.  #d
2a20: 65 66 69 6e 65 20 65 78 70 72 53 65 74 48 65 69  efine exprSetHei
2a30: 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a  ght(y).#endif /*
2a40: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
2a50: 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a  _DEPTH>0 */../*.
2a60: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2a70: 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c 6c 6f  is the core allo
2a80: 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72 20 6e  cator for Expr n
2a90: 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73  odes..**.** Cons
2aa0: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
2ab0: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20  ession node and 
2ac0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
2ad0: 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a   to it.  Memory.
2ae0: 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65  ** for this node
2af0: 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70 54 6f   and for the pTo
2b00: 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ken argument is 
2b10: 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74  a single allocat
2b20: 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20  ion.** obtained 
2b30: 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
2b40: 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c  lloc().  The cal
2b50: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
2b60: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
2b70: 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
2b80: 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61  the node eventua
2b90: 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a  lly gets freed..
2ba0: 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65  **.** If dequote
2bb0: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
2bc0: 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69 74 20  he token (if it 
2bd0: 65 78 69 73 74 73 29 20 69 73 20 64 65 71 75 6f  exists) is dequo
2be0: 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75 6f  ted..** If dequo
2bf0: 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f 20  te is false, no 
2c00: 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70 65 72  dequoting is per
2c10: 66 6f 72 6d 61 6e 63 65 2e 20 20 54 68 65 20 64  formance.  The d
2c20: 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65  eQuote.** parame
2c30: 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69  ter is ignored i
2c40: 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  f pToken is NULL
2c50: 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e   or if the token
2c60: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70   does not.** app
2c70: 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64  ear to be quoted
2c80: 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73  .  If the quotes
2c90: 20 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72   were of the for
2ca0: 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d  m "..." (double-
2cb0: 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20  quotes).** then 
2cc0: 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64  the EP_DblQuoted
2cd0: 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
2ce0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  the expression n
2cf0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69  ode..**.** Speci
2d00: 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d  al case:  If op=
2d10: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20  =TK_INTEGER and 
2d20: 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f  pToken points to
2d30: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a   a string that.*
2d40: 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61  * can be transla
2d50: 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69  ted into a 32-bi
2d60: 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  t integer, then 
2d70: 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74  the token is not
2d80: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e  .** stored in u.
2d90: 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64  zToken.  Instead
2da0: 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  , the integer va
2db0: 6c 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a  lues is written.
2dc0: 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65  ** into u.iValue
2dd0: 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56   and the EP_IntV
2de0: 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74  alue flag is set
2df0: 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72  .  No extra stor
2e00: 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61  age.** is alloca
2e10: 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ted to hold the 
2e20: 69 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64  integer text and
2e30: 20 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61   the dequote fla
2e40: 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f  g is ignored..*/
2e50: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
2e60: 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74  prAlloc(.  sqlit
2e70: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
2e80: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
2e90: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
2ea0: 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e  Zero() (may be n
2eb0: 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  ull) */.  int op
2ec0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ed0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
2ee0: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  opcode */.  cons
2ef0: 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c  t Token *pToken,
2f00: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67      /* Token arg
2f10: 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65  ument.  Might be
2f20: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 64   NULL */.  int d
2f30: 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20  equote          
2f40: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65     /* True to de
2f50: 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20 45 78  quote */.){.  Ex
2f60: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  pr *pNew;.  int 
2f70: 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 69 6e  nExtra = 0;.  in
2f80: 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a 0a 20  t iValue = 0;.. 
2f90: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
2fa0: 20 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e     if( op!=TK_IN
2fb0: 54 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d  TEGER || pToken-
2fc0: 3e 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  >z==0.          
2fd0: 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  || sqlite3GetInt
2fe0: 33 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69  32(pToken->z, &i
2ff0: 56 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20  Value)==0 ){.   
3000: 20 20 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b     nExtra = pTok
3010: 65 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61  en->n+1;.      a
3020: 73 73 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30  ssert( iValue>=0
3030: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
3040: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
3050: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
3060: 69 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74  izeof(Expr)+nExt
3070: 72 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  ra);.  if( pNew 
3080: 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20  ){.    pNew->op 
3090: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e  = (u8)op;.    pN
30a0: 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20  ew->iAgg = -1;. 
30b0: 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b     if( pToken ){
30c0: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72  .      if( nExtr
30d0: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  a==0 ){.        
30e0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
30f0: 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
3100: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c      pNew->u.iVal
3110: 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20  ue = iValue;.   
3120: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3130: 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20    int c;.       
3140: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   pNew->u.zToken 
3150: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
3160: 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ];.        memcp
3170: 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  y(pNew->u.zToken
3180: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f  , pToken->z, pTo
3190: 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  ken->n);.       
31a0: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b   pNew->u.zToken[
31b0: 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a  pToken->n] = 0;.
31c0: 20 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75          if( dequ
31d0: 6f 74 65 20 26 26 20 6e 45 78 74 72 61 3e 3d 33  ote && nExtra>=3
31e0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26   .             &
31f0: 26 20 28 28 63 20 3d 20 70 54 6f 6b 65 6e 2d 3e  & ((c = pToken->
3200: 7a 5b 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20 63  z[0])=='\'' || c
3210: 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5b 27 20  =='"' || c=='[' 
3220: 7c 7c 20 63 3d 3d 27 60 27 29 20 29 7b 0a 20 20  || c=='`') ){.  
3230: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
3240: 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a  equote(pNew->u.z
3250: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  Token);.        
3260: 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 70    if( c=='"' ) p
3270: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
3280: 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20  _DblQuoted;.    
3290: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
32a0: 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
32b0: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a  AX_EXPR_DEPTH>0.
32c0: 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68      pNew->nHeigh
32d0: 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a  t = 1;.#endif  .
32e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
32f0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  w;.}../*.** Allo
3300: 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  cate a new expre
3310: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20  ssion node from 
3320: 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  a zero-terminate
3330: 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73  d token that has
3340: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
3350: 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78   dequoted..*/.Ex
3360: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28  pr *sqlite3Expr(
3370: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
3380: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
3390: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
33a0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28  DbMallocZero() (
33b0: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
33c0: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
33d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
33e0: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
33f0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
3400: 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54  zToken      /* T
3410: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20  oken argument.  
3420: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
3430: 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20  .){.  Token x;. 
3440: 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20   x.z = zToken;. 
3450: 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20   x.n = zToken ? 
3460: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
3470: 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72  zToken) : 0;.  r
3480: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
3490: 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26  rAlloc(db, op, &
34a0: 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x, 0);.}../*.** 
34b0: 41 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20  Attach subtrees 
34c0: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
34d0: 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64   to the Expr nod
34e0: 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  e pRoot..**.** I
34f0: 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68  f pRoot==NULL th
3500: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20  at means that a 
3510: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3520: 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
3530: 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74  rred..** In that
3540: 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68   case, delete th
3550: 65 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74  e subtrees pLeft
3560: 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a   and pRight..*/.
3570: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
3580: 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a  AttachSubtrees(.
3590: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
35a0: 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20   Expr *pRoot,.  
35b0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45  Expr *pLeft,.  E
35c0: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
35d0: 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b   if( pRoot==0 ){
35e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
35f0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
3600: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
3610: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74  Delete(db, pLeft
3620: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
3630: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69  prDelete(db, pRi
3640: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
3650: 20 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b     if( pRight ){
3660: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52  .      pRoot->pR
3670: 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  ight = pRight;. 
3680: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
3690: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
36a0: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
36b0: 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c    pRoot->flags |
36c0: 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b  = EP_ExpCollate;
36d0: 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  .        pRoot->
36e0: 70 43 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e  pColl = pRight->
36f0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  pColl;.      }. 
3700: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
3710: 66 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f  ft ){.      pRoo
3720: 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74  t->pLeft = pLeft
3730: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
3740: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  t->flags & EP_Ex
3750: 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20  pCollate ){.    
3760: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
3770: 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74   |= EP_ExpCollat
3780: 65 3b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74  e;.        pRoot
3790: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d  ->pColl = pLeft-
37a0: 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  >pColl;.      }.
37b0: 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65      }.    exprSe
37c0: 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a  tHeight(pRoot);.
37d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
37e0: 6f 63 61 74 65 20 61 20 45 78 70 72 20 6e 6f 64  ocate a Expr nod
37f0: 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73  e which joins as
3800: 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62   many as two sub
3810: 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65  trees..**.** One
3820: 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20   or both of the 
3830: 73 75 62 74 72 65 65 73 20 63 61 6e 20 62 65 20  subtrees can be 
3840: 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20  NULL.  Return a 
3850: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
3860: 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e  ew.** Expr node.
3870: 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20    Or, if an OOM 
3880: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
3890: 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  t pParse->db->ma
38a0: 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66  llocFailed,.** f
38b0: 72 65 65 20 74 68 65 20 73 75 62 74 72 65 65 73  ree the subtrees
38c0: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
38d0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
38e0: 65 33 50 45 78 70 72 28 0a 20 20 50 61 72 73 65  e3PExpr(.  Parse
38f0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3900: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
3910: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
3920: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
3930: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
3940: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70   opcode */.  Exp
3950: 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20  r *pLeft,       
3960: 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65       /* Left ope
3970: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
3980: 70 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  pRight,         
3990: 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61    /* Right opera
39a0: 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  nd */.  const To
39b0: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20 20  ken *pToken     
39c0: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b 65  /* Argument toke
39d0: 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  n */.){.  Expr *
39e0: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  p = sqlite3ExprA
39f0: 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
3a00: 20 6f 70 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b   op, pToken, 1);
3a10: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74  .  sqlite3ExprAt
3a20: 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61  tachSubtrees(pPa
3a30: 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66  rse->db, p, pLef
3a40: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 69 66  t, pRight);.  if
3a50: 28 20 70 20 29 20 7b 0a 20 20 20 20 73 71 6c 69  ( p ) {.    sqli
3a60: 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67  te3ExprCheckHeig
3a70: 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48  ht(pParse, p->nH
3a80: 65 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65  eight);.  }.  re
3a90: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
3aa0: 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73   Join two expres
3ab0: 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41  sions using an A
3ac0: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  ND operator.  If
3ad0: 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69   either expressi
3ae0: 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74  on is.** NULL, t
3af0: 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
3b00: 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73  the other expres
3b10: 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  sion..*/.Expr *s
3b20: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 73 71  qlite3ExprAnd(sq
3b30: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
3b40: 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52  *pLeft, Expr *pR
3b50: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 4c 65  ight){.  if( pLe
3b60: 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ft==0 ){.    ret
3b70: 75 72 6e 20 70 52 69 67 68 74 3b 0a 20 20 7d 65  urn pRight;.  }e
3b80: 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 3d 3d  lse if( pRight==
3b90: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
3ba0: 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pLeft;.  }else{.
3bb0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
3bc0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
3bd0: 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c  c(db, TK_AND, 0,
3be0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
3bf0: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
3c00: 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65  es(db, pNew, pLe
3c10: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  ft, pRight);.   
3c20: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20   return pNew;.  
3c30: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  }.}../*.** Const
3c40: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
3c50: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61  ssion node for a
3c60: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d   function with m
3c70: 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d  ultiple.** argum
3c80: 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ents..*/.Expr *s
3c90: 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69  qlite3ExprFuncti
3ca0: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
3cb0: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
3cc0: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
3cd0: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
3ce0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
3cf0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
3d00: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b  ssert( pToken );
3d10: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
3d20: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
3d30: 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b  K_FUNCTION, pTok
3d40: 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 4e  en, 1);.  if( pN
3d50: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ew==0 ){.    sql
3d60: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
3d70: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f  te(db, pList); /
3d80: 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c  * Avoid memory l
3d90: 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20  eak when malloc 
3da0: 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74  fails */.    ret
3db0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  urn 0;.  }.  pNe
3dc0: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69  w->x.pList = pLi
3dd0: 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  st;.  assert( !E
3de0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
3df0: 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  New, EP_xIsSelec
3e00: 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  t) );.  sqlite3E
3e10: 78 70 72 53 65 74 48 65 69 67 68 74 28 70 50 61  xprSetHeight(pPa
3e20: 72 73 65 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65  rse, pNew);.  re
3e30: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
3e40: 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72  .** Assign a var
3e50: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20  iable number to 
3e60: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
3e70: 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c  at encodes a wil
3e80: 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20  dcard.** in the 
3e90: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
3ea0: 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  tement.  .**.** 
3eb0: 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73  Wildcards consis
3ec0: 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
3ed0: 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65   "?" are assigne
3ee0: 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  d the next seque
3ef0: 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  ntial.** variabl
3f00: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
3f10: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
3f20: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65   form "?nnn" are
3f30: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75   assigned the nu
3f40: 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20  mber "nnn".  We 
3f50: 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e  make.** sure "nn
3f60: 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65  n" is not too be
3f70: 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69   to avoid a deni
3f80: 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74  al of service at
3f90: 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tack when.** the
3fa0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63   SQL statement c
3fb0: 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74  omes from an ext
3fc0: 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a  ernal source..**
3fd0: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66  .** Wildcards of
3fe0: 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22   the form ":aaa"
3ff0: 2c 20 22 40 61 61 61 22 2c 20 6f 72 20 22 24 61  , "@aaa", or "$a
4000: 61 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64  aa" are assigned
4010: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
4020: 0a 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69  .** as the previ
4030: 6f 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ous instance of 
4040: 74 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72  the same wildcar
4050: 64 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69  d.  Or if this i
4060: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  s the first.** i
4070: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77  nstance of the w
4080: 69 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78  ildcard, the nex
4090: 74 20 73 65 71 75 65 6e 69 61 6c 20 76 61 72 69  t sequenial vari
40a0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a  able number is.*
40b0: 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76  * assigned..*/.v
40c0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
40d0: 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50  ssignVarNumber(P
40e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
40f0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 71  pr *pExpr){.  sq
4100: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
4110: 73 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20  se->db;.  const 
4120: 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20  char *z;..  if( 
4130: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
4140: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  n;.  assert( !Ex
4150: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
4160: 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
4170: 6c 75 65 7c 45 50 5f 52 65 64 75 63 65 64 7c 45  lue|EP_Reduced|E
4180: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a  P_TokenOnly) );.
4190: 20 20 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a    z = pExpr->u.z
41a0: 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28  Token;.  assert(
41b0: 20 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   z!=0 );.  asser
41c0: 74 28 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  t( z[0]!=0 );.  
41d0: 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20  if( z[1]==0 ){. 
41e0: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f     /* Wildcard o
41f0: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20  f the form "?". 
4200: 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74   Assign the next
4210: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
4220: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
4230: 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20 20  z[0]=='?' );.   
4240: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
4250: 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72  = (ynVar)(++pPar
4260: 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 7d 65 6c  se->nVar);.  }el
4270: 73 65 7b 0a 20 20 20 20 79 6e 56 61 72 20 78 20  se{.    ynVar x 
4280: 3d 20 30 3b 0a 20 20 20 20 75 33 32 20 6e 20 3d  = 0;.    u32 n =
4290: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
42a0: 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30  (z);.    if( z[0
42b0: 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='?' ){.      
42c0: 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74  /* Wildcard of t
42d0: 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20  he form "?nnn". 
42e0: 20 43 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74   Convert "nnn" t
42f0: 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64  o an integer and
4300: 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 20 69 74  .      ** use it
4310: 20 61 73 20 74 68 65 20 76 61 72 69 61 62 6c 65   as the variable
4320: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20   number */.     
4330: 20 69 36 34 20 69 3b 0a 20 20 20 20 20 20 69 6e   i64 i;.      in
4340: 74 20 62 4f 6b 20 3d 20 30 3d 3d 73 71 6c 69 74  t bOk = 0==sqlit
4350: 65 33 41 74 6f 69 36 34 28 26 7a 5b 31 5d 2c 20  e3Atoi64(&z[1], 
4360: 26 69 2c 20 6e 2d 31 2c 20 53 51 4c 49 54 45 5f  &i, n-1, SQLITE_
4370: 55 54 46 38 29 3b 0a 20 20 20 20 20 20 70 45 78  UTF8);.      pEx
4380: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20  pr->iColumn = x 
4390: 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20 20 20 20  = (ynVar)i;.    
43a0: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 30    testcase( i==0
43b0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
43c0: 73 65 28 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20  se( i==1 );.    
43d0: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64    testcase( i==d
43e0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
43f0: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
4400: 4e 55 4d 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20  NUMBER]-1 );.   
4410: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d     testcase( i==
4420: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
4430: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
4440: 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20  _NUMBER] );.    
4450: 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20    if( bOk==0 || 
4460: 69 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69  i<1 || i>db->aLi
4470: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
4480: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
4490: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ] ){.        sql
44a0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
44b0: 72 73 65 2c 20 22 76 61 72 69 61 62 6c 65 20 6e  rse, "variable n
44c0: 75 6d 62 65 72 20 6d 75 73 74 20 62 65 20 62 65  umber must be be
44d0: 74 77 65 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64  tween ?1 and ?%d
44e0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  ",.            d
44f0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
4500: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
4510: 4e 55 4d 42 45 52 5d 29 3b 0a 20 20 20 20 20 20  NUMBER]);.      
4520: 20 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d    x = 0;.      }
4530: 0a 20 20 20 20 20 20 69 66 28 20 69 3e 70 50 61  .      if( i>pPa
4540: 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20  rse->nVar ){.   
4550: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61       pParse->nVa
4560: 72 20 3d 20 28 69 6e 74 29 69 3b 0a 20 20 20 20  r = (int)i;.    
4570: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
4580: 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64       /* Wildcard
4590: 73 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c 20 22  s like ":aaa", "
45a0: 24 61 61 61 22 20 6f 72 20 22 40 61 61 61 22 2e  $aaa" or "@aaa".
45b0: 20 20 52 65 75 73 65 20 74 68 65 20 73 61 6d 65    Reuse the same
45c0: 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20   variable.      
45d0: 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65  ** number as the
45e0: 20 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63   prior appearanc
45f0: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  e of the same na
4600: 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61  me, or if the na
4610: 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  me.      ** has 
4620: 6e 65 76 65 72 20 61 70 70 65 61 72 65 64 20 62  never appeared b
4630: 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65  efore, reuse the
4640: 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e   same variable n
4650: 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2f 0a 20  umber.      */. 
4660: 20 20 20 20 20 79 6e 56 61 72 20 69 3b 0a 20 20       ynVar i;.  
4670: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
4680: 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3b 20 69 2b  Parse->nzVar; i+
4690: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
46a0: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69 5d  pParse->azVar[i]
46b0: 20 26 26 20 6d 65 6d 63 6d 70 28 70 50 61 72 73   && memcmp(pPars
46c0: 65 2d 3e 61 7a 56 61 72 5b 69 5d 2c 7a 2c 6e 2b  e->azVar[i],z,n+
46d0: 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)==0 ){.       
46e0: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
46f0: 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69  n = x = (ynVar)i
4700: 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  +1;.          br
4710: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
4720: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
4730: 20 78 3d 3d 30 20 29 20 78 20 3d 20 70 45 78 70   x==0 ) x = pExp
4740: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e  r->iColumn = (yn
4750: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
4760: 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Var);.    }.    
4770: 69 66 28 20 78 3e 30 20 29 7b 0a 20 20 20 20 20  if( x>0 ){.     
4780: 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e   if( x>pParse->n
4790: 7a 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20  zVar ){.        
47a0: 63 68 61 72 20 2a 2a 61 3b 0a 20 20 20 20 20 20  char **a;.      
47b0: 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52    a = sqlite3DbR
47c0: 65 61 6c 6c 6f 63 28 64 62 2c 20 70 50 61 72 73  ealloc(db, pPars
47d0: 65 2d 3e 61 7a 56 61 72 2c 20 78 2a 73 69 7a 65  e->azVar, x*size
47e0: 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20  of(a[0]));.     
47f0: 20 20 20 69 66 28 20 61 3d 3d 30 20 29 20 72 65     if( a==0 ) re
4800: 74 75 72 6e 3b 20 20 2f 2a 20 45 72 72 6f 72 20  turn;  /* Error 
4810: 72 65 70 6f 72 74 65 64 20 74 68 72 6f 75 67 68  reported through
4820: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
4830: 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 61  d */.        pPa
4840: 72 73 65 2d 3e 61 7a 56 61 72 20 3d 20 61 3b 0a  rse->azVar = a;.
4850: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
4860: 61 5b 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 5d  a[pParse->nzVar]
4870: 2c 20 30 2c 20 28 78 2d 70 50 61 72 73 65 2d 3e  , 0, (x-pParse->
4880: 6e 7a 56 61 72 29 2a 73 69 7a 65 6f 66 28 61 5b  nzVar)*sizeof(a[
4890: 30 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 70 50  0]));.        pP
48a0: 61 72 73 65 2d 3e 6e 7a 56 61 72 20 3d 20 78 3b  arse->nzVar = x;
48b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
48c0: 66 28 20 7a 5b 30 5d 21 3d 27 3f 27 20 7c 7c 20  f( z[0]!='?' || 
48d0: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d  pParse->azVar[x-
48e0: 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1]==0 ){.       
48f0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4900: 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  b, pParse->azVar
4910: 5b 78 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  [x-1]);.        
4920: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d  pParse->azVar[x-
4930: 31 5d 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  1] = sqlite3DbSt
4940: 72 4e 44 75 70 28 64 62 2c 20 7a 2c 20 6e 29 3b  rNDup(db, z, n);
4950: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4960: 20 7d 20 0a 20 20 69 66 28 20 21 70 50 61 72 73   } .  if( !pPars
4970: 65 2d 3e 6e 45 72 72 20 26 26 20 70 50 61 72 73  e->nErr && pPars
4980: 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61 4c 69 6d  e->nVar>db->aLim
4990: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
49a0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
49b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
49c0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
49d0: 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61  "too many SQL va
49e0: 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d  riables");.  }.}
49f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76  ../*.** Recursiv
4a00: 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78  ely delete an ex
4a10: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a  pression tree..*
4a20: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
4a30: 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  prDelete(sqlite3
4a40: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a   *db, Expr *p){.
4a50: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
4a60: 75 72 6e 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79  urn;.  /* Sanity
4a70: 20 63 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74   check: Assert t
4a80: 68 61 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65  hat the IntValue
4a90: 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   is non-negative
4aa0: 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f   if it exists */
4ab0: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
4ac0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
4ad0: 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70  P_IntValue) || p
4ae0: 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b  ->u.iValue>=0 );
4af0: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 41  .  if( !ExprHasA
4b00: 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  nyProperty(p, EP
4b10: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
4b20: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
4b30: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 65 66  lete(db, p->pLef
4b40: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
4b50: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
4b60: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66  >pRight);.    if
4b70: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
4b80: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
4b90: 29 20 26 26 20 28 70 2d 3e 66 6c 61 67 73 32 20  ) && (p->flags2 
4ba0: 26 20 45 50 32 5f 4d 61 6c 6c 6f 63 65 64 54 6f  & EP2_MallocedTo
4bb0: 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ken)!=0 ){.     
4bc0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4bd0: 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  b, p->u.zToken);
4be0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 45  .    }.    if( E
4bf0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
4c00: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
4c10: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4c20: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
4c30: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a   p->x.pSelect);.
4c40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4c50: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
4c60: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e  Delete(db, p->x.
4c70: 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pList);.    }.  
4c80: 7d 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  }.  if( !ExprHas
4c90: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53  Property(p, EP_S
4ca0: 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20 73 71  tatic) ){.    sq
4cb0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4cc0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
4cd0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
4ce0: 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f  er of bytes allo
4cf0: 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 65 78  cated for the ex
4d00: 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75  pression structu
4d10: 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73  re .** passed as
4d20: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
4d30: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77  ent. This is alw
4d40: 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f  ays one of EXPR_
4d50: 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50  FULLSIZE,.** EXP
4d60: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72  R_REDUCEDSIZE or
4d70: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
4d80: 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  IZE..*/.static i
4d90: 6e 74 20 65 78 70 72 53 74 72 75 63 74 53 69 7a  nt exprStructSiz
4da0: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  e(Expr *p){.  if
4db0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
4dc0: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
4dd0: 79 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52  y) ) return EXPR
4de0: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a  _TOKENONLYSIZE;.
4df0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
4e00: 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75  perty(p, EP_Redu
4e10: 63 65 64 29 20 29 20 72 65 74 75 72 6e 20 45 58  ced) ) return EX
4e20: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a  PR_REDUCEDSIZE;.
4e30: 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55    return EXPR_FU
4e40: 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LLSIZE;.}../*.**
4e50: 20 54 68 65 20 64 75 70 65 64 45 78 70 72 2a 53   The dupedExpr*S
4e60: 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73 20 65  ize() routines e
4e70: 61 63 68 20 72 65 74 75 72 6e 20 74 68 65 20 6e  ach return the n
4e80: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
4e90: 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74  equired.** to st
4ea0: 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20 61 6e  ore a copy of an
4eb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 65   expression or e
4ec0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
4ed0: 20 54 68 65 79 20 64 69 66 66 65 72 20 69 6e 0a   They differ in.
4ee0: 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74  ** how much of t
4ef0: 68 65 20 74 72 65 65 20 69 73 20 6d 65 61 73 75  he tree is measu
4f00: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64  red..**.**     d
4f10: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
4f20: 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20 6f 66  ze()     Size of
4f30: 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72 20 73   only the Expr s
4f40: 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20 20 20  tructure .**    
4f50: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
4f60: 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a 65 20  ze()       Size 
4f70: 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63 65 20  of Expr + space 
4f80: 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20  for token.**    
4f90: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 29   dupedExprSize()
4fa0: 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
4fb0: 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65  + token + subtre
4fc0: 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a  e components.**.
4fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
5020: 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72 53  * The dupedExprS
5030: 74 72 75 63 74 53 69 7a 65 28 29 20 66 75 6e 63  tructSize() func
5040: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 77 6f  tion returns two
5050: 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f   values OR-ed to
5060: 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29  gether:  .** (1)
5070: 20 74 68 65 20 73 70 61 63 65 20 72 65 71 75 69   the space requi
5080: 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79 20 6f  red for a copy o
5090: 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  f the Expr struc
50a0: 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a  ture only and .*
50b0: 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78 78 78  * (2) the EP_xxx
50c0: 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69   flags that indi
50d0: 63 61 74 65 20 77 68 61 74 20 74 68 65 20 73 74  cate what the st
50e0: 72 75 63 74 75 72 65 20 73 69 7a 65 20 73 68 6f  ructure size sho
50f0: 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72  uld be..** The r
5100: 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69 73 20  eturn values is 
5110: 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a  always one of:.*
5120: 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 46  *.**      EXPR_F
5130: 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20  ULLSIZE.**      
5140: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
5150: 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65 64 0a     | EP_Reduced.
5160: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54 4f 4b  **      EXPR_TOK
5170: 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f  ENONLYSIZE | EP_
5180: 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20  TokenOnly.**.** 
5190: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
51a0: 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65  structure can be
51b0: 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e   found by maskin
51c0: 67 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  g the return val
51d0: 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f  ue.** of this ro
51e0: 75 74 69 6e 65 20 77 69 74 68 20 30 78 66 66 66  utine with 0xfff
51f0: 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63 61 6e  .  The flags can
5200: 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73   be found by mas
5210: 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74 75  king the.** retu
5220: 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20 45 50  rn value with EP
5230: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
5240: 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  nOnly..**.** Not
5250: 65 20 74 68 61 74 20 77 69 74 68 20 66 6c 61 67  e that with flag
5260: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
5270: 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 73  E, this routines
5280: 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73   works on full-s
5290: 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65  ize.** (unreduce
52a0: 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20  d) Expr objects 
52b0: 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69 67 69  as they or origi
52c0: 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74 65  nally constructe
52d0: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e  d by the parser.
52e0: 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70 72 65  .** During expre
52f0: 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20  ssion analysis, 
5300: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
5310: 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e  n is computed an
5320: 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20  d moved into.** 
5330: 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66 20 74  later parts of t
5340: 65 68 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61  eh Expr object a
5350: 6e 64 20 74 68 61 74 20 65 78 74 72 61 20 69 6e  nd that extra in
5360: 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20  formation might 
5370: 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f  get chopped.** o
5380: 66 66 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ff if the expres
5390: 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65 64 2e  sion is reduced.
53a0: 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
53b0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   it does not wor
53c0: 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 20 45  k to.** make a E
53d0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 63 6f  XPRDUP_REDUCE co
53e0: 70 79 20 6f 66 20 61 20 72 65 64 75 63 65 64 20  py of a reduced 
53f0: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 74 20  expression.  It 
5400: 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a  is only legal.**
5410: 20 74 6f 20 72 65 64 75 63 65 20 61 20 70 72 69   to reduce a pri
5420: 73 74 69 6e 65 20 65 78 70 72 65 73 73 69 6f 6e  stine expression
5430: 20 74 72 65 65 20 66 72 6f 6d 20 74 68 65 20 70   tree from the p
5440: 61 72 73 65 72 2e 20 20 54 68 65 20 69 6d 70 6c  arser.  The impl
5450: 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66  ementation.** of
5460: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
5470: 53 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d  Size() contain m
5480: 75 6c 74 69 70 6c 65 20 61 73 73 65 72 74 28 29  ultiple assert()
5490: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
54a0: 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65   attempt.** to e
54b0: 6e 66 6f 72 63 65 20 74 68 69 73 20 63 6f 6e 73  nforce this cons
54c0: 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  traint..*/.stati
54d0: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53  c int dupedExprS
54e0: 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a  tructSize(Expr *
54f0: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
5500: 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73   int nSize;.  as
5510: 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 45 58 50  sert( flags==EXP
5520: 52 44 55 50 5f 52 45 44 55 43 45 20 7c 7c 20 66  RDUP_REDUCE || f
5530: 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e  lags==0 ); /* On
5540: 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75  ly one flag valu
5550: 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 69  e allowed */.  i
5560: 66 28 20 30 3d 3d 28 66 6c 61 67 73 26 45 58 50  f( 0==(flags&EXP
5570: 52 44 55 50 5f 52 45 44 55 43 45 29 20 29 7b 0a  RDUP_REDUCE) ){.
5580: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
5590: 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c  _FULLSIZE;.  }el
55a0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
55b0: 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
55c0: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
55d0: 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
55e0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
55f0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
5600: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  p, EP_FromJoin) 
5610: 29 3b 20 0a 20 20 20 20 61 73 73 65 72 74 28 20  ); .    assert( 
5620: 28 70 2d 3e 66 6c 61 67 73 32 20 26 20 45 50 32  (p->flags2 & EP2
5630: 5f 4d 61 6c 6c 6f 63 65 64 54 6f 6b 65 6e 29 3d  _MallocedToken)=
5640: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
5650: 28 20 28 70 2d 3e 66 6c 61 67 73 32 20 26 20 45  ( (p->flags2 & E
5660: 50 32 5f 49 72 72 65 64 75 63 69 62 6c 65 29 3d  P2_Irreducible)=
5670: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  =0 );.    if( p-
5680: 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 70 52 69  >pLeft || p->pRi
5690: 67 68 74 20 7c 7c 20 70 2d 3e 70 43 6f 6c 6c 20  ght || p->pColl 
56a0: 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  || p->x.pList ){
56b0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
56c0: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
56d0: 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20  | EP_Reduced;.  
56e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
56f0: 53 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45  Size = EXPR_TOKE
5700: 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54  NONLYSIZE | EP_T
5710: 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a  okenOnly;.    }.
5720: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69    }.  return nSi
5730: 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ze;.}../*.** Thi
5740: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
5750: 6e 73 20 74 68 65 20 73 70 61 63 65 20 69 6e 20  ns the space in 
5760: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74  bytes required t
5770: 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79  o store the copy
5780: 20 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72   .** of the Expr
5790: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
57a0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
57b0: 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e  r.u.zToken strin
57c0: 67 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74  g (if that.** st
57d0: 72 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e  ring is defined.
57e0: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ).*/.static int 
57f0: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
5800: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
5810: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79  lags){.  int nBy
5820: 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74  te = dupedExprSt
5830: 72 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67  ructSize(p, flag
5840: 73 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66  s) & 0xfff;.  if
5850: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
5860: 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ty(p, EP_IntValu
5870: 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e) && p->u.zToke
5880: 6e 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b  n ){.    nByte +
5890: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
58a0: 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31  0(p->u.zToken)+1
58b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52  ;.  }.  return R
58c0: 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a  OUND8(nByte);.}.
58d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
58e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
58f0: 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 72  s required to cr
5900: 65 61 74 65 20 61 20 64 75 70 6c 69 63 61 74 65  eate a duplicate
5910: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72   of the .** expr
5920: 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73  ession passed as
5930: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
5940: 65 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  ent. The second 
5950: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a  argument is a.**
5960: 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67   mask containing
5970: 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61   EXPRDUP_XXX fla
5980: 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  gs..**.** The va
5990: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63  lue returned inc
59a0: 6c 75 64 65 73 20 73 70 61 63 65 20 74 6f 20 63  ludes space to c
59b0: 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20  reate a copy of 
59c0: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 0a  the Expr struct.
59d0: 2a 2a 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68  ** itself and th
59e0: 65 20 62 75 66 66 65 72 20 72 65 66 65 72 72 65  e buffer referre
59f0: 64 20 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a  d to by Expr.u.z
5a00: 54 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a  Token, if any..*
5a10: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52  *.** If the EXPR
5a20: 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20  DUP_REDUCE flag 
5a30: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
5a40: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
5a50: 63 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65  cludes .** space
5a60: 20 74 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c   to duplicate al
5a70: 6c 20 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20  l Expr nodes in 
5a80: 74 68 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20  the tree formed 
5a90: 62 79 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a  by Expr.pLeft .*
5aa0: 2a 20 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68  * and Expr.pRigh
5ab0: 74 20 76 61 72 69 61 62 6c 65 73 20 28 62 75 74  t variables (but
5ac0: 20 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72   not for any str
5ad0: 75 63 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20  uctures pointed 
5ae0: 74 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e  to or .** descen
5af0: 64 65 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70  ded from the Exp
5b00: 72 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70  r.x.pList or Exp
5b10: 72 2e 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69  r.x.pSelect vari
5b20: 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69  ables)..*/.stati
5b30: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53  c int dupedExprS
5b40: 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ize(Expr *p, int
5b50: 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e   flags){.  int n
5b60: 42 79 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Byte = 0;.  if( 
5b70: 70 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  p ){.    nByte =
5b80: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
5b90: 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ze(p, flags);.  
5ba0: 20 20 69 66 28 20 66 6c 61 67 73 26 45 58 50 52    if( flags&EXPR
5bb0: 44 55 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20  DUP_REDUCE ){.  
5bc0: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70      nByte += dup
5bd0: 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c  edExprSize(p->pL
5be0: 65 66 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75  eft, flags) + du
5bf0: 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70  pedExprSize(p->p
5c00: 52 69 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20  Right, flags);. 
5c10: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5c20: 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n nByte;.}../*.*
5c30: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
5c40: 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71  is similar to sq
5c50: 6c 69 74 65 33 45 78 70 72 44 75 70 28 29 2c 20  lite3ExprDup(), 
5c60: 65 78 63 65 70 74 20 74 68 61 74 20 69 66 20 70  except that if p
5c70: 7a 42 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e  zBuffer .** is n
5c80: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a  ot NULL then *pz
5c90: 42 75 66 66 65 72 20 69 73 20 61 73 73 75 6d 65  Buffer is assume
5ca0: 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  d to point to a 
5cb0: 62 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f  buffer large eno
5cc0: 75 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65  ugh .** to store
5cd0: 20 74 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70   the copy of exp
5ce0: 72 65 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63  ression p, the c
5cf0: 6f 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54  opies of p->u.zT
5d00: 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c  oken.** (if appl
5d10: 69 63 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65  icable), and the
5d20: 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
5d30: 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70  ->pLeft and p->p
5d40: 52 69 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e  Right expression
5d50: 73 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65  s,.** if any. Be
5d60: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
5d70: 2a 70 7a 42 75 66 66 65 72 20 69 73 20 73 65 74  *pzBuffer is set
5d80: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
5d90: 74 65 20 70 61 73 73 65 64 20 74 68 65 0a 2a 2a  te passed the.**
5da0: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
5db0: 62 75 66 66 65 72 20 63 6f 70 69 65 64 20 69 6e  buffer copied in
5dc0: 74 6f 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  to by this funct
5dd0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45  ion..*/.static E
5de0: 78 70 72 20 2a 65 78 70 72 44 75 70 28 73 71 6c  xpr *exprDup(sql
5df0: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
5e00: 70 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 75 38  p, int flags, u8
5e10: 20 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20   **pzBuffer){.  
5e20: 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 30 3b 20  Expr *pNew = 0; 
5e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e40: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
5e50: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 66 28   return */.  if(
5e60: 20 70 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20   p ){.    const 
5e70: 69 6e 74 20 69 73 52 65 64 75 63 65 64 20 3d 20  int isReduced = 
5e80: 28 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52  (flags&EXPRDUP_R
5e90: 45 44 55 43 45 29 3b 0a 20 20 20 20 75 38 20 2a  EDUCE);.    u8 *
5ea0: 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 75 33 32 20  zAlloc;.    u32 
5eb0: 73 74 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a  staticFlag = 0;.
5ec0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 42  .    assert( pzB
5ed0: 75 66 66 65 72 3d 3d 30 20 7c 7c 20 69 73 52 65  uffer==0 || isRe
5ee0: 64 75 63 65 64 20 29 3b 0a 0a 20 20 20 20 2f 2a  duced );..    /*
5ef0: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72   Figure out wher
5f00: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e  e to write the n
5f10: 65 77 20 45 78 70 72 20 73 74 72 75 63 74 75 72  ew Expr structur
5f20: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 7a  e. */.    if( pz
5f30: 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20  Buffer ){.      
5f40: 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66  zAlloc = *pzBuff
5f50: 65 72 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63  er;.      static
5f60: 46 6c 61 67 20 3d 20 45 50 5f 53 74 61 74 69 63  Flag = EP_Static
5f70: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5f80: 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69     zAlloc = sqli
5f90: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
5fa0: 62 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  b, dupedExprSize
5fb0: 28 70 2c 20 66 6c 61 67 73 29 29 3b 0a 20 20 20  (p, flags));.   
5fc0: 20 7d 0a 20 20 20 20 70 4e 65 77 20 3d 20 28 45   }.    pNew = (E
5fd0: 78 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20  xpr *)zAlloc;.. 
5fe0: 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
5ff0: 20 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77       /* Set nNew
6000: 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
6010: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
6020: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  he structure poi
6030: 6e 74 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a  nted to.      **
6040: 20 62 79 20 70 4e 65 77 2e 20 54 68 69 73 20 69   by pNew. This i
6050: 73 20 65 69 74 68 65 72 20 45 58 50 52 5f 46 55  s either EXPR_FU
6060: 4c 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52 45 44  LLSIZE, EXPR_RED
6070: 55 43 45 44 53 49 5a 45 20 6f 72 0a 20 20 20 20  UCEDSIZE or.    
6080: 20 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f    ** EXPR_TOKENO
6090: 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20  NLYSIZE. nToken 
60a0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
60b0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 63 6f  mber of bytes co
60c0: 6e 73 75 6d 65 64 0a 20 20 20 20 20 20 2a 2a 20  nsumed.      ** 
60d0: 62 79 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74  by the copy of t
60e0: 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73  he p->u.zToken s
60f0: 74 72 69 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a  tring (if any)..
6100: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
6110: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53  onst unsigned nS
6120: 74 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65  tructSize = dupe
6130: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
6140: 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20  p, flags);.     
6150: 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53   const int nNewS
6160: 69 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a  ize = nStructSiz
6170: 65 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20 20  e & 0xfff;.     
6180: 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20   int nToken;.   
6190: 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50     if( !ExprHasP
61a0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e  roperty(p, EP_In
61b0: 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e  tValue) && p->u.
61c0: 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  zToken ){.      
61d0: 20 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74    nToken = sqlit
61e0: 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e  e3Strlen30(p->u.
61f0: 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20  zToken) + 1;.   
6200: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6210: 20 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20    nToken = 0;.  
6220: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
6230: 69 73 52 65 64 75 63 65 64 20 29 7b 0a 20 20 20  isReduced ){.   
6240: 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
6250: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
6260: 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29  EP_Reduced)==0 )
6270: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
6280: 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77  (zAlloc, p, nNew
6290: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Size);.      }el
62a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
62b0: 6e 53 69 7a 65 20 3d 20 65 78 70 72 53 74 72 75  nSize = exprStru
62c0: 63 74 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20  ctSize(p);.     
62d0: 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63     memcpy(zAlloc
62e0: 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20  , p, nSize);.   
62f0: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c       memset(&zAl
6300: 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45  loc[nSize], 0, E
6310: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69  XPR_FULLSIZE-nSi
6320: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ze);.      }..  
6330: 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 45      /* Set the E
6340: 50 5f 52 65 64 75 63 65 64 2c 20 45 50 5f 54 6f  P_Reduced, EP_To
6350: 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f  kenOnly, and EP_
6360: 53 74 61 74 69 63 20 66 6c 61 67 73 20 61 70 70  Static flags app
6370: 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20  ropriately. */. 
6380: 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
6390: 20 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64   &= ~(EP_Reduced
63a0: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50  |EP_TokenOnly|EP
63b0: 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20 20 20  _Static);.      
63c0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e  pNew->flags |= n
63d0: 53 74 72 75 63 74 53 69 7a 65 20 26 20 28 45 50  StructSize & (EP
63e0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
63f0: 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 70 4e  nOnly);.      pN
6400: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61  ew->flags |= sta
6410: 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20 20 20  ticFlag;..      
6420: 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 2d 3e 75  /* Copy the p->u
6430: 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c 20  .zToken string, 
6440: 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 20  if any. */.     
6450: 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20   if( nToken ){. 
6460: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f         char *zTo
6470: 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54  ken = pNew->u.zT
6480: 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 7a  oken = (char*)&z
6490: 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b  Alloc[nNewSize];
64a0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
64b0: 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f  zToken, p->u.zTo
64c0: 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20  ken, nToken);.  
64d0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
64e0: 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c 70   0==((p->flags|p
64f0: 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20 45 50  New->flags) & EP
6500: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
6510: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
6520: 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e 70 53  n the pNew->x.pS
6530: 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d 3e 78  elect or pNew->x
6540: 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e 20 2a  .pList member. *
6550: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78  /.        if( Ex
6560: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
6570: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
6580: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
6590: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71  ->x.pSelect = sq
65a0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
65b0: 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  b, p->x.pSelect,
65c0: 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20   isReduced);.   
65d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
65e0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c        pNew->x.pL
65f0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
6600: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
6610: 78 2e 70 4c 69 73 74 2c 20 69 73 52 65 64 75 63  x.pList, isReduc
6620: 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ed);.        }. 
6630: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
6640: 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e 70   Fill in pNew->p
6650: 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d 3e 70  Left and pNew->p
6660: 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20  Right. */.      
6670: 69 66 28 20 45 78 70 72 48 61 73 41 6e 79 50 72  if( ExprHasAnyPr
6680: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
6690: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
66a0: 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
66b0: 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64   zAlloc += duped
66c0: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20  ExprNodeSize(p, 
66d0: 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20  flags);.        
66e0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
66f0: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64  rty(pNew, EP_Red
6700: 75 63 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20  uced) ){.       
6710: 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d     pNew->pLeft =
6720: 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e   exprDup(db, p->
6730: 70 4c 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52  pLeft, EXPRDUP_R
6740: 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b  EDUCE, &zAlloc);
6750: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
6760: 3e 70 52 69 67 68 74 20 3d 20 65 78 70 72 44 75  >pRight = exprDu
6770: 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c  p(db, p->pRight,
6780: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c   EXPRDUP_REDUCE,
6790: 20 26 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20   &zAlloc);.     
67a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
67b0: 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20   pzBuffer ){.   
67c0: 20 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72         *pzBuffer
67d0: 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20   = zAlloc;.     
67e0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
67f0: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
6800: 66 6c 61 67 73 32 20 3d 20 30 3b 0a 20 20 20 20  flags2 = 0;.    
6810: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
6820: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45  AnyProperty(p, E
6830: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
6840: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
6850: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
6860: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
6870: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  eft, 0);.       
6880: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
6890: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
68a0: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
68b0: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
68c0: 20 20 20 20 7d 0a 0a 20 20 20 20 7d 0a 20 20 7d      }..    }.  }
68d0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
68e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
68f0: 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20  lowing group of 
6900: 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65  routines make de
6910: 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70  ep copies of exp
6920: 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70  ressions,.** exp
6930: 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49  ression lists, I
6940: 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c  D lists, and sel
6950: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ect statements. 
6960: 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a   The copies can.
6970: 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62  ** be deleted (b
6980: 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74  y being passed t
6990: 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69  o their respecti
69a0: 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72  ve ...Delete() r
69b0: 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68  outines).** with
69c0: 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68  out effecting th
69d0: 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a  e originals..**.
69e0: 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
69f0: 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20  n list, ID, and 
6a00: 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74  source lists ret
6a10: 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78  urn by sqlite3Ex
6a20: 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20  prListDup(),.** 
6a30: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
6a40: 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53  (), and sqlite3S
6a50: 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20  rcListDup() can 
6a60: 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20 65  not be further e
6a70: 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73  xpanded .** by s
6a80: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
6a90: 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70  to sqlite*ListAp
6aa0: 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e  pend() routines.
6ab0: 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65  .**.** Any table
6ac0: 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c 69  s that the SrcLi
6ad0: 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  st might point t
6ae0: 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63  o are not duplic
6af0: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ated..**.** The 
6b00: 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  flags parameter 
6b10: 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69  contains a combi
6b20: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58  nation of the EX
6b30: 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e  PRDUP_XXX flags.
6b40: 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44  .** If the EXPRD
6b50: 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69  UP_REDUCE flag i
6b60: 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
6b70: 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e  structure return
6b80: 65 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63  ed is a.** trunc
6b90: 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ated version of 
6ba0: 74 68 65 20 75 73 75 61 6c 20 45 78 70 72 20 73  the usual Expr s
6bb0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69  tructure that wi
6bc0: 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a  ll be stored as.
6bd0: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 69  ** part of the i
6be0: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
6bf0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
6c00: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a  atabase schema..
6c10: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
6c20: 45 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20  ExprDup(sqlite3 
6c30: 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e  *db, Expr *p, in
6c40: 74 20 66 6c 61 67 73 29 7b 0a 20 20 72 65 74 75  t flags){.  retu
6c50: 72 6e 20 65 78 70 72 44 75 70 28 64 62 2c 20 70  rn exprDup(db, p
6c60: 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 7d 0a 45  , flags, 0);.}.E
6c70: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
6c80: 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69  ExprListDup(sqli
6c90: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
6ca0: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
6cb0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e  {.  ExprList *pN
6cc0: 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  ew;.  struct Exp
6cd0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
6ce0: 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20  m, *pOldItem;.  
6cf0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d  int i;.  if( p==
6d00: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
6d10: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
6d20: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
6d30: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
6d40: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
6d50: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
6d60: 3e 69 45 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  >iECursor = 0;. 
6d70: 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70   pNew->nExpr = p
6d80: 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d  New->nAlloc = p-
6d90: 3e 6e 45 78 70 72 3b 0a 20 20 70 4e 65 77 2d 3e  >nExpr;.  pNew->
6da0: 61 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69  a = pItem = sqli
6db0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
6dc0: 62 2c 20 20 70 2d 3e 6e 45 78 70 72 2a 73 69 7a  b,  p->nExpr*siz
6dd0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
6de0: 20 20 69 66 28 20 70 49 74 65 6d 3d 3d 30 20 29    if( pItem==0 )
6df0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
6e00: 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20  ree(db, pNew);. 
6e10: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6e20: 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70   .  pOldItem = p
6e30: 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ->a;.  for(i=0; 
6e40: 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  i<p->nExpr; i++,
6e50: 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74   pItem++, pOldIt
6e60: 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  em++){.    Expr 
6e70: 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64  *pOldExpr = pOld
6e80: 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
6e90: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20   pItem->pExpr = 
6ea0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
6eb0: 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61  b, pOldExpr, fla
6ec0: 67 73 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  gs);.    pItem->
6ed0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
6ee0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
6ef0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
6f00: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
6f10: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
6f20: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
6f30: 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d  Span);.    pItem
6f40: 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f  ->sortOrder = pO
6f50: 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65  ldItem->sortOrde
6f60: 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f  r;.    pItem->do
6f70: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65  ne = 0;.    pIte
6f80: 6d 2d 3e 69 43 6f 6c 20 3d 20 70 4f 6c 64 49 74  m->iCol = pOldIt
6f90: 65 6d 2d 3e 69 43 6f 6c 3b 0a 20 20 20 20 70 49  em->iCol;.    pI
6fa0: 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 70 4f  tem->iAlias = pO
6fb0: 6c 64 49 74 65 6d 2d 3e 69 41 6c 69 61 73 3b 0a  ldItem->iAlias;.
6fc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
6fd0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63  w;.}../*.** If c
6fe0: 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73  ursors, triggers
6ff0: 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  , views and subq
7000: 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f  ueries are all o
7010: 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74  mitted from.** t
7020: 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e  he build, then n
7030: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
7040: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65  wing routines, e
7050: 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71  xcept for .** sq
7060: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29  lite3SelectDup()
7070: 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  , can be called.
7080: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
7090: 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73  p() is sometimes
70a0: 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20  .** called with 
70b0: 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e  a NULL argument.
70c0: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
70d0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
70e0: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
70f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
7100: 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e  ER) \. || !defin
7110: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
7120: 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74  UBQUERY).SrcList
7130: 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
7140: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
7150: 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74   SrcList *p, int
7160: 20 66 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69   flags){.  SrcLi
7170: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
7180: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  i;.  int nByte;.
7190: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
71a0: 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d  urn 0;.  nByte =
71b0: 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70   sizeof(*p) + (p
71c0: 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f  ->nSrc>0 ? sizeo
71d0: 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d  f(p->a[0]) * (p-
71e0: 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20  >nSrc-1) : 0);. 
71f0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
7200: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e  bMallocRaw(db, n
7210: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e  Byte );.  if( pN
7220: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
7230: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d  ;.  pNew->nSrc =
7240: 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pNew->nAlloc = 
7250: 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69  p->nSrc;.  for(i
7260: 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69  =0; i<p->nSrc; i
7270: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
7280: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e  SrcList_item *pN
7290: 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e  ewItem = &pNew->
72a0: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
72b0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
72c0: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
72d0: 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  i];.    Table *p
72e0: 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  Tab;.    pNewIte
72f0: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  m->zDatabase = s
7300: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
7310: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61  b, pOldItem->zDa
7320: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65  tabase);.    pNe
7330: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
7340: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
7350: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
7360: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
7370: 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
7380: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
7390: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pOldItem->zAlias
73a0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
73b0: 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64  >jointype = pOld
73c0: 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a  Item->jointype;.
73d0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43      pNewItem->iC
73e0: 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d  ursor = pOldItem
73f0: 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70  ->iCursor;.    p
7400: 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  NewItem->addrFil
7410: 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  lSub = pOldItem-
7420: 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a 20 20  >addrFillSub;.  
7430: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65 67 52    pNewItem->regR
7440: 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74 65 6d  eturn = pOldItem
7450: 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20  ->regReturn;.   
7460: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73 43 6f 72   pNewItem->isCor
7470: 72 65 6c 61 74 65 64 20 3d 20 70 4f 6c 64 49 74  related = pOldIt
7480: 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64  em->isCorrelated
7490: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
74a0: 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  zIndex = sqlite3
74b0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
74c0: 64 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a  dItem->zIndex);.
74d0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6e 6f      pNewItem->no
74e0: 74 49 6e 64 65 78 65 64 20 3d 20 70 4f 6c 64 49  tIndexed = pOldI
74f0: 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3b  tem->notIndexed;
7500: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
7510: 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d  Index = pOldItem
7520: 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54  ->pIndex;.    pT
7530: 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70  ab = pNewItem->p
7540: 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  Tab = pOldItem->
7550: 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54  pTab;.    if( pT
7560: 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  ab ){.      pTab
7570: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a  ->nRef++;.    }.
7580: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
7590: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
75a0: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c  electDup(db, pOl
75b0: 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  dItem->pSelect, 
75c0: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
75d0: 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69  Item->pOn = sqli
75e0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
75f0: 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c  OldItem->pOn, fl
7600: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ags);.    pNewIt
7610: 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c  em->pUsing = sql
7620: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 64 62  ite3IdListDup(db
7630: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69  , pOldItem->pUsi
7640: 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ng);.    pNewIte
7650: 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c  m->colUsed = pOl
7660: 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  dItem->colUsed;.
7670: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
7680: 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c  w;.}.IdList *sql
7690: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 73 71  ite3IdListDup(sq
76a0: 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
76b0: 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20  t *p){.  IdList 
76c0: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
76d0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
76e0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
76f0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
7700: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
7710: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
7720: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
7730: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20  ;.  pNew->nId = 
7740: 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  pNew->nAlloc = p
7750: 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61  ->nId;.  pNew->a
7760: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7770: 6f 63 52 61 77 28 64 62 2c 20 70 2d 3e 6e 49 64  ocRaw(db, p->nId
7780: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29  *sizeof(p->a[0])
7790: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e   );.  if( pNew->
77a0: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  a==0 ){.    sqli
77b0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e  te3DbFree(db, pN
77c0: 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ew);.    return 
77d0: 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  0;.  }.  for(i=0
77e0: 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29  ; i<p->nId; i++)
77f0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  {.    struct IdL
7800: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
7810: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
7820: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  ;.    struct IdL
7830: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
7840: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
7850: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
7860: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
7870: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
7880: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
7890: 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70  NewItem->idx = p
78a0: 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20  OldItem->idx;.  
78b0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
78c0: 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  .}.Select *sqlit
78d0: 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69  e3SelectDup(sqli
78e0: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
78f0: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
7900: 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a    Select *pNew;.
7910: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
7920: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
7930: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
7940: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
7950: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
7960: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
7970: 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20   pNew->pEList = 
7980: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
7990: 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  up(db, p->pEList
79a0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
79b0: 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
79c0: 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70  SrcListDup(db, p
79d0: 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a  ->pSrc, flags);.
79e0: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
79f0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
7a00: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66  db, p->pWhere, f
7a10: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
7a20: 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
7a30: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
7a40: 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c   p->pGroupBy, fl
7a50: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  ags);.  pNew->pH
7a60: 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
7a70: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48  xprDup(db, p->pH
7a80: 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20  aving, flags);. 
7a90: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
7aa0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
7ab0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64  tDup(db, p->pOrd
7ac0: 65 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20  erBy, flags);.  
7ad0: 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70  pNew->op = p->op
7ae0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
7af0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
7b00: 44 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f  Dup(db, p->pPrio
7b10: 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  r, flags);.  pNe
7b20: 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  w->pLimit = sqli
7b30: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
7b40: 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29  ->pLimit, flags)
7b50: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
7b60: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
7b70: 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65  up(db, p->pOffse
7b80: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  t, flags);.  pNe
7b90: 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  w->iLimit = 0;. 
7ba0: 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d   pNew->iOffset =
7bb0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46   0;.  pNew->selF
7bc0: 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61  lags = p->selFla
7bd0: 67 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68  gs & ~SF_UsesEph
7be0: 65 6d 65 72 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e  emeral;.  pNew->
7bf0: 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a  pRightmost = 0;.
7c00: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
7c10: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
7c20: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
7c30: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
7c40: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
7c50: 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  [2] = -1;.  retu
7c60: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65  rn pNew;.}.#else
7c70: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
7c80: 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65  SelectDup(sqlite
7c90: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
7ca0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
7cb0: 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a  assert( p==0 );.
7cc0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
7cd0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ndif.../*.** Add
7ce0: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
7cf0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20  o the end of an 
7d00: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
7d10: 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a    If pList is.**
7d20: 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c   initially NULL,
7d30: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
7d40: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ew expression li
7d50: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  st..**.** If a m
7d60: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
7d70: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
7d80: 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69  he entire list i
7d90: 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e  s freed and.** N
7da0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
7db0: 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73    If non-NULL is
7dc0: 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
7dd0: 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
7de0: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77  .** that the new
7df0: 20 65 6e 74 72 79 20 77 61 73 20 73 75 63 63 65   entry was succe
7e00: 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64  ssfully appended
7e10: 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73  ..*/.ExprList *s
7e20: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
7e30: 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70  pend(.  Parse *p
7e40: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
7e50: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
7e60: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
7e70: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
7e80: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
7e90: 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
7ea0: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  t be NULL */.  E
7eb0: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
7ec0: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
7ed0: 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e  sion to be appen
7ee0: 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  ded. Might be NU
7ef0: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  LL */.){.  sqlit
7f00: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
7f10: 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  >db;.  if( pList
7f20: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
7f30: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7f40: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
7f50: 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20  f(ExprList) );. 
7f60: 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
7f70: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f  ){.      goto no
7f80: 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _mem;.    }.    
7f90: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
7fa0: 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a  Alloc==0 );.  }.
7fb0: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 41 6c    if( pList->nAl
7fc0: 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70  loc<=pList->nExp
7fd0: 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  r ){.    struct 
7fe0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
7ff0: 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c  ;.    int n = pL
8000: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20  ist->nAlloc*2 + 
8010: 34 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74  4;.    a = sqlit
8020: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
8030: 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65  pList->a, n*size
8040: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
8050: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
8060: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
8070: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
8080: 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 20  List->a = a;.   
8090: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
80a0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
80b0: 53 69 7a 65 28 64 62 2c 20 61 29 2f 73 69 7a 65  Size(db, a)/size
80c0: 6f 66 28 61 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20  of(a[0]);.  }.  
80d0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61  assert( pList->a
80e0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 31 20 29  !=0 );.  if( 1 )
80f0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
8100: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
8110: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
8120: 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20  ist->nExpr++];. 
8130: 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c     memset(pItem,
8140: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65   0, sizeof(*pIte
8150: 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  m));.    pItem->
8160: 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
8170: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73   }.  return pLis
8180: 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20  t;..no_mem:     
8190: 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b  .  /* Avoid leak
81a0: 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61  ing memory if ma
81b0: 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e  lloc has failed.
81c0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
81d0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
81e0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  r);.  sqlite3Exp
81f0: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
8200: 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
8210: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
8220: 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b   the ExprList.a[
8230: 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20  ].zName element 
8240: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
8250: 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a  ntly added item.
8260: 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ** on the expres
8270: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
8280: 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20   pList might be 
8290: 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  NULL following a
82a0: 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75  n OOM error.  Bu
82b0: 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e  t pName should n
82c0: 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e  ever be.** NULL.
82d0: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
82e0: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20  location fails, 
82f0: 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  the pParse->db->
8300: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
8310: 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  g.** is set..*/.
8320: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
8330: 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50  ListSetName(.  P
8340: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
8350: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
8360: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
8370: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
8380: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
8390: 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74  o which to add t
83a0: 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f  he span. */.  To
83b0: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20  ken *pName,     
83c0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f        /* Name to
83d0: 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69   be added */.  i
83e0: 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20  nt dequote      
83f0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
8400: 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65  o cause the name
8410: 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20   to be dequoted 
8420: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
8430: 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72  pList!=0 || pPar
8440: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
8450: 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  iled!=0 );.  if(
8460: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74   pList ){.    st
8470: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
8480: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61  em *pItem;.    a
8490: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
84a0: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74  xpr>0 );.    pIt
84b0: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
84c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  List->nExpr-1];.
84d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
84e0: 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20  m->zName==0 );. 
84f0: 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20     pItem->zName 
8500: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
8510: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
8520: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
8530: 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75  n);.    if( dequ
8540: 6f 74 65 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e  ote && pItem->zN
8550: 61 6d 65 20 29 20 73 71 6c 69 74 65 33 44 65 71  ame ) sqlite3Deq
8560: 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  uote(pItem->zNam
8570: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
8580: 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73   Set the ExprLis
8590: 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d  t.a[].zSpan elem
85a0: 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ent of the most 
85b0: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69  recently added i
85c0: 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78  tem.** on the ex
85d0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
85e0: 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74  *.** pList might
85f0: 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69   be NULL followi
8600: 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  ng an OOM error.
8610: 20 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75    But pSpan shou
8620: 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e  ld never be.** N
8630: 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ULL.  If a memor
8640: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
8650: 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e  ls, the pParse->
8660: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8670: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e   flag.** is set.
8680: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8690: 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28  ExprListSetSpan(
86a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
86b0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
86c0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
86d0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
86e0: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
86f0: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
8700: 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a  dd the span. */.
8710: 20 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61    ExprSpan *pSpa
8720: 6e 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  n         /* The
8730: 20 73 70 61 6e 20 74 6f 20 62 65 20 61 64 64 65   span to be adde
8740: 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  d */.){.  sqlite
8750: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
8760: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  db;.  assert( pL
8770: 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ist!=0 || db->ma
8780: 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b  llocFailed!=0 );
8790: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
87a0: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
87b0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
87c0: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
87d0: 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  t->nExpr-1];.   
87e0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
87f0: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61  nExpr>0 );.    a
8800: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
8810: 63 46 61 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d  cFailed || pItem
8820: 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e  ->pExpr==pSpan->
8830: 70 45 78 70 72 20 29 3b 0a 20 20 20 20 73 71 6c  pExpr );.    sql
8840: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
8850: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
8860: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
8870: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
8880: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70  p(db, (char*)pSp
8890: 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20  an->zStart,.    
88a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88c0: 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e  (int)(pSpan->zEn
88d0: 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72  d - pSpan->zStar
88e0: 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  t));.  }.}../*.*
88f0: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
8900: 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20  ion list pEList 
8910: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
8920: 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e  an iLimit elemen
8930: 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  ts,.** leave an 
8940: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
8950: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
8960: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
8970: 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50  CheckLength(.  P
8980: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
8990: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
89a0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
89b0: 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74  zObject.){.  int
89c0: 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   mx = pParse->db
89d0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
89e0: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20  LIMIT_COLUMN];. 
89f0: 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73   testcase( pELis
8a00: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
8a10: 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74  pr==mx );.  test
8a20: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
8a30: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
8a40: 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c  x+1 );.  if( pEL
8a50: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
8a60: 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73  Expr>mx ){.    s
8a70: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8a80: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
8a90: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c   columns in %s",
8aa0: 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d   zObject);.  }.}
8ab0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
8ac0: 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73  n entire express
8ad0: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ion list..*/.voi
8ae0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
8af0: 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
8b00: 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *db, ExprList *p
8b10: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
8b20: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
8b30: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
8b40: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
8b50: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
8b60: 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c  ( pList->a!=0 ||
8b70: 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   (pList->nExpr==
8b80: 30 20 26 26 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  0 && pList->nAll
8b90: 6f 63 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65  oc==0) );.  asse
8ba0: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
8bb0: 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20  <=pList->nAlloc 
8bc0: 29 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  );.  for(pItem=p
8bd0: 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
8be0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
8bf0: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
8c00: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8c10: 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45  te(db, pItem->pE
8c20: 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
8c30: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
8c40: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  m->zName);.    s
8c50: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8c60: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a   pItem->zSpan);.
8c70: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
8c80: 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  ree(db, pList->a
8c90: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
8ca0: 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  ee(db, pList);.}
8cb0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ../*.** These ro
8cc0: 75 74 69 6e 65 73 20 61 72 65 20 57 61 6c 6b 65  utines are Walke
8cd0: 72 20 63 61 6c 6c 62 61 63 6b 73 2e 20 20 57 61  r callbacks.  Wa
8ce0: 6c 6b 65 72 2e 75 2e 70 69 20 69 73 20 61 20 70  lker.u.pi is a p
8cf0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
8d00: 69 6e 74 65 67 65 72 2e 20 20 54 68 65 73 65 20  integer.  These 
8d10: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 68 65  routines are che
8d20: 63 6b 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73  cking an express
8d30: 69 6f 6e 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66  ion to see.** if
8d40: 20 69 74 20 69 73 20 61 20 63 6f 6e 73 74 61 6e   it is a constan
8d50: 74 2e 20 20 53 65 74 20 2a 57 61 6c 6b 65 72 2e  t.  Set *Walker.
8d60: 75 2e 70 69 20 74 6f 20 30 20 69 66 20 74 68 65  u.pi to 0 if the
8d70: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a   expression is.*
8d80: 2a 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 2e 0a  * not constant..
8d90: 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c  **.** These call
8da0: 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72  back routines ar
8db0: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
8dc0: 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ent the followin
8dd0: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c  g:.**.**     sql
8de0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
8df0: 6e 74 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69  nt().**     sqli
8e00: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
8e10: 74 4e 6f 74 4a 6f 69 6e 28 29 0a 2a 2a 20 20 20  tNotJoin().**   
8e20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
8e30: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
8e40: 6e 28 29 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  n().**.*/.static
8e50: 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43   int exprNodeIsC
8e60: 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a  onstant(Walker *
8e70: 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
8e80: 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20  Expr){..  /* If 
8e90: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 69 73 20  pWalker->u.i is 
8ea0: 33 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20  3 then any term 
8eb0: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
8ec0: 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f  n that comes fro
8ed0: 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72  m.  ** the ON or
8ee0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
8ef0: 66 20 61 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c  f a join disqual
8f00: 69 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73  ifies the expres
8f10: 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62  sion.  ** from b
8f20: 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20  eing considered 
8f30: 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69  constant. */.  i
8f40: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d  f( pWalker->u.i=
8f50: 3d 33 20 26 26 20 45 78 70 72 48 61 73 41 6e 79  =3 && ExprHasAny
8f60: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
8f70: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
8f80: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69      pWalker->u.i
8f90: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
8fa0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
8fb0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
8fc0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43  ->op ){.    /* C
8fd0: 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e  onsider function
8fe0: 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74  s to be constant
8ff0: 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72   if all their ar
9000: 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73  guments are cons
9010: 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20  tant.    ** and 
9020: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20  pWalker->u.i==2 
9030: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  */.    case TK_F
9040: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69  UNCTION:.      i
9050: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d  f( pWalker->u.i=
9060: 3d 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =2 ) return 0;. 
9070: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
9080: 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65  ough */.    case
9090: 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65   TK_ID:.    case
90a0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20   TK_COLUMN:.    
90b0: 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
90c0: 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  TION:.    case T
90d0: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
90e0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
90f0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  xpr->op==TK_ID )
9100: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9110: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
9120: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
9130: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
9140: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
9150: 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  TION );.      te
9160: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
9170: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
9180: 20 29 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b 65   );.      pWalke
9190: 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 20 20  r->u.i = 0;.    
91a0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
91b0: 72 74 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  rt;.    default:
91c0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
91d0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
91e0: 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 65 6c 65  ELECT ); /* sele
91f0: 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  ctNodeIsConstant
9200: 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a   will disallow *
9210: 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
9220: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
9230: 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 65 6c  EXISTS ); /* sel
9240: 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  ectNodeIsConstan
9250: 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20  t will disallow 
9260: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
9270: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
9280: 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  }.}.static int s
9290: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
92a0: 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ant(Walker *pWal
92b0: 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74  ker, Select *Not
92c0: 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Used){.  UNUSED_
92d0: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
92e0: 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 75  d);.  pWalker->u
92f0: 2e 69 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  .i = 0;.  return
9300: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74   WRC_Abort;.}.st
9310: 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 43  atic int exprIsC
9320: 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e  onst(Expr *p, in
9330: 74 20 69 6e 69 74 46 6c 61 67 29 7b 0a 20 20 57  t initFlag){.  W
9340: 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 75 2e 69  alker w;.  w.u.i
9350: 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77   = initFlag;.  w
9360: 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
9370: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
9380: 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ant;.  w.xSelect
9390: 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63  Callback = selec
93a0: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b  tNodeIsConstant;
93b0: 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
93c0: 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
93d0: 75 72 6e 20 77 2e 75 2e 69 3b 0a 7d 0a 0a 2f 2a  urn w.u.i;.}../*
93e0: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
93f0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
9400: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
9410: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
9420: 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66  tant.** and 0 if
9430: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
9440: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
9450: 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  on calls..**.** 
9460: 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
9470: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
9480: 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74  n, a double-quot
9490: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22  ed string (ex: "
94a0: 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73  abc").** is cons
94b0: 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c  idered a variabl
94c0: 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71  e but a single-q
94d0: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
94e0: 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61  : 'abc') is.** a
94f0: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e   constant..*/.in
9500: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
9510: 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29  onstant(Expr *p)
9520: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
9530: 73 43 6f 6e 73 74 28 70 2c 20 31 29 3b 0a 7d 0a  sConst(p, 1);.}.
9540: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
9550: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
9560: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
9570: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
9580: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20  onstant.** that 
9590: 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74  does no originat
95a0: 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72  e from the ON or
95b0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
95c0: 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74  f a join..** Ret
95d0: 75 72 6e 20 30 20 69 66 20 69 74 20 69 6e 76 6f  urn 0 if it invo
95e0: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
95f0: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
9600: 20 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a   or terms from.*
9610: 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47  * an ON or USING
9620: 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20   clause..*/.int 
9630: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
9640: 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70  stantNotJoin(Exp
9650: 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *p){.  return 
9660: 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33  exprIsConst(p, 3
9670: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
9680: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
9690: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ree.  Return 1 i
96a0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
96b0: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
96c0: 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61  or a function ca
96d0: 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74  ll with constant
96e0: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74   arguments.  Ret
96f0: 75 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65  urn and 0 if the
9700: 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61  re.** are any va
9710: 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46  riables..**.** F
9720: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
9730: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
9740: 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
9750: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
9760: 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
9770: 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
9780: 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
9790: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
97a0: 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
97b0: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
97c0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
97d0: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
97e0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74  (Expr *p){.  ret
97f0: 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28  urn exprIsConst(
9800: 70 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p, 2);.}../*.** 
9810: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
9820: 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73  n p codes a cons
9830: 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61  tant integer tha
9840: 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
9850: 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61  h.** to fit in a
9860: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
9870: 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75   return 1 and pu
9880: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
9890: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e  he integer.** in
98a0: 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68   *pValue.  If th
98b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
98c0: 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f  not an integer o
98d0: 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62  r if it is too b
98e0: 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20  ig.** to fit in 
98f0: 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20  a signed 32-bit 
9900: 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
9910: 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61  0 and leave *pVa
9920: 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  lue unchanged..*
9930: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
9940: 72 49 73 49 6e 74 65 67 65 72 28 45 78 70 72 20  rIsInteger(Expr 
9950: 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29  *p, int *pValue)
9960: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  {.  int rc = 0;.
9970: 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 78 70 72  .  /* If an expr
9980: 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74  ession is an int
9990: 65 67 65 72 20 6c 69 74 65 72 61 6c 20 74 68 61  eger literal tha
99a0: 74 20 66 69 74 73 20 69 6e 20 61 20 73 69 67 6e  t fits in a sign
99b0: 65 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69  ed 32-bit.  ** i
99c0: 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65  nteger, then the
99d0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61   EP_IntValue fla
99e0: 67 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65  g will have alre
99f0: 61 64 79 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a  ady been set */.
9a00: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21    assert( p->op!
9a10: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28  =TK_INTEGER || (
9a20: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  p->flags & EP_In
9a30: 74 56 61 6c 75 65 29 21 3d 30 0a 20 20 20 20 20  tValue)!=0.     
9a40: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
9a50: 47 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54  GetInt32(p->u.zT
9a60: 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b  oken, &rc)==0 );
9a70: 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73  ..  if( p->flags
9a80: 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
9a90: 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20  {.    *pValue = 
9aa0: 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20  p->u.iValue;.   
9ab0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
9ac0: 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
9ad0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50  {.    case TK_UP
9ae0: 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  LUS: {.      rc 
9af0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  = sqlite3ExprIsI
9b00: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
9b10: 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20   pValue);.      
9b20: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
9b30: 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
9b40: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a   {.      int v;.
9b50: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9b60: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
9b70: 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a  ->pLeft, &v) ){.
9b80: 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20          *pValue 
9b90: 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63  = -v;.        rc
9ba0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
9bb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9bc0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72  .    default: br
9bd0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
9be0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
9bf0: 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74  eturn FALSE if t
9c00: 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63  here is no chanc
9c10: 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  e that the expre
9c20: 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c  ssion can be NUL
9c30: 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  L..**.** If the 
9c40: 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74  expression might
9c50: 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   be NULL or if t
9c60: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
9c70: 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20   too complex.** 
9c80: 74 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54  to tell return T
9c90: 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  RUE.  .**.** Thi
9ca0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
9cb0: 64 20 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  d as an optimiza
9cc0: 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50  tion, to skip OP
9cd0: 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a  _IsNull opcodes.
9ce0: 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20  ** when we know 
9cf0: 74 68 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e  that a value can
9d00: 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65  not be NULL.  He
9d10: 6e 63 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73  nce, a false pos
9d20: 69 74 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e  itive.** (return
9d30: 69 6e 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e  ing TRUE when in
9d40: 20 66 61 63 74 20 74 68 65 20 65 78 70 72 65 73   fact the expres
9d50: 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62  sion can never b
9d60: 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a  e NULL) might.**
9d70: 20 62 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66   be a small perf
9d80: 6f 72 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20  ormance hit but 
9d90: 69 73 20 6f 74 68 65 72 77 69 73 65 20 68 61 72  is otherwise har
9da0: 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f  mless.  On the o
9db0: 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20  ther.** hand, a 
9dc0: 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28  false negative (
9dd0: 72 65 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20  returning FALSE 
9de0: 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  when the result 
9df0: 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a  could be NULL).*
9e00: 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65  * will likely re
9e10: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72  sult in an incor
9e20: 72 65 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f  rect answer.  So
9e30: 20 77 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20   when in doubt, 
9e40: 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a  return.** TRUE..
9e50: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
9e60: 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73  prCanBeNull(cons
9e70: 74 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38  t Expr *p){.  u8
9e80: 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d   op;.  while( p-
9e90: 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c  >op==TK_UPLUS ||
9ea0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55   p->op==TK_UMINU
9eb0: 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66  S ){ p = p->pLef
9ec0: 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f  t; }.  op = p->o
9ed0: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
9ee0: 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20  REGISTER ) op = 
9ef0: 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68  p->op2;.  switch
9f00: 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
9f10: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20   TK_INTEGER:.   
9f20: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
9f30: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
9f40: 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AT:.    case TK_
9f50: 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75  BLOB:.      retu
9f60: 72 6e 20 30 3b 0a 20 20 20 20 64 65 66 61 75 6c  rn 0;.    defaul
9f70: 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
9f80: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
9f90: 47 65 6e 65 72 61 74 65 20 61 6e 20 4f 50 5f 49  Generate an OP_I
9fa0: 73 4e 75 6c 6c 20 69 6e 73 74 72 75 63 74 69 6f  sNull instructio
9fb0: 6e 20 74 68 61 74 20 74 65 73 74 73 20 72 65 67  n that tests reg
9fc0: 69 73 74 65 72 20 69 52 65 67 20 61 6e 64 20 6a  ister iReg and j
9fd0: 75 6d 70 73 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74  umps.** to locat
9fe0: 69 6f 6e 20 69 44 65 73 74 20 69 66 20 74 68 65  ion iDest if the
9ff0: 20 76 61 6c 75 65 20 69 6e 20 69 52 65 67 20 69   value in iReg i
a000: 73 20 4e 55 4c 4c 2e 20 20 54 68 65 20 76 61 6c  s NULL.  The val
a010: 75 65 20 69 6e 20 69 52 65 67 20 0a 2a 2a 20 77  ue in iReg .** w
a020: 61 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 70  as computed by p
a030: 45 78 70 72 2e 20 20 49 66 20 77 65 20 63 61 6e  Expr.  If we can
a040: 20 6c 6f 6f 6b 20 61 74 20 70 45 78 70 72 20 61   look at pExpr a
a050: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 61  t compile-time a
a060: 6e 64 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20  nd.** determine 
a070: 74 68 61 74 20 69 74 20 63 61 6e 20 6e 65 76 65  that it can neve
a080: 72 20 67 65 6e 65 72 61 74 65 20 61 20 4e 55 4c  r generate a NUL
a090: 4c 2c 20 74 68 65 6e 20 74 68 65 20 4f 50 5f 49  L, then the OP_I
a0a0: 73 4e 75 6c 6c 20 6f 70 65 72 61 74 69 6f 6e 0a  sNull operation.
a0b0: 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65  ** can be omitte
a0c0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
a0d0: 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c  e3ExprCodeIsNull
a0e0: 4a 75 6d 70 28 0a 20 20 56 64 62 65 20 2a 76 2c  Jump(.  Vdbe *v,
a0f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a100: 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f  he VDBE under co
a110: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
a120: 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 45 78 70  const Expr *pExp
a130: 72 2c 20 20 2f 2a 20 4f 6e 6c 79 20 67 65 6e 65  r,  /* Only gene
a140: 72 61 74 65 20 4f 50 5f 49 73 4e 75 6c 6c 20 69  rate OP_IsNull i
a150: 66 20 74 68 69 73 20 65 78 70 72 20 63 61 6e 20  f this expr can 
a160: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
a170: 20 69 52 65 67 2c 20 20 20 20 20 20 20 20 20 20   iReg,          
a180: 20 2f 2a 20 54 65 73 74 20 74 68 65 20 76 61 6c   /* Test the val
a190: 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69 73  ue in this regis
a1a0: 74 65 72 20 66 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  ter for NULL */.
a1b0: 20 20 69 6e 74 20 69 44 65 73 74 20 20 20 20 20    int iDest     
a1c0: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
a1d0: 72 65 20 69 66 20 74 68 65 20 76 61 6c 75 65 20  re if the value 
a1e0: 69 73 20 6e 75 6c 6c 20 2a 2f 0a 29 7b 0a 20 20  is null */.){.  
a1f0: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
a200: 61 6e 42 65 4e 75 6c 6c 28 70 45 78 70 72 29 20  anBeNull(pExpr) 
a210: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
a220: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
a230: 73 4e 75 6c 6c 2c 20 69 52 65 67 2c 20 69 44 65  sNull, iReg, iDe
a240: 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  st);.  }.}../*.*
a250: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
a260: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
a270: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74  ssion is a const
a280: 61 6e 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ant which would 
a290: 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20  be.** unchanged 
a2a0: 62 79 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77  by OP_Affinity w
a2b0: 69 74 68 20 74 68 65 20 61 66 66 69 6e 69 74 79  ith the affinity
a2c0: 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65   given in the se
a2d0: 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  cond.** argument
a2e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
a2f0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
a300: 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
a310: 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65   OP_Affinity ope
a320: 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65  ration.** can be
a330: 20 6f 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20   omitted.  When 
a340: 69 6e 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20  in doubt return 
a350: 46 41 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20  FALSE.  A false 
a360: 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68  negative.** is h
a370: 61 72 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73  armless.  A fals
a380: 65 20 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65  e positive, howe
a390: 76 65 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20  ver, can result 
a3a0: 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20  in the wrong.** 
a3b0: 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  answer..*/.int s
a3c0: 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e  qlite3ExprNeedsN
a3d0: 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  oAffinityChange(
a3e0: 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63  const Expr *p, c
a3f0: 68 61 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f  har aff){.  u8 o
a400: 70 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51  p;.  if( aff==SQ
a410: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 20  LITE_AFF_NONE ) 
a420: 72 65 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c  return 1;.  whil
a430: 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c  e( p->op==TK_UPL
a440: 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  US || p->op==TK_
a450: 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d  UMINUS ){ p = p-
a460: 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d  >pLeft; }.  op =
a470: 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70   p->op;.  if( op
a480: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20  ==TK_REGISTER ) 
a490: 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73  op = p->op2;.  s
a4a0: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
a4b0: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
a4c0: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
a4d0: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
a4e0: 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d  _INTEGER || aff=
a4f0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
a500: 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  RIC;.    }.    c
a510: 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a  ase TK_FLOAT: {.
a520: 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66        return aff
a530: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
a540: 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  L || aff==SQLITE
a550: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
a560: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
a570: 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
a580: 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49  return aff==SQLI
a590: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
a5a0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
a5b0: 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  LOB: {.      ret
a5c0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
a5d0: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
a5e0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
a5f0: 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b   p->iTable>=0 );
a600: 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65    /* p cannot be
a610: 20 70 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b   part of a CHECK
a620: 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
a630: 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69       return p->i
a640: 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20  Column<0.       
a650: 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49     && (aff==SQLI
a660: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c  TE_AFF_INTEGER |
a670: 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
a680: 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20  F_NUMERIC);.    
a690: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
a6a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
a6b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
a6c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
a6d0: 69 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  if the given str
a6e0: 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20  ing is a row-id 
a6f0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a  column name..*/.
a700: 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77  int sqlite3IsRow
a710: 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  id(const char *z
a720: 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
a730: 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57  StrICmp(z, "_ROW
a740: 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72  ID_")==0 ) retur
a750: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
a760: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f  e3StrICmp(z, "RO
a770: 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  WID")==0 ) retur
a780: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
a790: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49  e3StrICmp(z, "OI
a7a0: 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
a7b0: 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
a7c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
a7d0: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 61 62  rue if we are ab
a7e0: 6c 65 20 74 6f 20 74 68 65 20 49 4e 20 6f 70 65  le to the IN ope
a7f0: 72 61 74 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69  rator optimizati
a800: 6f 6e 20 6f 6e 20 61 0a 2a 2a 20 71 75 65 72 79  on on a.** query
a810: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a   of the form.**.
a820: 2a 2a 20 20 20 20 20 20 20 78 20 49 4e 20 28 53  **       x IN (S
a830: 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  ELECT ...).**.**
a840: 20 57 68 65 72 65 20 74 68 65 20 53 45 4c 45 43   Where the SELEC
a850: 54 2e 2e 2e 20 63 6c 61 75 73 65 20 69 73 20 61  T... clause is a
a860: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  s specified by t
a870: 68 65 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  he parameter to 
a880: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e  this.** routine.
a890: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 65 6c 65 63  .**.** The Selec
a8a0: 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  t object passed 
a8b0: 69 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  in has already b
a8c0: 65 65 6e 20 70 72 65 70 72 6f 63 65 73 73 65 64  een preprocessed
a8d0: 20 61 6e 64 20 6e 6f 0a 2a 2a 20 65 72 72 6f 72   and no.** error
a8e0: 73 20 68 61 76 65 20 62 65 65 6e 20 66 6f 75 6e  s have been foun
a8f0: 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  d..*/.#ifndef SQ
a900: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
a910: 52 59 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  RY.static int is
a920: 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
a930: 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  t(Select *p){.  
a940: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
a950: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
a960: 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  t;.  Table *pTab
a970: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
a980: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
a990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 69             /* ri
a9a0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
a9b0: 20 49 4e 20 69 73 20 53 45 4c 45 43 54 20 2a 2f   IN is SELECT */
a9c0: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
a9d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
a9e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74            /* Not
a9f0: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
aa00: 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  CT */.  if( p->s
aa10: 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
aa20: 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
aa30: 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74  ate) ){.    test
aa40: 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61  case( (p->selFla
aa50: 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
aa60: 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
aa70: 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b  ==SF_Distinct );
aa80: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28  .    testcase( (
aa90: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
aaa0: 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
aab0: 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67  gregate))==SF_Ag
aac0: 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72  gregate );.    r
aad0: 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44  eturn 0; /* No D
aae0: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
aaf0: 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65  and no aggregate
ab00: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
ab10: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  }.  assert( p->p
ab20: 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20  GroupBy==0 );   
ab30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
ab40: 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  s no GROUP BY cl
ab50: 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ause */.  if( p-
ab60: 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
ab70: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
ab80: 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54   /* Has no LIMIT
ab90: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73 73   clause */.  ass
aba0: 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d  ert( p->pOffset=
abb0: 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
abc0: 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20      /* No LIMIT 
abd0: 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54 20  means no OFFSET 
abe0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65  */.  if( p->pWhe
abf0: 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  re ) return 0;  
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
ac10: 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  as no WHERE clau
ac20: 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70  se */.  pSrc = p
ac30: 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
ac40: 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69  ( pSrc!=0 );.  i
ac50: 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  f( pSrc->nSrc!=1
ac60: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
ac70: 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20        /* Single 
ac80: 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61  term in FROM cla
ac90: 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72  use */.  if( pSr
aca0: 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20  c->a[0].pSelect 
acb0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
acc0: 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61  /* FROM is not a
acd0: 20 73 75 62 71 75 65 72 79 20 6f 72 20 76 69 65   subquery or vie
ace0: 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53  w */.  pTab = pS
acf0: 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20  rc->a[0].pTab;. 
ad00: 20 69 66 28 20 4e 45 56 45 52 28 70 54 61 62 3d   if( NEVER(pTab=
ad10: 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  =0) ) return 0;.
ad20: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
ad30: 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20  pSelect==0 );   
ad40: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d           /* FROM
ad50: 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61   clause is not a
ad60: 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49   view */.  if( I
ad70: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
ad80: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
ad90: 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
ada0: 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74   not a virtual t
adb0: 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74  able */.  pEList
adc0: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
add0: 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  if( pEList->nExp
ade0: 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  r!=1 ) return 0;
adf0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 6f         /* One co
ae00: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75  lumn in the resu
ae10: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 66 28 20  lt set */.  if( 
ae20: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
ae30: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
ae40: 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a  N ) return 0; /*
ae50: 20 52 65 73 75 6c 74 20 69 73 20 61 20 63 6f 6c   Result is a col
ae60: 75 6d 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  umn */.  return 
ae70: 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
ae80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
ae90: 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  ERY */../*.** Th
aea0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
aeb0: 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65  sed by the imple
aec0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
aed0: 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74   IN (...) operat
aee0: 6f 72 2e 0a 2a 2a 20 49 74 27 73 20 6a 6f 62 20  or..** It's job 
aef0: 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72  is to find or cr
af00: 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 73 74  eate a b-tree st
af10: 72 75 63 74 75 72 65 20 74 68 61 74 20 6d 61 79  ructure that may
af20: 20 62 65 20 75 73 65 64 0a 2a 2a 20 65 69 74 68   be used.** eith
af30: 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d  er to test for m
af40: 65 6d 62 65 72 73 68 69 70 20 6f 66 20 74 68 65  embership of the
af50: 20 28 2e 2e 2e 29 20 73 65 74 20 6f 72 20 74 6f   (...) set or to
af60: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
af70: 0a 2a 2a 20 69 74 73 20 6d 65 6d 62 65 72 73 2c  .** its members,
af80: 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63   skipping duplic
af90: 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ates..**.** The 
afa0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 75 72  index of the cur
afb0: 73 6f 72 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  sor opened on th
afc0: 65 20 62 2d 74 72 65 65 20 28 64 61 74 61 62 61  e b-tree (databa
afd0: 73 65 20 74 61 62 6c 65 2c 20 64 61 74 61 62 61  se table, databa
afe0: 73 65 20 69 6e 64 65 78 20 0a 2a 2a 20 6f 72 20  se index .** or 
aff0: 65 70 68 65 72 6d 61 6c 20 74 61 62 6c 65 29 20  ephermal table) 
b000: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 58 2d  is stored in pX-
b010: 3e 69 54 61 62 6c 65 20 62 65 66 6f 72 65 20 74  >iTable before t
b020: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
b030: 75 72 6e 73 2e 0a 2a 2a 20 54 68 65 20 72 65 74  urns..** The ret
b040: 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74  urned value of t
b050: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64  his function ind
b060: 69 63 61 74 65 73 20 74 68 65 20 62 2d 74 72 65  icates the b-tre
b070: 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f  e type, as follo
b080: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49  ws:.**.**   IN_I
b090: 4e 44 45 58 5f 52 4f 57 49 44 20 2d 20 54 68 65  NDEX_ROWID - The
b0a0: 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
b0b0: 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  ed on a database
b0c0: 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f   table..**   IN_
b0d0: 49 4e 44 45 58 5f 49 4e 44 45 58 20 2d 20 54 68  INDEX_INDEX - Th
b0e0: 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
b0f0: 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73  ned on a databas
b100: 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e  e index..**   IN
b110: 5f 49 4e 44 45 58 5f 45 50 48 20 2d 20 20 20 54  _INDEX_EPH -   T
b120: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
b130: 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61  ened on a specia
b140: 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a  lly created and.
b150: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
b160: 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20        populated 
b170: 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e  epheremal table.
b180: 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69  .**.** An existi
b190: 6e 67 20 62 2d 74 72 65 65 20 6d 61 79 20 6f 6e  ng b-tree may on
b1a0: 6c 79 20 62 65 20 75 73 65 64 20 69 66 20 74 68  ly be used if th
b1b0: 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74  e SELECT is of t
b1c0: 68 65 20 73 69 6d 70 6c 65 0a 2a 2a 20 66 6f 72  he simple.** for
b1d0: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  m:.**.**     SEL
b1e0: 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f  ECT <column> FRO
b1f0: 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20  M <table>.**.** 
b200: 49 66 20 74 68 65 20 70 72 4e 6f 74 46 6f 75 6e  If the prNotFoun
b210: 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  d parameter is 0
b220: 2c 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65  , then the b-tre
b230: 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  e will be used t
b240: 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72  o iterate.** thr
b250: 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d  ough the set mem
b260: 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67 20 61  bers, skipping a
b270: 6e 79 20 64 75 70 6c 69 63 61 74 65 73 2e 20 49  ny duplicates. I
b280: 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 0a 2a  n this case an.*
b290: 2a 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  * epheremal tabl
b2a0: 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 75  e must be used u
b2b0: 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63 74  nless the select
b2c0: 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 67  ed <column> is g
b2d0: 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20  uaranteed.** to 
b2e0: 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68  be unique - eith
b2f0: 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69 73  er because it is
b300: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
b310: 41 52 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a 2a  ARY KEY or it.**
b320: 20 68 61 73 20 61 20 55 4e 49 51 55 45 20 63 6f   has a UNIQUE co
b330: 6e 73 74 72 61 69 6e 74 20 6f 72 20 55 4e 49 51  nstraint or UNIQ
b340: 55 45 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  UE index..**.** 
b350: 49 66 20 74 68 65 20 70 72 4e 6f 74 46 6f 75 6e  If the prNotFoun
b360: 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  d parameter is n
b370: 6f 74 20 30 2c 20 74 68 65 6e 20 74 68 65 20 62  ot 0, then the b
b380: 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73  -tree will be us
b390: 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20  ed .** for fast 
b3a0: 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74  set membership t
b3b0: 65 73 74 73 2e 20 49 6e 20 74 68 69 73 20 63 61  ests. In this ca
b3c0: 73 65 20 61 6e 20 65 70 68 65 72 65 6d 61 6c 20  se an epheremal 
b3d0: 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62  table must .** b
b3e0: 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c 63  e used unless <c
b3f0: 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e 20 49 4e 54  olumn> is an INT
b400: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
b410: 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 63 61 6e   or an index can
b420: 20 0a 2a 2a 20 62 65 20 66 6f 75 6e 64 20 77 69   .** be found wi
b430: 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61 73 20 69  th <column> as i
b440: 74 73 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  ts left-most col
b450: 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  umn..**.** When 
b460: 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 62 65  the b-tree is be
b470: 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65 6d  ing used for mem
b480: 62 65 72 73 68 69 70 20 74 65 73 74 73 2c 20 74  bership tests, t
b490: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
b4a0: 69 6f 6e 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  ion.** needs to 
b4b0: 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20  know whether or 
b4c0: 6e 6f 74 20 74 68 65 20 73 74 72 75 63 74 75 72  not the structur
b4d0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 53 51  e contains an SQ
b4e0: 4c 20 4e 55 4c 4c 20 0a 2a 2a 20 76 61 6c 75 65  L NULL .** value
b4f0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 72   in order to cor
b500: 72 65 63 74 6c 79 20 65 76 61 6c 75 61 74 65 20  rectly evaluate 
b510: 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 69 6b 65  expressions like
b520: 20 22 58 20 49 4e 20 28 59 2c 20 5a 29 22 2e 0a   "X IN (Y, Z)"..
b530: 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  ** If there is a
b540: 6e 79 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  ny chance that t
b550: 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63  he (...) might c
b560: 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61  ontain a NULL va
b570: 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d  lue at.** runtim
b580: 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69 73 74  e, then a regist
b590: 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  er is allocated 
b5a0: 61 6e 64 20 74 68 65 20 72 65 67 69 73 74 65 72  and the register
b5b0: 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a   number written.
b5c0: 2a 2a 20 74 6f 20 2a 70 72 4e 6f 74 46 6f 75 6e  ** to *prNotFoun
b5d0: 64 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  d. If there is n
b5e0: 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  o chance that th
b5f0: 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73  e (...) contains
b600: 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65   a.** NULL value
b610: 2c 20 74 68 65 6e 20 2a 70 72 4e 6f 74 46 6f 75  , then *prNotFou
b620: 6e 64 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  nd is left uncha
b630: 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nged..**.** If a
b640: 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c   register is all
b650: 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c  ocated and its l
b660: 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69  ocation stored i
b670: 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2c 20 74  n *prNotFound, t
b680: 68 65 6e 0a 2a 2a 20 69 74 73 20 69 6e 69 74 69  hen.** its initi
b690: 61 6c 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c  al value is NULL
b6a0: 2e 20 20 49 66 20 74 68 65 20 28 2e 2e 2e 29 20  .  If the (...) 
b6b0: 64 6f 65 73 20 6e 6f 74 20 72 65 6d 61 69 6e 20  does not remain 
b6c0: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20  constant.** for 
b6d0: 74 68 65 20 64 75 72 61 74 69 6f 6e 20 6f 66 20  the duration of 
b6e0: 74 68 65 20 71 75 65 72 79 20 28 69 2e 65 2e 20  the query (i.e. 
b6f0: 74 68 65 20 53 45 4c 45 43 54 20 77 69 74 68 69  the SELECT withi
b700: 6e 20 74 68 65 20 28 2e 2e 2e 29 0a 2a 2a 20 69  n the (...).** i
b710: 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  s a correlated s
b720: 75 62 71 75 65 72 79 29 20 74 68 65 6e 20 74 68  ubquery) then th
b730: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 61  e value of the a
b740: 6c 6c 6f 63 61 74 65 64 20 72 65 67 69 73 74 65  llocated registe
b750: 72 20 69 73 0a 2a 2a 20 72 65 73 65 74 20 74 6f  r is.** reset to
b760: 20 4e 55 4c 4c 20 65 61 63 68 20 74 69 6d 65 20   NULL each time 
b770: 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
b780: 72 65 72 75 6e 2e 20 54 68 69 73 20 61 6c 6c 6f  rerun. This allo
b790: 77 73 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72  ws the.** caller
b7a0: 20 74 6f 20 75 73 65 20 76 64 62 65 20 63 6f 64   to use vdbe cod
b7b0: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  e equivalent to 
b7c0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
b7d0: 2a 0a 2a 2a 20 20 20 69 66 28 20 72 65 67 69 73  *.**   if( regis
b7e0: 74 65 72 3d 3d 4e 55 4c 4c 20 29 7b 0a 2a 2a 20  ter==NULL ){.** 
b7f0: 20 20 20 20 68 61 73 5f 6e 75 6c 6c 20 3d 20 3c      has_null = <
b800: 74 65 73 74 20 69 66 20 64 61 74 61 20 73 74 72  test if data str
b810: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
b820: 6e 75 6c 6c 3e 0a 2a 2a 20 20 20 20 20 72 65 67  null>.**     reg
b830: 69 73 74 65 72 20 3d 20 31 0a 2a 2a 20 20 20 7d  ister = 1.**   }
b840: 0a 2a 2a 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  .**.** in order 
b850: 74 6f 20 61 76 6f 69 64 20 72 75 6e 6e 69 6e 67  to avoid running
b860: 20 74 68 65 20 3c 74 65 73 74 20 69 66 20 64 61   the <test if da
b870: 74 61 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ta structure con
b880: 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 74  tains null>.** t
b890: 65 73 74 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74  est more often t
b8a0: 68 61 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79  han is necessary
b8b0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
b8c0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
b8d0: 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e  Y.int sqlite3Fin
b8e0: 64 49 6e 49 6e 64 65 78 28 50 61 72 73 65 20 2a  dInIndex(Parse *
b8f0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 58  pParse, Expr *pX
b900: 2c 20 69 6e 74 20 2a 70 72 4e 6f 74 46 6f 75 6e  , int *prNotFoun
b910: 64 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b  d){.  Select *p;
b920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b930: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b940: 45 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69 67  ELECT to the rig
b950: 68 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f  ht of IN operato
b960: 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65  r */.  int eType
b970: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
b980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b990: 54 79 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c  Type of RHS tabl
b9a0: 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f  e. IN_INDEX_* */
b9b0: 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50  .  int iTab = pP
b9c0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
b9d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
b9e0: 6f 72 20 6f 66 20 74 68 65 20 52 48 53 20 74 61  or of the RHS ta
b9f0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73  ble */.  int mus
ba00: 74 42 65 55 6e 69 71 75 65 20 3d 20 28 70 72 4e  tBeUnique = (prN
ba10: 6f 74 46 6f 75 6e 64 3d 3d 30 29 3b 20 20 20 2f  otFound==0);   /
ba20: 2a 20 54 72 75 65 20 69 66 20 52 48 53 20 6d 75  * True if RHS mu
ba30: 73 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a  st be unique */.
ba40: 0a 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f  .  assert( pX->o
ba50: 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 0a 20 20 2f  p==TK_IN );..  /
ba60: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
ba70: 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61  f an existing ta
ba80: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 63 61 6e  ble or index can
ba90: 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a   be used to.  **
baa0: 20 73 61 74 69 73 66 79 20 74 68 65 20 71 75 65   satisfy the que
bab0: 72 79 2e 20 20 54 68 69 73 20 69 73 20 70 72 65  ry.  This is pre
bac0: 66 65 72 61 62 6c 65 20 74 6f 20 67 65 6e 65 72  ferable to gener
bad0: 61 74 69 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a  ating a new .  *
bae0: 2a 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  * ephemeral tabl
baf0: 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 28 45  e..  */.  p = (E
bb00: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
bb10: 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  X, EP_xIsSelect)
bb20: 20 3f 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74   ? pX->x.pSelect
bb30: 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57   : 0);.  if( ALW
bb40: 41 59 53 28 70 50 61 72 73 65 2d 3e 6e 45 72 72  AYS(pParse->nErr
bb50: 3d 3d 30 29 20 26 26 20 69 73 43 61 6e 64 69 64  ==0) && isCandid
bb60: 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 29  ateForInOpt(p) )
bb70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
bb80: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bba0: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
bbb0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78 70 72 20  ion */.    Expr 
bbc0: 2a 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69  *pExpr = p->pELi
bbd0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 20  st->a[0].pExpr; 
bbe0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
bbf0: 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20  <column> */.    
bc00: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72  int iCol = pExpr
bc10: 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  ->iColumn;      
bc20: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
bc30: 6f 66 20 63 6f 6c 75 6d 6e 20 3c 63 6f 6c 75 6d  of column <colum
bc40: 6e 3e 20 2a 2f 0a 20 20 20 20 56 64 62 65 20 2a  n> */.    Vdbe *
bc50: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
bc60: 62 65 28 70 50 61 72 73 65 29 3b 20 20 20 20 20  be(pParse);     
bc70: 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68   /* Virtual mach
bc80: 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ine being coded 
bc90: 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  */.    Table *pT
bca0: 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ab = p->pSrc->a[
bcb0: 30 5d 2e 70 54 61 62 3b 20 20 20 20 20 20 2f 2a  0].pTab;      /*
bcc0: 20 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20   Table <table>. 
bcd0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20  */.    int iDb; 
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bd00: 20 44 61 74 61 62 61 73 65 20 69 64 78 20 66 6f   Database idx fo
bd10: 72 20 70 54 61 62 20 2a 2f 0a 20 20 20 0a 20 20  r pTab */.   .  
bd20: 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f    /* Code an OP_
bd30: 56 65 72 69 66 79 43 6f 6f 6b 69 65 20 61 6e 64  VerifyCookie and
bd40: 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f   OP_TableLock fo
bd50: 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20  r <table>. */.  
bd60: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
bd70: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
bd80: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
bd90: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
bda0: 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
bdb0: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  rse, iDb);.    s
bdc0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
bdd0: 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
bde0: 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
bdf0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f  ->zName);..    /
be00: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
be10: 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  is only called f
be20: 72 6f 6d 20 74 77 6f 20 70 6c 61 63 65 73 2e 20  rom two places. 
be30: 49 6e 20 62 6f 74 68 20 63 61 73 65 73 20 74 68  In both cases th
be40: 65 20 76 64 62 65 0a 20 20 20 20 2a 2a 20 68 61  e vdbe.    ** ha
be50: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
be60: 6c 6c 6f 63 61 74 65 64 2e 20 53 6f 20 61 73 73  llocated. So ass
be70: 75 6d 65 20 73 71 6c 69 74 65 33 47 65 74 56 64  ume sqlite3GetVd
be80: 62 65 28 29 20 69 73 20 61 6c 77 61 79 73 0a 20  be() is always. 
be90: 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c     ** successful
bea0: 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   here..    */.  
beb0: 20 20 61 73 73 65 72 74 28 76 29 3b 0a 20 20 20    assert(v);.   
bec0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
bed0: 20 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20       int iMem = 
bee0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
bef0: 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 3b        int iAddr;
bf00: 0a 0a 20 20 20 20 20 20 69 41 64 64 72 20 3d 20  ..      iAddr = 
bf10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bf20: 31 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 69 4d  1(v, OP_Once, iM
bf30: 65 6d 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  em);..      sqli
bf40: 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
bf50: 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20  rse, iTab, iDb, 
bf60: 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
bf70: 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20  d);.      eType 
bf80: 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  = IN_INDEX_ROWID
bf90: 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
bfa0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
bfb0: 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73  iAddr);.    }els
bfc0: 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
bfd0: 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bff0: 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
c000: 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  le */..      /* 
c010: 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  The collation se
c020: 71 75 65 6e 63 65 20 75 73 65 64 20 62 79 20 74  quence used by t
c030: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 49  he comparison. I
c040: 66 20 61 6e 20 69 6e 64 65 78 20 69 73 20 74 6f  f an index is to
c050: 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73 65  .      ** be use
c060: 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20  d in place of a 
c070: 74 65 6d 70 2d 74 61 62 6c 65 2c 20 69 74 20 6d  temp-table, it m
c080: 75 73 74 20 62 65 20 6f 72 64 65 72 65 64 20 61  ust be ordered a
c090: 63 63 6f 72 64 69 6e 67 0a 20 20 20 20 20 20 2a  ccording.      *
c0a0: 2a 20 74 6f 20 74 68 69 73 20 63 6f 6c 6c 61 74  * to this collat
c0b0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 20 2a  ion sequence.  *
c0c0: 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  /.      CollSeq 
c0d0: 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42  *pReq = sqlite3B
c0e0: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
c0f0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  Seq(pParse, pX->
c100: 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 0a  pLeft, pExpr);..
c110: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
c120: 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  hat the affinity
c130: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
c140: 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68  ed to perform th
c150: 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70  e .      ** comp
c160: 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61  arison is the sa
c170: 6d 65 20 61 73 20 74 68 65 20 61 66 66 69 6e 69  me as the affini
c180: 74 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ty of the column
c190: 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 69 74  . If.      ** it
c1a0: 20 69 73 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e   is not, it is n
c1b0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75  ot possible to u
c1c0: 73 65 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20 20  se any index..  
c1d0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 68 61      */.      cha
c1e0: 72 20 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73  r aff = comparis
c1f0: 6f 6e 41 66 66 69 6e 69 74 79 28 70 58 29 3b 0a  onAffinity(pX);.
c200: 20 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69        int affini
c210: 74 79 5f 6f 6b 20 3d 20 28 70 54 61 62 2d 3e 61  ty_ok = (pTab->a
c220: 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69  Col[iCol].affini
c230: 74 79 3d 3d 61 66 66 7c 7c 61 66 66 3d 3d 53 51  ty==aff||aff==SQ
c240: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a  LITE_AFF_NONE);.
c250: 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d  .      for(pIdx=
c260: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
c270: 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30 20 26  dx && eType==0 &
c280: 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 70  & affinity_ok; p
c290: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
c2a0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
c2b0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  Idx->aiColumn[0]
c2c0: 3d 3d 69 43 6f 6c 29 0a 20 20 20 20 20 20 20 20  ==iCol).        
c2d0: 20 26 26 20 73 71 6c 69 74 65 33 46 69 6e 64 43   && sqlite3FindC
c2e0: 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64  ollSeq(db, ENC(d
c2f0: 62 29 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  b), pIdx->azColl
c300: 5b 30 5d 2c 20 30 29 3d 3d 70 52 65 71 0a 20 20  [0], 0)==pReq.  
c310: 20 20 20 20 20 20 20 26 26 20 28 21 6d 75 73 74         && (!must
c320: 42 65 55 6e 69 71 75 65 20 7c 7c 20 28 70 49 64  BeUnique || (pId
c330: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26  x->nColumn==1 &&
c340: 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
c350: 4f 45 5f 4e 6f 6e 65 29 29 0a 20 20 20 20 20 20  OE_None)).      
c360: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
c370: 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  nt iMem = ++pPar
c380: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
c390: 20 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20      int iAddr;. 
c3a0: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70           char *p
c3b0: 4b 65 79 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  Key;.  .        
c3c0: 20 20 70 4b 65 79 20 3d 20 28 63 68 61 72 20 2a    pKey = (char *
c3d0: 29 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79  )sqlite3IndexKey
c3e0: 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  info(pParse, pId
c3f0: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 41  x);.          iA
c400: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
c410: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e  eAddOp1(v, OP_On
c420: 63 65 2c 20 69 4d 65 6d 29 3b 0a 20 20 0a 20 20  ce, iMem);.  .  
c430: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
c440: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
c450: 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20  OpenRead, iTab, 
c460: 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c  pIdx->tnum, iDb,
c470: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c490: 70 4b 65 79 2c 50 34 5f 4b 45 59 49 4e 46 4f 5f  pKey,P4_KEYINFO_
c4a0: 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20  HANDOFF);.      
c4b0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
c4c0: 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e  (v, "%s", pIdx->
c4d0: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20  zName));.       
c4e0: 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
c4f0: 44 45 58 5f 49 4e 44 45 58 3b 0a 0a 20 20 20 20  DEX_INDEX;..    
c500: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c510: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64  eJumpHere(v, iAd
c520: 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  dr);.          i
c530: 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20 26 26  f( prNotFound &&
c540: 20 21 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   !pTab->aCol[iCo
c550: 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20  l].notNull ){.  
c560: 20 20 20 20 20 20 20 20 20 20 2a 70 72 4e 6f 74            *prNot
c570: 46 6f 75 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65  Found = ++pParse
c580: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
c590: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
c5a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
c5b0: 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20  .  if( eType==0 
c5c0: 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20  ){.    /* Could 
c5d0: 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 20 65 78 69  not found an exi
c5e0: 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69  sting table or i
c5f0: 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73 20 74  ndex to use as t
c600: 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20  he RHS b-tree.. 
c610: 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61     ** We will ha
c620: 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ve to generate a
c630: 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
c640: 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e  e to do the job.
c650: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 75 62  .    */.    doub
c660: 6c 65 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  le savedNQueryLo
c670: 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75  op = pParse->nQu
c680: 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74  eryLoop;.    int
c690: 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20   rMayHaveNull = 
c6a0: 30 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49  0;.    eType = I
c6b0: 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20  N_INDEX_EPH;.   
c6c0: 20 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20   if( prNotFound 
c6d0: 29 7b 0a 20 20 20 20 20 20 2a 70 72 4e 6f 74 46  ){.      *prNotF
c6e0: 6f 75 6e 64 20 3d 20 72 4d 61 79 48 61 76 65 4e  ound = rMayHaveN
c6f0: 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ull = ++pParse->
c700: 6e 4d 65 6d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nMem;.    }else{
c710: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
c720: 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
c730: 6f 6f 70 3e 28 64 6f 75 62 6c 65 29 31 20 29 3b  oop>(double)1 );
c740: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
c750: 51 75 65 72 79 4c 6f 6f 70 20 3d 20 28 64 6f 75  QueryLoop = (dou
c760: 62 6c 65 29 31 3b 0a 20 20 20 20 20 20 69 66 28  ble)1;.      if(
c770: 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c   pX->pLeft->iCol
c780: 75 6d 6e 3c 30 20 26 26 20 21 45 78 70 72 48 61  umn<0 && !ExprHa
c790: 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 58 2c  sAnyProperty(pX,
c7a0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
c7b0: 7b 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 20  {.        eType 
c7c0: 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  = IN_INDEX_ROWID
c7d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c7e0: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53      sqlite3CodeS
c7f0: 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
c800: 20 70 58 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c   pX, rMayHaveNul
c810: 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  l, eType==IN_IND
c820: 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20 20 20 70  EX_ROWID);.    p
c830: 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
c840: 70 20 3d 20 73 61 76 65 64 4e 51 75 65 72 79 4c  p = savedNQueryL
c850: 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oop;.  }else{.  
c860: 20 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69    pX->iTable = i
c870: 54 61 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Tab;.  }.  retur
c880: 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69  n eType;.}.#endi
c890: 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
c8a0: 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61  e code for scala
c8b0: 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73 65  r subqueries use
c8c0: 64 20 61 73 20 61 20 73 75 62 71 75 65 72 79 20  d as a subquery 
c8d0: 65 78 70 72 65 73 73 69 6f 6e 2c 20 45 58 49 53  expression, EXIS
c8e0: 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65  TS,.** or IN ope
c8f0: 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65  rators.  Example
c900: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45  s:.**.**     (SE
c910: 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
c920: 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75          -- subqu
c930: 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54  ery.**     EXIST
c940: 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  S (SELECT a FROM
c950: 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20   b)   -- EXISTS 
c960: 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20  subquery.**     
c970: 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20  x IN (4,5,11)   
c980: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e             -- IN
c990: 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c   operator with l
c9a0: 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e  ist on right-han
c9b0: 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20  d side.**     x 
c9c0: 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  IN (SELECT a FRO
c9d0: 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f  M b)     -- IN o
c9e0: 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75 62  perator with sub
c9f0: 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67  query on the rig
ca00: 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78  ht.**.** The pEx
ca10: 70 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 73  pr parameter des
ca20: 63 72 69 62 65 73 20 74 68 65 20 65 78 70 72 65  cribes the expre
ca30: 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61  ssion that conta
ca40: 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70  ins the IN.** op
ca50: 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65  erator or subque
ca60: 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ry..**.** If par
ca70: 61 6d 65 74 65 72 20 69 73 52 6f 77 69 64 20 69  ameter isRowid i
ca80: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
ca90: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
caa0: 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a  r is guaranteed.
cab0: 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20  ** to be of the 
cac0: 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e  form "<rowid> IN
cad0: 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65   (?, ?, ?)", whe
cae0: 72 65 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20  re <rowid> is a 
caf0: 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20  reference.** to 
cb00: 73 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79  some integer key
cb10: 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62   column of a tab
cb20: 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68  le B-Tree. In th
cb30: 69 73 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a  is case, use an.
cb40: 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65  ** intkey B-Tree
cb50: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65   to store the se
cb60: 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c  t of IN(...) val
cb70: 75 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74  ues instead of t
cb80: 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f  he usual.** (slo
cb90: 77 65 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65  wer) variable le
cba0: 6e 67 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65  ngth keys B-Tree
cbb0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48  ..**.** If rMayH
cbc0: 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a  aveNull is non-z
cbd0: 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ero, that means 
cbe0: 74 68 61 74 20 74 68 65 20 6f 70 65 72 61 74 69  that the operati
cbf0: 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28  on is an IN.** (
cc00: 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 6f 72 20  not a SELECT or 
cc10: 45 58 49 53 54 53 29 20 61 6e 64 20 74 68 61 74  EXISTS) and that
cc20: 20 74 68 65 20 52 48 53 20 6d 69 67 68 74 20 63   the RHS might c
cc30: 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a  ontains NULLs..*
cc40: 2a 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 74  * Furthermore, t
cc50: 68 65 20 49 4e 20 69 73 20 69 6e 20 61 20 57 48  he IN is in a WH
cc60: 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64 20 74  ERE clause and t
cc70: 68 61 74 20 77 65 20 72 65 61 6c 6c 79 20 77 61  hat we really wa
cc80: 6e 74 0a 2a 2a 20 74 6f 20 69 74 65 72 61 74 65  nt.** to iterate
cc90: 20 6f 76 65 72 20 74 68 65 20 52 48 53 20 6f 66   over the RHS of
cca0: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
ccb0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 71 75 69   in order to qui
ccc0: 63 6b 6c 79 20 6c 6f 63 61 74 65 0a 2a 2a 20 61  ckly locate.** a
ccd0: 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ll corresponding
cce0: 20 4c 48 53 20 65 6c 65 6d 65 6e 74 73 2e 20 20   LHS elements.  
ccf0: 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  All this routine
cd00: 20 64 6f 65 73 20 69 73 20 69 6e 69 74 69 61 6c   does is initial
cd10: 69 7a 65 0a 2a 2a 20 74 68 65 20 72 65 67 69 73  ize.** the regis
cd20: 74 65 72 20 67 69 76 65 6e 20 62 79 20 72 4d 61  ter given by rMa
cd30: 79 48 61 76 65 4e 75 6c 6c 20 74 6f 20 4e 55 4c  yHaveNull to NUL
cd40: 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74  L.  Calling rout
cd50: 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65 0a 2a  ines will take.*
cd60: 2a 20 63 61 72 65 20 6f 66 20 63 68 61 6e 67 69  * care of changi
cd70: 6e 67 20 74 68 69 73 20 72 65 67 69 73 74 65 72  ng this register
cd80: 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55   value to non-NU
cd90: 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20 69 73  LL if the RHS is
cda0: 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a   NULL-free..**.*
cdb0: 2a 20 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c  * If rMayHaveNul
cdc0: 6c 20 69 73 20 7a 65 72 6f 2c 20 74 68 61 74 20  l is zero, that 
cdd0: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73  means that the s
cde0: 75 62 71 75 65 72 79 20 69 73 20 62 65 69 6e 67  ubquery is being
cdf0: 20 75 73 65 64 0a 2a 2a 20 66 6f 72 20 6d 65 6d   used.** for mem
ce00: 62 65 72 73 68 69 70 20 74 65 73 74 69 6e 67 20  bership testing 
ce10: 6f 6e 6c 79 2e 20 20 54 68 65 72 65 20 69 73 20  only.  There is 
ce20: 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 69 74 69  no need to initi
ce30: 61 6c 69 7a 65 20 61 6e 79 0a 2a 2a 20 72 65 67  alize any.** reg
ce40: 69 73 74 65 72 73 20 74 6f 20 69 6e 64 69 63 61  isters to indica
ce50: 74 65 20 74 68 65 20 70 72 65 73 65 6e 73 65 20  te the presense 
ce60: 6f 72 20 61 62 73 65 6e 63 65 20 6f 66 20 4e 55  or absence of NU
ce70: 4c 4c 73 20 6f 6e 20 74 68 65 20 52 48 53 2e 0a  LLs on the RHS..
ce80: 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45  **.** For a SELE
ce90: 43 54 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65  CT or EXISTS ope
cea0: 72 61 74 6f 72 2c 20 72 65 74 75 72 6e 20 74 68  rator, return th
ceb0: 65 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20  e register that 
cec0: 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65 73  holds the.** res
ced0: 75 6c 74 2e 20 20 46 6f 72 20 49 4e 20 6f 70 65  ult.  For IN ope
cee0: 72 61 74 6f 72 73 20 6f 72 20 69 66 20 61 6e 20  rators or if an 
cef0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
cf00: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
cf10: 73 20 30 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  s 0..*/.#ifndef 
cf20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
cf30: 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33  UERY.int sqlite3
cf40: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a 20  CodeSubselect(. 
cf50: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
cf60: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
cf70: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
cf80: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
cf90: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
cfa0: 49 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20 45  IN, SELECT, or E
cfb0: 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20 2a  XISTS operator *
cfc0: 2f 0a 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65  /.  int rMayHave
cfd0: 4e 75 6c 6c 2c 20 20 20 20 20 20 20 2f 2a 20 52  Null,       /* R
cfe0: 65 67 69 73 74 65 72 20 74 68 61 74 20 72 65 63  egister that rec
cff0: 6f 72 64 73 20 77 68 65 74 68 65 72 20 4e 55 4c  ords whether NUL
d000: 4c 73 20 65 78 69 73 74 20 69 6e 20 52 48 53 20  Ls exist in RHS 
d010: 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64  */.  int isRowid
d020: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d030: 49 66 20 74 72 75 65 2c 20 4c 48 53 20 6f 66 20  If true, LHS of 
d040: 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
d050: 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69   rowid */.){.  i
d060: 6e 74 20 74 65 73 74 41 64 64 72 20 3d 20 30 3b  nt testAddr = 0;
d070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d080: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69         /* One-ti
d090: 6d 65 20 74 65 73 74 20 61 64 64 72 65 73 73 20  me test address 
d0a0: 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20  */.  int rReg = 
d0b0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
d0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d0d0: 52 65 67 69 73 74 65 72 20 73 74 6f 72 69 6e 67  Register storing
d0e0: 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20   resulting */.  
d0f0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
d100: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
d110: 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
d120: 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  =0) ) return 0;.
d130: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d140: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
d150: 28 76 29 3e 30 20 29 3b 0a 20 20 73 71 6c 69 74  (v)>0 );.  sqlit
d160: 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
d170: 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 54  pParse);..  /* T
d180: 68 69 73 20 63 6f 64 65 20 6d 75 73 74 20 62 65  his code must be
d190: 20 72 75 6e 20 69 6e 20 69 74 73 20 65 6e 74 69   run in its enti
d1a0: 72 65 74 79 20 65 76 65 72 79 20 74 69 6d 65 20  rety every time 
d1b0: 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  it is encountere
d1c0: 64 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66  d.  ** if any of
d1d0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
d1e0: 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a  s true:.  **.  *
d1f0: 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68  *    *  The righ
d200: 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61  t-hand side is a
d210: 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71   correlated subq
d220: 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20  uery.  **    *  
d230: 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
d240: 69 64 65 20 69 73 20 61 6e 20 65 78 70 72 65 73  ide is an expres
d250: 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69  sion list contai
d260: 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20  ning variables. 
d270: 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65   **    *  We are
d280: 20 69 6e 73 69 64 65 20 61 20 74 72 69 67 67 65   inside a trigge
d290: 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61  r.  **.  ** If a
d2a0: 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20  ll of the above 
d2b0: 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20  are false, then 
d2c0: 77 65 20 63 61 6e 20 72 75 6e 20 74 68 69 73 20  we can run this 
d2d0: 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20  code just once. 
d2e0: 20 2a 2a 20 73 61 76 65 20 74 68 65 20 72 65 73   ** save the res
d2f0: 75 6c 74 73 2c 20 61 6e 64 20 72 65 75 73 65 20  ults, and reuse 
d300: 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20  the same result 
d310: 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e  on subsequent in
d320: 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  vocations..  */.
d330: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 41 6e    if( !ExprHasAn
d340: 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  yProperty(pExpr,
d350: 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 26   EP_VarSelect) &
d360: 26 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67  & !pParse->pTrig
d370: 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20 69 6e  gerTab ){.    in
d380: 74 20 6d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65  t mem = ++pParse
d390: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 74 65 73 74  ->nMem;.    test
d3a0: 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
d3b0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f  beAddOp1(v, OP_O
d3c0: 6e 63 65 2c 20 6d 65 6d 29 3b 0a 20 20 20 20 61  nce, mem);.    a
d3d0: 73 73 65 72 74 28 20 74 65 73 74 41 64 64 72 3e  ssert( testAddr>
d3e0: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  0 || pParse->db-
d3f0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
d400: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
d410: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
d420: 4e 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  N.  if( pParse->
d430: 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
d440: 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73    char *zMsg = s
d450: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 0a 20  qlite3MPrintf(. 
d460: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64         pParse->d
d470: 62 2c 20 22 45 58 45 43 55 54 45 20 25 73 25 73  b, "EXECUTE %s%s
d480: 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 20 74   SUBQUERY %d", t
d490: 65 73 74 41 64 64 72 3f 22 22 3a 22 43 4f 52 52  estAddr?"":"CORR
d4a0: 45 4c 41 54 45 44 20 22 2c 0a 20 20 20 20 20 20  ELATED ",.      
d4b0: 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f    pExpr->op==TK_
d4c0: 49 4e 3f 22 4c 49 53 54 22 3a 22 53 43 41 4c 41  IN?"LIST":"SCALA
d4d0: 52 22 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  R", pParse->iNex
d4e0: 74 53 65 6c 65 63 74 49 64 0a 20 20 20 20 29 3b  tSelectId.    );
d4f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d500: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
d510: 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53  lain, pParse->iS
d520: 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a  electId, 0, 0, z
d530: 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
d540: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
d550: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
d560: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
d570: 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68 61  _IN: {.      cha
d580: 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20  r affinity;     
d590: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69           /* Affi
d5a0: 6e 69 74 79 20 6f 66 20 74 68 65 20 4c 48 53 20  nity of the LHS 
d5b0: 6f 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20  of the IN */.   
d5c0: 20 20 20 4b 65 79 49 6e 66 6f 20 6b 65 79 49 6e     KeyInfo keyIn
d5d0: 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fo;            /
d5e0: 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20 74 68  * Keyinfo for th
d5f0: 65 20 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c  e generated tabl
d600: 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  e */.      int a
d610: 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddr;            
d620: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
d630: 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65  s of OP_OpenEphe
d640: 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
d650: 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  n */.      Expr 
d660: 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
d670: 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c 48  pLeft; /* the LH
d680: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
d690: 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 69  ator */..      i
d6a0: 66 28 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  f( rMayHaveNull 
d6b0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
d6c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d6d0: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 4d 61 79  OP_Null, 0, rMay
d6e0: 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  HaveNull);.     
d6f0: 20 7d 0a 0a 20 20 20 20 20 20 61 66 66 69 6e 69   }..      affini
d700: 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
d710: 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b  Affinity(pLeft);
d720: 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68  ..      /* Wheth
d730: 65 72 20 74 68 69 73 20 69 73 20 61 6e 20 27 78  er this is an 'x
d740: 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20   IN(SELECT...)' 
d750: 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78 70  or an 'x IN(<exp
d760: 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20 2a  rlist>)'.      *
d770: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74 20  * expression it 
d780: 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20 73  is handled the s
d790: 61 6d 65 20 77 61 79 2e 20 20 41 6e 20 65 70 68  ame way.  An eph
d7a0: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20  emeral table is 
d7b0: 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64  .      ** filled
d7c0: 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65   with single-fie
d7d0: 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65  ld index keys re
d7e0: 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72  presenting the r
d7f0: 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20  esults.      ** 
d800: 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20  from the SELECT 
d810: 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74  or the <exprlist
d820: 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  >..      **.    
d830: 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20    ** If the 'x' 
d840: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
d850: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72  column value, or
d860: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20   the SELECT.... 
d870: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
d880: 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75  t returns a colu
d890: 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  mn value, then t
d8a0: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  he affinity of t
d8b0: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  hat.      ** col
d8c0: 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62  umn is used to b
d8d0: 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b  uild the index k
d8e0: 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27  eys. If both 'x'
d8f0: 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a   and the.      *
d900: 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  * SELECT... stat
d910: 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
d920: 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
d930: 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64  affinity is used
d940: 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74  .      ** if eit
d950: 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e  her column has N
d960: 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45  UMERIC or INTEGE
d970: 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e  R affinity. If n
d980: 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20  either.      ** 
d990: 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45  'x' nor the SELE
d9a0: 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
d9b0: 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
d9c0: 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
d9d0: 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75  ty.      ** is u
d9e0: 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sed..      */.  
d9f0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
da00: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
da10: 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  ++;.      addr =
da20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
da30: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
da40: 65 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69  emeral, pExpr->i
da50: 54 61 62 6c 65 2c 20 21 69 73 52 6f 77 69 64 29  Table, !isRowid)
da60: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 4d 61 79  ;.      if( rMay
da70: 48 61 76 65 4e 75 6c 6c 3d 3d 30 20 29 20 73 71  HaveNull==0 ) sq
da80: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
da90: 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44  5(v, BTREE_UNORD
daa0: 45 52 45 44 29 3b 0a 20 20 20 20 20 20 6d 65 6d  ERED);.      mem
dab0: 73 65 74 28 26 6b 65 79 49 6e 66 6f 2c 20 30 2c  set(&keyInfo, 0,
dac0: 20 73 69 7a 65 6f 66 28 6b 65 79 49 6e 66 6f 29   sizeof(keyInfo)
dad0: 29 3b 0a 20 20 20 20 20 20 6b 65 79 49 6e 66 6f  );.      keyInfo
dae0: 2e 6e 46 69 65 6c 64 20 3d 20 31 3b 0a 0a 20 20  .nField = 1;..  
daf0: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
db00: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
db10: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
db20: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20          /* Case 
db30: 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28  1:     expr IN (
db40: 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20  SELECT ...).    
db50: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
db60: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
db70: 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 65 73  to write the res
db80: 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ults of the sele
db90: 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70  ct into the temp
dba0: 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a  orary.        **
dbb0: 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64   table allocated
dbc0: 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76   and opened abov
dbd0: 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
dbe0: 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
dbf0: 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 45   dest;.        E
dc00: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
dc10: 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ..        assert
dc20: 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a 20 20  ( !isRowid );.  
dc30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
dc40: 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
dc50: 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78 70  t, SRT_Set, pExp
dc60: 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  r->iTable);.    
dc70: 20 20 20 20 64 65 73 74 2e 61 66 66 69 6e 69 74      dest.affinit
dc80: 79 20 3d 20 28 75 38 29 61 66 66 69 6e 69 74 79  y = (u8)affinity
dc90: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
dca0: 28 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  ( (pExpr->iTable
dcb0: 26 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45  &0x0000FFFF)==pE
dcc0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20  xpr->iTable );. 
dcd0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e         pExpr->x.
dce0: 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20  pSelect->iLimit 
dcf0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
dd00: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
dd10: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 78 2e  Parse, pExpr->x.
dd20: 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20  pSelect, &dest) 
dd30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
dd40: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  urn 0;.        }
dd50: 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 20  .        pEList 
dd60: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
dd70: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  ct->pEList;.    
dd80: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
dd90: 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 4c 69  EList!=0 && pELi
dda0: 73 74 2d 3e 6e 45 78 70 72 3e 30 29 20 29 7b 20  st->nExpr>0) ){ 
ddb0: 0a 20 20 20 20 20 20 20 20 20 20 6b 65 79 49 6e  .          keyIn
ddc0: 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71  fo.aColl[0] = sq
ddd0: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
dde0: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
ddf0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a  , pExpr->pLeft,.
de00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
de10: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
de20: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
de30: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57     }else if( ALW
de40: 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69  AYS(pExpr->x.pLi
de50: 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  st!=0) ){.      
de60: 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20    /* Case 2:    
de70: 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69   expr IN (exprli
de80: 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  st).        **. 
de90: 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65 61         ** For ea
dea0: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62  ch expression, b
deb0: 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65  uild an index ke
dec0: 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75  y from the evalu
ded0: 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20  ation and.      
dee0: 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e    ** store it in
def0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
df00: 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20  able. If <expr> 
df10: 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  is a column, the
df20: 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  n use.        **
df30: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66   that columns af
df40: 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c  finity when buil
df50: 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e  ding index keys.
df60: 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f   If <expr> is no
df70: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63  t.        ** a c
df80: 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72  olumn, use numer
df90: 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20  ic affinity..   
dfa0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
dfb0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45  int i;.        E
dfc0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
dfd0: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
dfe0: 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
dff0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
e000: 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e  Item;.        in
e010: 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20  t r1, r2, r3;.. 
e020: 20 20 20 20 20 20 20 69 66 28 20 21 61 66 66 69         if( !affi
e030: 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20  nity ){.        
e040: 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c    affinity = SQL
e050: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
e060: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e070: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d  keyInfo.aColl[0]
e080: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
e090: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
e0a0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20 20  xpr->pLeft);..  
e0b0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
e0c0: 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
e0d0: 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69  ssion in <exprli
e0e0: 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  st>. */.        
e0f0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
e100: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
e110: 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
e120: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
e130: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
e140: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e150: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
e160: 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 66 6f   r2);.        fo
e170: 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72  r(i=pList->nExpr
e180: 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
e190: 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65  ; i>0; i--, pIte
e1a0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
e1b0: 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65  Expr *pE2 = pIte
e1c0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
e1d0: 20 20 20 20 69 6e 74 20 69 56 61 6c 54 6f 49 6e      int iValToIn
e1e0: 73 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  s;..          /*
e1f0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
e200: 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61  on is not consta
e210: 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  nt then we will 
e220: 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20  need to.        
e230: 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65    ** disable the
e240: 20 74 65 73 74 20 74 68 61 74 20 77 61 73 20 67   test that was g
e250: 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20 74  enerated above t
e260: 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20  hat makes sure. 
e270: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
e280: 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75   code only execu
e290: 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75  tes once.  Becau
e2a0: 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e  se for a non-con
e2b0: 73 74 61 6e 74 0a 20 20 20 20 20 20 20 20 20 20  stant.          
e2c0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65  ** expression we
e2d0: 20 6e 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74   need to rerun t
e2e0: 68 69 73 20 63 6f 64 65 20 65 61 63 68 20 74 69  his code each ti
e2f0: 6d 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  me..          */
e300: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 74  .          if( t
e310: 65 73 74 41 64 64 72 20 26 26 20 21 73 71 6c 69  estAddr && !sqli
e320: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
e330: 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20  t(pE2) ){.      
e340: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e350: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
e360: 20 74 65 73 74 41 64 64 72 29 3b 0a 20 20 20 20   testAddr);.    
e370: 20 20 20 20 20 20 20 20 74 65 73 74 41 64 64 72          testAddr
e380: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
e390: 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
e3a0: 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70  Evaluate the exp
e3b0: 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65  ression and inse
e3c0: 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74  rt it into the t
e3d0: 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  emp table */.   
e3e0: 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77         if( isRow
e3f0: 69 64 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  id && sqlite3Exp
e400: 72 49 73 49 6e 74 65 67 65 72 28 70 45 32 2c 20  rIsInteger(pE2, 
e410: 26 69 56 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20  &iValToIns) ){. 
e420: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
e430: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
e440: 4f 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20 70 45  OP_InsertInt, pE
e450: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c  xpr->iTable, r2,
e460: 20 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20   iValToIns);.   
e470: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
e480: 20 20 20 20 20 20 20 20 20 20 72 33 20 3d 20 73            r3 = s
e490: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
e4a0: 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 32  rget(pParse, pE2
e4b0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , r1);.         
e4c0: 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 29     if( isRowid )
e4d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
e4e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e4f0: 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  2(v, OP_MustBeIn
e500: 74 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20  t, r3,.         
e510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e520: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e530: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
e540: 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +2);.           
e550: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e560: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
e570: 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
e580: 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20 20 20 20  , r2, r3);.     
e590: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
e5a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
e5b0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
e5c0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
e5d0: 72 33 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69  r3, 1, r2, &affi
e5e0: 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  nity, 1);.      
e5f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
e600: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
e610: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
e620: 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  3, 1);.         
e630: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e640: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
e650: 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69  Insert, pExpr->i
e660: 54 61 62 6c 65 2c 20 72 32 29 3b 0a 20 20 20 20  Table, r2);.    
e670: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e680: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
e690: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
e6a0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
e6b0: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
e6c0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
e6d0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
e6e0: 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r2);.      }.  
e6f0: 20 20 20 20 69 66 28 20 21 69 73 52 6f 77 69 64      if( !isRowid
e700: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
e710: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
e720: 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a  v, addr, (void *
e730: 29 26 6b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )&keyInfo, P4_KE
e740: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a  YINFO);.      }.
e750: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e760: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
e770: 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65  EXISTS:.    case
e780: 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20   TK_SELECT:.    
e790: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
e7a0: 20 2f 2a 20 49 66 20 74 68 69 73 20 68 61 73 20   /* If this has 
e7b0: 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20 53  to be a scalar S
e7c0: 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65  ELECT.  Generate
e7d0: 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65   code to put the
e7e0: 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20  .      ** value 
e7f0: 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74 20 69  of this select i
e800: 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  n a memory cell 
e810: 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e  and record the n
e820: 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f  umber.      ** o
e830: 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  f the memory cel
e840: 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 20 20 49  l in iColumn.  I
e850: 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 49  f this is an EXI
e860: 53 54 53 2c 20 77 72 69 74 65 0a 20 20 20 20 20  STS, write.     
e870: 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 30   ** an integer 0
e880: 20 28 6e 6f 74 20 65 78 69 73 74 73 29 20 6f 72   (not exists) or
e890: 20 31 20 28 65 78 69 73 74 73 29 20 69 6e 74 6f   1 (exists) into
e8a0: 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 0a 20   a memory cell. 
e8b0: 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 63 6f       ** and reco
e8c0: 72 64 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63  rd that memory c
e8d0: 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a  ell in iColumn..
e8e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 53        */.      S
e8f0: 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20  elect *pSel;    
e900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e910: 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
e920: 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f  tatement to enco
e930: 64 65 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65  de */.      Sele
e940: 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20  ctDest dest;    
e950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e960: 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c    /* How to deal
e970: 20 77 69 74 68 20 53 45 4c 45 43 74 20 72 65 73   with SELECt res
e980: 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65  ult */..      te
e990: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
e9a0: 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a  p==TK_EXISTS );.
e9b0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
e9c0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
e9d0: 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73  LECT );.      as
e9e0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
e9f0: 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45  =TK_EXISTS || pE
ea00: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
ea10: 43 54 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73  CT );..      ass
ea20: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
ea30: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
ea40: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
ea50: 20 20 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d     pSel = pExpr-
ea60: 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  >x.pSelect;.    
ea70: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
ea80: 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30  estInit(&dest, 0
ea90: 2c 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  , ++pParse->nMem
eaa0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
eab0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
eac0: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73  T ){.        des
ead0: 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65  t.eDest = SRT_Me
eae0: 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  m;.        sqlit
eaf0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
eb00: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74  OP_Null, 0, dest
eb10: 2e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20  .iParm);.       
eb20: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
eb30: 20 22 49 6e 69 74 20 73 75 62 71 75 65 72 79 20   "Init subquery 
eb40: 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
eb50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
eb60: 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
eb70: 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20  _Exists;.       
eb80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
eb90: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
eba0: 2c 20 30 2c 20 64 65 73 74 2e 69 50 61 72 6d 29  , 0, dest.iParm)
ebb0: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
ebc0: 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20  mment((v, "Init 
ebd0: 45 58 49 53 54 53 20 72 65 73 75 6c 74 22 29 29  EXISTS result"))
ebe0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ebf0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
ec00: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  e(pParse->db, pS
ec10: 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20  el->pLimit);.   
ec20: 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20     pSel->pLimit 
ec30: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
ec40: 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45  Parse, TK_INTEGE
ec50: 52 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  R, 0, 0,.       
ec60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec70: 20 20 20 20 20 20 20 20 20 20 20 26 73 71 6c 69             &sqli
ec80: 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 29  te3IntTokens[1])
ec90: 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c  ;.      pSel->iL
eca0: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
ecb0: 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
ecc0: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20  t(pParse, pSel, 
ecd0: 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  &dest) ){.      
ece0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
ecf0: 20 20 7d 0a 20 20 20 20 20 20 72 52 65 67 20 3d    }.      rReg =
ed00: 20 64 65 73 74 2e 69 50 61 72 6d 3b 0a 20 20 20   dest.iParm;.   
ed10: 20 20 20 45 78 70 72 53 65 74 49 72 72 65 64 75     ExprSetIrredu
ed20: 63 69 62 6c 65 28 70 45 78 70 72 29 3b 0a 20 20  cible(pExpr);.  
ed30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ed40: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 74 65 73 74  .  }..  if( test
ed50: 41 64 64 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  Addr ){.    sqli
ed60: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
ed70: 76 2c 20 74 65 73 74 41 64 64 72 29 3b 0a 20 20  v, testAddr);.  
ed80: 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  }.  sqlite3ExprC
ed90: 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20  achePop(pParse, 
eda0: 31 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 52  1);..  return rR
edb0: 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  eg;.}.#endif /* 
edc0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
edd0: 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  UERY */..#ifndef
ede0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
edf0: 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  QUERY./*.** Gene
ee00: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e  rate code for an
ee10: 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a   IN expression..
ee20: 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20  **.**      x IN 
ee30: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20  (SELECT ...).** 
ee40: 20 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75 65       x IN (value
ee50: 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a  , value, ...).**
ee60: 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61 6e  .** The left-han
ee70: 64 20 73 69 64 65 20 28 4c 48 53 29 20 69 73 20  d side (LHS) is 
ee80: 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73  a scalar express
ee90: 69 6f 6e 2e 20 20 54 68 65 20 72 69 67 68 74 2d  ion.  The right-
eea0: 68 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 0a  hand side (RHS).
eeb0: 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f  ** is an array o
eec0: 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 76  f zero or more v
eed0: 61 6c 75 65 73 2e 20 20 54 68 65 20 65 78 70 72  alues.  The expr
eee0: 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 69  ession is true i
eef0: 66 20 74 68 65 20 4c 48 53 20 69 73 0a 2a 2a 20  f the LHS is.** 
ef00: 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
ef10: 20 74 68 65 20 52 48 53 2e 20 20 54 68 65 20 76   the RHS.  The v
ef20: 61 6c 75 65 20 6f 66 20 74 68 65 20 65 78 70 72  alue of the expr
ef30: 65 73 73 69 6f 6e 20 69 73 20 75 6e 6b 6e 6f 77  ession is unknow
ef40: 6e 20 28 4e 55 4c 4c 29 0a 2a 2a 20 69 66 20 74  n (NULL).** if t
ef50: 68 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c 20 6f  he LHS is NULL o
ef60: 72 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  r if the LHS is 
ef70: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  not contained wi
ef80: 74 68 69 6e 20 74 68 65 20 52 48 53 20 61 6e 64  thin the RHS and
ef90: 20 74 68 65 0a 2a 2a 20 52 48 53 20 63 6f 6e 74   the.** RHS cont
efa0: 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
efb0: 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a   NULL values..**
efc0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
efd0: 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
efe0: 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 64 65 73  will jump to des
eff0: 74 49 66 46 61 6c 73 65 20 69 66 20 74 68 65 20  tIfFalse if the 
f000: 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63  LHS is not .** c
f010: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
f020: 74 68 65 20 52 48 53 2e 20 20 49 66 20 64 75 65  the RHS.  If due
f030: 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61 6e   to NULLs we can
f040: 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 69 66  not determine if
f050: 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20 63   the LHS.** is c
f060: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
f070: 52 48 53 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  RHS then jump to
f080: 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66   destIfNull.  If
f090: 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74   the LHS is cont
f0a0: 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20  ained.** within 
f0b0: 74 68 65 20 52 48 53 20 74 68 65 6e 20 66 61 6c  the RHS then fal
f0c0: 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 73 74  l through..*/.st
f0d0: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
f0e0: 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20 50  3ExprCodeIN(.  P
f0f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
f100: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
f110: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
f120: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
f130: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
f140: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e         /* The IN
f150: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
f160: 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65   int destIfFalse
f170: 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68  ,      /* Jump h
f180: 65 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e 6f  ere if LHS is no
f190: 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  t contained in t
f1a0: 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  he RHS */.  int 
f1b0: 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20 20  destIfNull      
f1c0: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
f1d0: 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72  f the results ar
f1e0: 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f  e unknown due to
f1f0: 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69   NULLs */.){.  i
f200: 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d  nt rRhsHasNull =
f210: 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72   0;  /* Register
f220: 20 74 68 61 74 20 69 73 20 74 72 75 65 20 69 66   that is true if
f230: 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55   RHS contains NU
f240: 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 63  LL values */.  c
f250: 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20  har affinity;   
f260: 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73       /* Comparis
f270: 6f 6e 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75  on affinity to u
f280: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  se */.  int eTyp
f290: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
f2a0: 20 54 79 70 65 20 6f 66 20 74 68 65 20 52 48 53   Type of the RHS
f2b0: 20 2a 2f 0a 20 20 69 6e 74 20 72 31 3b 20 20 20   */.  int r1;   
f2c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f2d0: 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67  emporary use reg
f2e0: 69 73 74 65 72 20 2a 2f 0a 20 20 56 64 62 65 20  ister */.  Vdbe 
f2f0: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
f300: 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 6e   /* Statement un
f310: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
f320: 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74   */..  /* Comput
f330: 65 20 74 68 65 20 52 48 53 2e 20 20 20 41 66 74  e the RHS.   Aft
f340: 65 72 20 74 68 69 73 20 73 74 65 70 2c 20 74 68  er this step, th
f350: 65 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72  e table with cur
f360: 73 6f 72 0a 20 20 2a 2a 20 70 45 78 70 72 2d 3e  sor.  ** pExpr->
f370: 69 54 61 62 6c 65 20 77 69 6c 6c 20 63 6f 6e 74  iTable will cont
f380: 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20  ains the values 
f390: 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
f3a0: 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d   RHS..  */.  v =
f3b0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
f3c0: 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
f3d0: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64  ;       /* OOM d
f3e0: 65 74 65 63 74 65 64 20 70 72 69 6f 72 20 74 6f  etected prior to
f3f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f   this routine */
f400: 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
f410: 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49 4e  nt((v, "begin IN
f420: 20 65 78 70 72 22 29 29 3b 0a 20 20 65 54 79 70   expr"));.  eTyp
f430: 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  e = sqlite3FindI
f440: 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  nIndex(pParse, p
f450: 45 78 70 72 2c 20 26 72 52 68 73 48 61 73 4e 75  Expr, &rRhsHasNu
f460: 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  ll);..  /* Figur
f470: 65 20 6f 75 74 20 74 68 65 20 61 66 66 69 6e 69  e out the affini
f480: 74 79 20 74 6f 20 75 73 65 20 74 6f 20 63 72 65  ty to use to cre
f490: 61 74 65 20 61 20 6b 65 79 20 66 72 6f 6d 20 74  ate a key from t
f4a0: 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20  he results.  ** 
f4b0: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
f4c0: 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20 73  n. affinityStr s
f4d0: 74 6f 72 65 73 20 61 20 73 74 61 74 69 63 20 73  tores a static s
f4e0: 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66  tring suitable f
f4f0: 6f 72 0a 20 20 2a 2a 20 50 34 20 6f 66 20 4f 50  or.  ** P4 of OP
f500: 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20 2a  _MakeRecord..  *
f510: 2f 0a 20 20 61 66 66 69 6e 69 74 79 20 3d 20 63  /.  affinity = c
f520: 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74  omparisonAffinit
f530: 79 28 70 45 78 70 72 29 3b 0a 0a 20 20 2f 2a 20  y(pExpr);..  /* 
f540: 43 6f 64 65 20 74 68 65 20 4c 48 53 2c 20 74 68  Code the LHS, th
f550: 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c  e <expr> from "<
f560: 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e  expr> IN (...)".
f570: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
f580: 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
f590: 72 73 65 29 3b 0a 20 20 72 31 20 3d 20 73 71 6c  rse);.  r1 = sql
f5a0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
f5b0: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
f5c0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
f5d0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
f5e0: 72 31 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  r1);..  /* If th
f5f0: 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c 2c 20 74  e LHS is NULL, t
f600: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69  hen the result i
f610: 73 20 65 69 74 68 65 72 20 66 61 6c 73 65 20 6f  s either false o
f620: 72 20 4e 55 4c 4c 20 64 65 70 65 6e 64 69 6e 67  r NULL depending
f630: 0a 20 20 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72  .  ** on whether
f640: 20 74 68 65 20 52 48 53 20 69 73 20 65 6d 70 74   the RHS is empt
f650: 79 20 6f 72 20 6e 6f 74 2c 20 72 65 73 70 65 63  y or not, respec
f660: 74 69 76 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69  tively..  */.  i
f670: 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64  f( destIfNull==d
f680: 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20  estIfFalse ){.  
f690: 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f    /* Shortcut fo
f6a0: 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
f6b0: 65 20 77 68 65 72 65 20 74 68 65 20 66 61 6c 73  e where the fals
f6c0: 65 20 61 6e 64 20 4e 55 4c 4c 20 6f 75 74 63 6f  e and NULL outco
f6d0: 6d 65 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 74  mes are.    ** t
f6e0: 68 65 20 73 61 6d 65 2e 20 2a 2f 0a 20 20 20 20  he same. */.    
f6f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f700: 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
f710: 72 31 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  r1, destIfNull);
f720: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
f730: 74 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65  t addr1 = sqlite
f740: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
f750: 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 31 29 3b 0a  P_NotNull, r1);.
f760: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f770: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
f780: 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
f790: 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  e, destIfFalse);
f7a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f7b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
f7c0: 6f 2c 20 30 2c 20 64 65 73 74 49 66 4e 75 6c 6c  o, 0, destIfNull
f7d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
f7e0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
f7f0: 64 72 31 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  dr1);.  }..  if(
f800: 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
f810: 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a  _ROWID ){.    /*
f820: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
f830: 68 65 20 52 48 53 20 69 73 20 74 68 65 20 52 4f  he RHS is the RO
f840: 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74  WID of table b-t
f850: 72 65 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ree.    */.    s
f860: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f870: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
f880: 2c 20 72 31 2c 20 64 65 73 74 49 66 46 61 6c 73  , r1, destIfFals
f890: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
f8a0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
f8b0: 4e 6f 74 45 78 69 73 74 73 2c 20 70 45 78 70 72  NotExists, pExpr
f8c0: 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66  ->iTable, destIf
f8d0: 46 61 6c 73 65 2c 20 72 31 29 3b 0a 20 20 7d 65  False, r1);.  }e
f8e0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  lse{.    /* In t
f8f0: 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48  his case, the RH
f900: 53 20 69 73 20 61 6e 20 69 6e 64 65 78 20 62 2d  S is an index b-
f910: 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tree..    */.   
f920: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f930: 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74  p4(v, OP_Affinit
f940: 79 2c 20 72 31 2c 20 31 2c 20 30 2c 20 26 61 66  y, r1, 1, 0, &af
f950: 66 69 6e 69 74 79 2c 20 31 29 3b 0a 0a 20 20 20  finity, 1);..   
f960: 20 2f 2a 20 49 66 20 74 68 65 20 73 65 74 20 6d   /* If the set m
f970: 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 20 66  embership test f
f980: 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 72  ails, then the r
f990: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 0a 20 20  esult of the .  
f9a0: 20 20 2a 2a 20 22 78 20 49 4e 20 28 2e 2e 2e 29    ** "x IN (...)
f9b0: 22 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73  " expression mus
f9c0: 74 20 62 65 20 65 69 74 68 65 72 20 30 20 6f 72  t be either 0 or
f9d0: 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 73 65   NULL. If the se
f9e0: 74 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  t.    ** contain
f9f0: 73 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73  s no NULL values
fa00: 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
fa10: 74 20 69 73 20 30 2e 20 49 66 20 74 68 65 20 73  t is 0. If the s
fa20: 65 74 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  et .    ** conta
fa30: 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
fa40: 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65  NULL values, the
fa50: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  n the result of 
fa60: 74 68 65 0a 20 20 20 20 2a 2a 20 65 78 70 72 65  the.    ** expre
fa70: 73 73 69 6f 6e 20 69 73 20 61 6c 73 6f 20 4e 55  ssion is also NU
fa80: 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  LL..    */.    i
fa90: 66 28 20 72 52 68 73 48 61 73 4e 75 6c 6c 3d 3d  f( rRhsHasNull==
faa0: 30 20 7c 7c 20 64 65 73 74 49 66 46 61 6c 73 65  0 || destIfFalse
fab0: 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 7b 0a  ==destIfNull ){.
fac0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
fad0: 61 6e 63 68 20 72 75 6e 73 20 69 66 20 69 74 20  anch runs if it 
fae0: 69 73 20 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d 70  is known at comp
faf0: 69 6c 65 20 74 69 6d 65 20 74 68 61 74 20 74 68  ile time that th
fb00: 65 20 52 48 53 0a 20 20 20 20 20 20 2a 2a 20 63  e RHS.      ** c
fb10: 61 6e 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4e 55  annot contain NU
fb20: 4c 4c 20 76 61 6c 75 65 73 2e 20 54 68 69 73 20  LL values. This 
fb30: 68 61 70 70 65 6e 73 20 61 73 20 74 68 65 20 72  happens as the r
fb40: 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 6f  esult.      ** o
fb50: 66 20 61 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63  f a "NOT NULL" c
fb60: 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 74 68 65  onstraint in the
fb70: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
fb80: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
fb90: 20 2a 2a 20 41 6c 73 6f 20 72 75 6e 20 74 68 69   ** Also run thi
fba0: 73 20 62 72 61 6e 63 68 20 69 66 20 4e 55 4c 4c  s branch if NULL
fbb0: 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
fbc0: 6f 20 46 41 4c 53 45 0a 20 20 20 20 20 20 2a 2a  o FALSE.      **
fbd0: 20 66 6f 72 20 74 68 69 73 20 70 61 72 74 69 63   for this partic
fbe0: 75 6c 61 72 20 49 4e 20 6f 70 65 72 61 74 6f 72  ular IN operator
fbf0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
fc00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fc10: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46  p4Int(v, OP_NotF
fc20: 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
fc30: 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65  ble, destIfFalse
fc40: 2c 20 72 31 2c 20 31 29 3b 0a 0a 20 20 20 20 7d  , r1, 1);..    }
fc50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
fc60: 6e 20 74 68 69 73 20 62 72 61 6e 63 68 2c 20 74  n this branch, t
fc70: 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
fc80: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61   might contain a
fc90: 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 20 20 20 20   NULL and.      
fca0: 2a 2a 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  ** the presence 
fcb0: 6f 66 20 61 20 4e 55 4c 4c 20 6f 6e 20 74 68 65  of a NULL on the
fcc0: 20 52 48 53 20 6d 61 6b 65 73 20 61 20 64 69 66   RHS makes a dif
fcd0: 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65 0a 20  ference in the. 
fce0: 20 20 20 20 20 2a 2a 20 6f 75 74 63 6f 6d 65 2e       ** outcome.
fcf0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
fd00: 69 6e 74 20 6a 31 2c 20 6a 32 2c 20 6a 33 3b 0a  int j1, j2, j3;.
fd10: 0a 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  .      /* First 
fd20: 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
fd30: 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61  the LHS is conta
fd40: 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 2e  ined in the RHS.
fd50: 20 20 49 66 20 73 6f 2c 0a 20 20 20 20 20 20 2a    If so,.      *
fd60: 2a 20 74 68 65 6e 20 74 68 65 20 70 72 65 73 65  * then the prese
fd70: 6e 63 65 20 6f 66 20 4e 55 4c 4c 73 20 69 6e 20  nce of NULLs in 
fd80: 74 68 65 20 52 48 53 20 64 6f 65 73 20 6e 6f 74  the RHS does not
fd90: 20 6d 61 74 74 65 72 2c 20 73 6f 20 6a 75 6d 70   matter, so jump
fda0: 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 61  .      ** over a
fdb0: 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 74  ll of the code t
fdc0: 68 61 74 20 66 6f 6c 6c 6f 77 73 2e 0a 20 20 20  hat follows..   
fdd0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 6a 31 20 3d     */.      j1 =
fde0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fdf0: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
fe00: 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
fe10: 2c 20 30 2c 20 72 31 2c 20 31 29 3b 0a 0a 20 20  , 0, r1, 1);..  
fe20: 20 20 20 20 2f 2a 20 48 65 72 65 20 77 65 20 62      /* Here we b
fe30: 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20  egin generating 
fe40: 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 69  code that runs i
fe50: 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74  f the LHS is not
fe60: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69  .      ** contai
fe70: 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52  ned within the R
fe80: 48 53 2e 20 20 47 65 6e 65 72 61 74 65 20 61 64  HS.  Generate ad
fe90: 64 69 74 69 6f 6e 61 6c 20 63 6f 64 65 20 74 68  ditional code th
fea0: 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 65 73 74  at.      ** test
feb0: 73 20 74 68 65 20 52 48 53 20 66 6f 72 20 4e 55  s the RHS for NU
fec0: 4c 4c 73 2e 20 20 49 66 20 74 68 65 20 52 48 53  LLs.  If the RHS
fed0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c   contains a NULL
fee0: 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6a   then.      ** j
fef0: 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c  ump to destIfNul
ff00: 6c 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  l.  If there are
ff10: 20 6e 6f 20 4e 55 4c 4c 73 20 69 6e 20 74 68 65   no NULLs in the
ff20: 20 52 48 53 20 74 68 65 6e 0a 20 20 20 20 20 20   RHS then.      
ff30: 2a 2a 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49  ** jump to destI
ff40: 66 46 61 6c 73 65 2e 0a 20 20 20 20 20 20 2a 2f  fFalse..      */
ff50: 0a 20 20 20 20 20 20 6a 32 20 3d 20 73 71 6c 69  .      j2 = sqli
ff60: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
ff70: 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 52 68   OP_NotNull, rRh
ff80: 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  sHasNull);.     
ff90: 20 6a 33 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j3 = sqlite3Vdb
ffa0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
ffb0: 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  _Found, pExpr->i
ffc0: 54 61 62 6c 65 2c 20 30 2c 20 72 52 68 73 48 61  Table, 0, rRhsHa
ffd0: 73 4e 75 6c 6c 2c 20 31 29 3b 0a 20 20 20 20 20  sNull, 1);.     
ffe0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fff0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
10000 2c 20 2d 31 2c 20 72 52 68 73 48 61 73 4e 75 6c  , -1, rRhsHasNul
10010 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
10020 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
10030 20 6a 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   j3);.      sqli
10040 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10050 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 72 52 68 73   OP_AddImm, rRhs
10060 48 61 73 4e 75 6c 6c 2c 20 31 29 3b 0a 20 20 20  HasNull, 1);.   
10070 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
10080 6d 70 48 65 72 65 28 76 2c 20 6a 32 29 3b 0a 0a  mpHere(v, j2);..
10090 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f        /* Jump to
100a0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
100b0 20 74 61 72 67 65 74 20 64 65 70 65 6e 64 69 6e   target dependin
100c0 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
100d0 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  not.      ** the
100e0 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 61 20   RHS contains a 
100f0 4e 55 4c 4c 0a 20 20 20 20 20 20 2a 2f 0a 20 20  NULL.      */.  
10100 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10110 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
10120 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 64 65 73  rRhsHasNull, des
10130 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
10140 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10150 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
10160 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 0a   destIfFalse);..
10170 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 50 5f        /* The OP_
10180 46 6f 75 6e 64 20 61 74 20 74 68 65 20 74 6f 70  Found at the top
10190 20 6f 66 20 74 68 69 73 20 62 72 61 6e 63 68 20   of this branch 
101a0 6a 75 6d 70 73 20 68 65 72 65 20 77 68 65 6e 20  jumps here when 
101b0 74 72 75 65 2c 20 0a 20 20 20 20 20 20 2a 2a 20  true, .      ** 
101c0 63 61 75 73 69 6e 67 20 74 68 65 20 6f 76 65 72  causing the over
101d0 61 6c 6c 20 49 4e 20 65 78 70 72 65 73 73 69 6f  all IN expressio
101e0 6e 20 65 76 61 6c 75 61 74 69 6f 6e 20 74 6f 20  n evaluation to 
101f0 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 20 20  fall through..  
10200 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
10210 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
10220 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 7d 0a 20  (v, j1);.    }. 
10230 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
10240 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
10250 65 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  e, r1);.  sqlite
10260 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
10270 61 72 73 65 2c 20 31 29 3b 0a 20 20 56 64 62 65  arse, 1);.  Vdbe
10280 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
10290 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 7d 0a 23   IN expr"));.}.#
102a0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
102b0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
102c0 0a 0a 2f 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74  ../*.** Duplicat
102d0 65 20 61 6e 20 38 2d 62 79 74 65 20 76 61 6c 75  e an 8-byte valu
102e0 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  e.*/.static char
102f0 20 2a 64 75 70 38 62 79 74 65 73 28 56 64 62 65   *dup8bytes(Vdbe
10300 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *v, const char 
10310 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 6f 75  *in){.  char *ou
10320 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
10330 6c 6f 63 52 61 77 28 73 71 6c 69 74 65 33 56 64  locRaw(sqlite3Vd
10340 62 65 44 62 28 76 29 2c 20 38 29 3b 0a 20 20 69  beDb(v), 8);.  i
10350 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 6d 65  f( out ){.    me
10360 6d 63 70 79 28 6f 75 74 2c 20 69 6e 2c 20 38 29  mcpy(out, in, 8)
10370 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f  ;.  }.  return o
10380 75 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ut;.}..#ifndef S
10390 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
103a0 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20  ING_POINT./*.** 
103b0 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74  Generate an inst
103c0 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  ruction that wil
103d0 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74 69  l put the floati
103e0 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75  ng point.** valu
103f0 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20 7a  e described by z
10400 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65  [0..n-1] into re
10410 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a  gister iMem..**.
10420 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e  ** The z[] strin
10430 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20  g will probably 
10440 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d  not be zero-term
10450 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68 65  inated.  But the
10460 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63   .** z[n] charac
10470 74 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  ter is guarantee
10480 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e  d to be somethin
10490 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  g that does not 
104a0 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65  look.** like the
104b0 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66   continuation of
104c0 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a   the number..*/.
104d0 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
104e0 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f  Real(Vdbe *v, co
104f0 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
10500 20 6e 65 67 61 74 65 46 6c 61 67 2c 20 69 6e 74   negateFlag, int
10510 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41 4c   iMem){.  if( AL
10520 57 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20 20  WAYS(z!=0) ){.  
10530 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a    double value;.
10540 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20      char *zV;.  
10550 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c    sqlite3AtoF(z,
10560 20 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65 33   &value, sqlite3
10570 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c  Strlen30(z), SQL
10580 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 61  ITE_UTF8);.    a
10590 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 49  ssert( !sqlite3I
105a0 73 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b 20 2f  sNaN(value) ); /
105b0 2a 20 54 68 65 20 6e 65 77 20 41 74 6f 46 20 6e  * The new AtoF n
105c0 65 76 65 72 20 72 65 74 75 72 6e 73 20 4e 61 4e  ever returns NaN
105d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 67 61   */.    if( nega
105e0 74 65 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d  teFlag ) value =
105f0 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 7a 56 20   -value;.    zV 
10600 3d 20 64 75 70 38 62 79 74 65 73 28 76 2c 20 28  = dup8bytes(v, (
10610 63 68 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20  char*)&value);. 
10620 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10630 64 4f 70 34 28 76 2c 20 4f 50 5f 52 65 61 6c 2c  dOp4(v, OP_Real,
10640 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c   0, iMem, 0, zV,
10650 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d   P4_REAL);.  }.}
10660 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
10670 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74  Generate an inst
10680 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  ruction that wil
10690 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65  l put the intege
106a0 72 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a  r describe by.**
106b0 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20   text z[0..n-1] 
106c0 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d  into register iM
106d0 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75  em..**.** Expr.u
106e0 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79  .zToken is alway
106f0 73 20 55 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d  s UTF8 and zero-
10700 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73  terminated..*/.s
10710 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49  tatic void codeI
10720 6e 74 65 67 65 72 28 50 61 72 73 65 20 2a 70 50  nteger(Parse *pP
10730 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
10740 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20  r, int negFlag, 
10750 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62  int iMem){.  Vdb
10760 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
10770 56 64 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70  Vdbe;.  if( pExp
10780 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
10790 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e  tValue ){.    in
107a0 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69  t i = pExpr->u.i
107b0 56 61 6c 75 65 3b 0a 20 20 20 20 61 73 73 65 72  Value;.    asser
107c0 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69  t( i>=0 );.    i
107d0 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d  f( negFlag ) i =
107e0 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -i;.    sqlite3
107f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10800 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65  _Integer, i, iMe
10810 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  m);.  }else{.   
10820 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20   int c;.    i64 
10830 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74  value;.    const
10840 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72   char *z = pExpr
10850 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
10860 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a  assert( z!=0 );.
10870 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 41      c = sqlite3A
10880 74 6f 69 36 34 28 7a 2c 20 26 76 61 6c 75 65 2c  toi64(z, &value,
10890 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
108a0 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  (z), SQLITE_UTF8
108b0 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 30 20  );.    if( c==0 
108c0 7c 7c 20 28 63 3d 3d 32 20 26 26 20 6e 65 67 46  || (c==2 && negF
108d0 6c 61 67 29 20 29 7b 0a 20 20 20 20 20 20 63 68  lag) ){.      ch
108e0 61 72 20 2a 7a 56 3b 0a 20 20 20 20 20 20 69 66  ar *zV;.      if
108f0 28 20 6e 65 67 46 6c 61 67 20 29 7b 20 76 61 6c  ( negFlag ){ val
10900 75 65 20 3d 20 63 3d 3d 32 20 3f 20 53 4d 41 4c  ue = c==2 ? SMAL
10910 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20 2d 76 61  LEST_INT64 : -va
10920 6c 75 65 3b 20 7d 0a 20 20 20 20 20 20 7a 56 20  lue; }.      zV 
10930 3d 20 64 75 70 38 62 79 74 65 73 28 76 2c 20 28  = dup8bytes(v, (
10940 63 68 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20  char*)&value);. 
10950 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10960 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49 6e 74  AddOp4(v, OP_Int
10970 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20  64, 0, iMem, 0, 
10980 7a 56 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20  zV, P4_INT64);. 
10990 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66     }else{.#ifdef
109a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
109b0 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
109c0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
109d0 67 28 70 50 61 72 73 65 2c 20 22 6f 76 65 72 73  g(pParse, "overs
109e0 69 7a 65 64 20 69 6e 74 65 67 65 72 3a 20 25 73  ized integer: %s
109f0 25 73 22 2c 20 6e 65 67 46 6c 61 67 20 3f 20 22  %s", negFlag ? "
10a00 2d 22 20 3a 20 22 22 2c 20 7a 29 3b 0a 23 65 6c  -" : "", z);.#el
10a10 73 65 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61  se.      codeRea
10a20 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c  l(v, z, negFlag,
10a30 20 69 4d 65 6d 29 3b 0a 23 65 6e 64 69 66 0a 20   iMem);.#endif. 
10a40 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
10a50 2a 20 43 6c 65 61 72 20 61 20 63 61 63 68 65 20  * Clear a cache 
10a60 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  entry..*/.static
10a70 20 76 6f 69 64 20 63 61 63 68 65 45 6e 74 72 79   void cacheEntry
10a80 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50 61  Clear(Parse *pPa
10a90 72 73 65 2c 20 73 74 72 75 63 74 20 79 43 6f 6c  rse, struct yCol
10aa0 43 61 63 68 65 20 2a 70 29 7b 0a 20 20 69 66 28  Cache *p){.  if(
10ab0 20 70 2d 3e 74 65 6d 70 52 65 67 20 29 7b 0a 20   p->tempReg ){. 
10ac0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
10ad0 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a  TempReg<ArraySiz
10ae0 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  e(pParse->aTempR
10af0 65 67 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61  eg) ){.      pPa
10b00 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50  rse->aTempReg[pP
10b10 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b  arse->nTempReg++
10b20 5d 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20  ] = p->iReg;.   
10b30 20 7d 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52 65   }.    p->tempRe
10b40 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  g = 0;.  }.}.../
10b50 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 69 6e 20 74  *.** Record in t
10b60 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
10b70 74 68 61 74 20 61 20 70 61 72 74 69 63 75 6c 61  that a particula
10b80 72 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a  r column from a.
10b90 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 20 74 61  ** particular ta
10ba0 62 6c 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ble is stored in
10bb0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 72 65   a particular re
10bc0 67 69 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20  gister..*/.void 
10bd0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
10be0 53 74 6f 72 65 28 50 61 72 73 65 20 2a 70 50 61  Store(Parse *pPa
10bf0 72 73 65 2c 20 69 6e 74 20 69 54 61 62 2c 20 69  rse, int iTab, i
10c00 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20 69 52 65  nt iCol, int iRe
10c10 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  g){.  int i;.  i
10c20 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e 74  nt minLru;.  int
10c30 20 69 64 78 4c 72 75 3b 0a 20 20 73 74 72 75 63   idxLru;.  struc
10c40 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
10c50 0a 20 20 61 73 73 65 72 74 28 20 69 52 65 67 3e  .  assert( iReg>
10c60 30 20 29 3b 20 20 2f 2a 20 52 65 67 69 73 74 65  0 );  /* Registe
10c70 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c  r numbers are al
10c80 77 61 79 73 20 70 6f 73 69 74 69 76 65 20 2a 2f  ways positive */
10c90 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
10ca0 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33 32 37 36  =-1 && iCol<3276
10cb0 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69 74 65 20  8 );  /* Finite 
10cc0 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a  column numbers *
10cd0 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49  /..  /* The SQLI
10ce0 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20 66  TE_ColumnCache f
10cf0 6c 61 67 20 64 69 73 61 62 6c 65 73 20 74 68 65  lag disables the
10d00 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 20 20   column cache.  
10d10 54 68 69 73 20 69 73 20 75 73 65 64 0a 20 20 2a  This is used.  *
10d20 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 6e  * for testing on
10d30 6c 79 20 2d 20 74 6f 20 76 65 72 69 66 79 20 74  ly - to verify t
10d40 68 61 74 20 53 51 4c 69 74 65 20 61 6c 77 61 79  hat SQLite alway
10d50 73 20 67 65 74 73 20 74 68 65 20 73 61 6d 65 20  s gets the same 
10d60 61 6e 73 77 65 72 0a 20 20 2a 2a 20 77 69 74 68  answer.  ** with
10d70 20 61 6e 64 20 77 69 74 68 6f 75 74 20 74 68 65   and without the
10d80 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20   column cache.. 
10d90 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
10da0 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
10db0 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65  LITE_ColumnCache
10dc0 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
10dd0 20 46 69 72 73 74 20 72 65 70 6c 61 63 65 20 61   First replace a
10de0 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  ny existing entr
10df0 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74  y..  **.  ** Act
10e00 75 61 6c 6c 79 2c 20 74 68 65 20 77 61 79 20 74  ually, the way t
10e10 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
10e20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 73 65  is currently use
10e30 64 2c 20 77 65 20 61 72 65 20 67 75 61 72 61 6e  d, we are guaran
10e40 74 65 65 64 0a 20 20 2a 2a 20 74 68 61 74 20 74  teed.  ** that t
10e50 68 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 6e  he object will n
10e60 65 76 65 72 20 61 6c 72 65 61 64 79 20 62 65 20  ever already be 
10e70 69 6e 20 63 61 63 68 65 2e 20 20 56 65 72 69 66  in cache.  Verif
10e80 79 20 74 68 69 73 20 67 75 61 72 61 6e 74 65 65  y this guarantee
10e90 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ..  */.#ifndef N
10ea0 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 2c  DEBUG.  for(i=0,
10eb0 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
10ec0 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
10ed0 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
10ee0 70 2b 2b 29 7b 0a 23 69 66 20 30 20 2f 2a 20 54  p++){.#if 0 /* T
10ef0 68 69 73 20 63 6f 64 65 20 77 6f 6c 64 20 72 65  his code wold re
10f00 6d 6f 76 65 20 74 68 65 20 65 6e 74 72 79 20 66  move the entry f
10f10 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 69 66  rom the cache if
10f20 20 69 74 20 65 78 69 73 74 65 64 20 2a 2f 0a 20   it existed */. 
10f30 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20 26     if( p->iReg &
10f40 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  & p->iTable==iTa
10f50 62 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d  b && p->iColumn=
10f60 3d 69 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 63  =iCol ){.      c
10f70 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70  acheEntryClear(p
10f80 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20  Parse, p);.     
10f90 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61   p->iLevel = pPa
10fa0 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
10fb0 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  ;.      p->iReg 
10fc0 3d 20 69 52 65 67 3b 0a 20 20 20 20 20 20 70 2d  = iReg;.      p-
10fd0 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69  >lru = pParse->i
10fe0 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20  CacheCnt++;.    
10ff0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
11000 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
11010 74 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20 7c 7c  t( p->iReg==0 ||
11020 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62   p->iTable!=iTab
11030 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d   || p->iColumn!=
11040 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  iCol );.  }.#end
11050 69 66 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 6e  if..  /* Find an
11060 20 65 6d 70 74 79 20 73 6c 6f 74 20 61 6e 64 20   empty slot and 
11070 72 65 70 6c 61 63 65 20 69 74 20 2a 2f 0a 20 20  replace it */.  
11080 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
11090 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
110a0 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
110b0 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
110c0 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 30    if( p->iReg==0
110d0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 65   ){.      p->iLe
110e0 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  vel = pParse->iC
110f0 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 20  acheLevel;.     
11100 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61   p->iTable = iTa
11110 62 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c  b;.      p->iCol
11120 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  umn = iCol;.    
11130 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67    p->iReg = iReg
11140 3b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52  ;.      p->tempR
11150 65 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  eg = 0;.      p-
11160 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69  >lru = pParse->i
11170 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20  CacheCnt++;.    
11180 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
11190 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63    }..  /* Replac
111a0 65 20 74 68 65 20 6c 61 73 74 20 72 65 63 65 6e  e the last recen
111b0 74 6c 79 20 75 73 65 64 20 2a 2f 0a 20 20 6d 69  tly used */.  mi
111c0 6e 4c 72 75 20 3d 20 30 78 37 66 66 66 66 66 66  nLru = 0x7ffffff
111d0 66 3b 0a 20 20 69 64 78 4c 72 75 20 3d 20 2d 31  f;.  idxLru = -1
111e0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ;.  for(i=0, p=p
111f0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
11200 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
11210 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
11220 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6c 72 75  {.    if( p->lru
11230 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20 20 20 20 20  <minLru ){.     
11240 20 69 64 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20   idxLru = i;.   
11250 20 20 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c     minLru = p->l
11260 72 75 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ru;.    }.  }.  
11270 69 66 28 20 41 4c 57 41 59 53 28 69 64 78 4c 72  if( ALWAYS(idxLr
11280 75 3e 3d 30 29 20 29 7b 0a 20 20 20 20 70 20 3d  u>=0) ){.    p =
11290 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61   &pParse->aColCa
112a0 63 68 65 5b 69 64 78 4c 72 75 5d 3b 0a 20 20 20  che[idxLru];.   
112b0 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61   p->iLevel = pPa
112c0 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
112d0 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20  ;.    p->iTable 
112e0 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69  = iTab;.    p->i
112f0 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20  Column = iCol;. 
11300 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65     p->iReg = iRe
11310 67 3b 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52 65  g;.    p->tempRe
11320 67 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 72  g = 0;.    p->lr
11330 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  u = pParse->iCac
11340 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74  heCnt++;.    ret
11350 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  urn;.  }.}../*.*
11360 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20  * Indicate that 
11370 72 65 67 69 73 74 65 72 73 20 62 65 74 77 65 65  registers betwee
11380 6e 20 69 52 65 67 2e 2e 69 52 65 67 2b 6e 52 65  n iReg..iReg+nRe
11390 67 2d 31 20 61 72 65 20 62 65 69 6e 67 20 6f 76  g-1 are being ov
113a0 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2a 20 50 75  erwritten..** Pu
113b0 72 67 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66  rge the range of
113c0 20 72 65 67 69 73 74 65 72 73 20 66 72 6f 6d 20   registers from 
113d0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
113e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
113f0 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
11400 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
11410 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52  int iReg, int nR
11420 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  eg){.  int i;.  
11430 69 6e 74 20 69 4c 61 73 74 20 3d 20 69 52 65 67  int iLast = iReg
11440 20 2b 20 6e 52 65 67 20 2d 20 31 3b 0a 20 20 73   + nReg - 1;.  s
11450 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
11460 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  *p;.  for(i=0, p
11470 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
11480 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
11490 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
114a0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20  +){.    int r = 
114b0 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28  p->iReg;.    if(
114c0 20 72 3e 3d 69 52 65 67 20 26 26 20 72 3c 3d 69   r>=iReg && r<=i
114d0 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 63 61  Last ){.      ca
114e0 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50  cheEntryClear(pP
114f0 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
11500 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20  p->iReg = 0;.   
11510 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
11520 52 65 6d 65 6d 62 65 72 20 74 68 65 20 63 75 72  Remember the cur
11530 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68  rent column cach
11540 65 20 63 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20  e context.  Any 
11550 6e 65 77 20 65 6e 74 72 69 65 73 20 61 64 64 65  new entries adde
11560 64 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68  d.** added to th
11570 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61  e column cache a
11580 66 74 65 72 20 74 68 69 73 20 63 61 6c 6c 20 61  fter this call a
11590 72 65 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 20  re removed when 
115a0 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  the.** correspon
115b0 64 69 6e 67 20 70 6f 70 20 6f 63 63 75 72 73 2e  ding pop occurs.
115c0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
115d0 45 78 70 72 43 61 63 68 65 50 75 73 68 28 50 61  ExprCachePush(Pa
115e0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
115f0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
11600 76 65 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  vel++;.}../*.** 
11610 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74 68 65 20  Remove from the 
11620 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 6e 79  column cache any
11630 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 77 65   entries that we
11640 72 65 20 61 64 64 65 64 20 73 69 6e 63 65 20 74  re added since t
11650 68 65 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f  he.** the previo
11660 75 73 20 4e 20 50 75 73 68 20 6f 70 65 72 61 74  us N Push operat
11670 69 6f 6e 73 2e 20 20 49 6e 20 6f 74 68 65 72 20  ions.  In other 
11680 77 6f 72 64 73 2c 20 72 65 73 74 6f 72 65 20 74  words, restore t
11690 68 65 20 63 61 63 68 65 0a 2a 2a 20 74 6f 20 74  he cache.** to t
116a0 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
116b0 69 6e 20 4e 20 50 75 73 68 65 73 20 61 67 6f 2e  in N Pushes ago.
116c0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
116d0 45 78 70 72 43 61 63 68 65 50 6f 70 28 50 61 72  ExprCachePop(Par
116e0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
116f0 4e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  N){.  int i;.  s
11700 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
11710 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e  *p;.  assert( N>
11720 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
11730 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
11740 65 6c 3e 3d 4e 20 29 3b 0a 20 20 70 50 61 72 73  el>=N );.  pPars
11750 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 2d  e->iCacheLevel -
11760 3d 20 4e 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  = N;.  for(i=0, 
11770 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
11780 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
11790 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
117a0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
117b0 69 52 65 67 20 26 26 20 70 2d 3e 69 4c 65 76 65  iReg && p->iLeve
117c0 6c 3e 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  l>pParse->iCache
117d0 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20 20 20 63  Level ){.      c
117e0 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70  acheEntryClear(p
117f0 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20  Parse, p);.     
11800 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20   p->iReg = 0;.  
11810 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
11820 20 57 68 65 6e 20 61 20 63 61 63 68 65 64 20 63   When a cached c
11830 6f 6c 75 6d 6e 20 69 73 20 72 65 75 73 65 64 2c  olumn is reused,
11840 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
11850 69 74 73 20 72 65 67 69 73 74 65 72 20 69 73 0a  its register is.
11860 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 76 61  ** no longer ava
11870 69 6c 61 62 6c 65 20 61 73 20 61 20 74 65 6d 70  ilable as a temp
11880 20 72 65 67 69 73 74 65 72 2e 20 20 74 69 63 6b   register.  tick
11890 65 74 20 23 33 38 37 39 3a 20 20 74 68 61 74 20  et #3879:  that 
118a0 73 61 6d 65 0a 2a 2a 20 72 65 67 69 73 74 65 72  same.** register
118b0 20 6d 69 67 68 74 20 62 65 20 69 6e 20 74 68 65   might be in the
118c0 20 63 61 63 68 65 20 69 6e 20 6d 75 6c 74 69 70   cache in multip
118d0 6c 65 20 70 6c 61 63 65 73 2c 20 73 6f 20 62 65  le places, so be
118e0 20 73 75 72 65 20 74 6f 0a 2a 2a 20 67 65 74 20   sure to.** get 
118f0 74 68 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61  them all..*/.sta
11900 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
11910 45 78 70 72 43 61 63 68 65 50 69 6e 52 65 67 69  ExprCachePinRegi
11920 73 74 65 72 28 50 61 72 73 65 20 2a 70 50 61 72  ster(Parse *pPar
11930 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  se, int iReg){. 
11940 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
11950 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
11960 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
11970 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
11980 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
11990 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
119a0 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d     if( p->iReg==
119b0 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 70 2d  iReg ){.      p-
119c0 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
119d0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
119e0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
119f0 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 76 61  o extract the va
11a00 6c 75 65 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d  lue of the iCol-
11a10 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74  th column of a t
11a20 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  able..*/.void sq
11a30 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
11a40 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20  ColumnOfTable(. 
11a50 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
11a60 20 2f 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64   /* The VDBE und
11a70 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
11a80 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
11a90 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  ,    /* The tabl
11aa0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
11ab0 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
11ac0 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 54  iTabCur,    /* T
11ad0 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  he cursor for th
11ae0 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  is table */.  in
11af0 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a  t iCol,       /*
11b00 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f   Index of the co
11b10 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20  lumn to extract 
11b20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20  */.  int regOut 
11b30 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
11b40 74 68 65 20 76 61 6c 75 64 20 69 6e 74 6f 20 74  the valud into t
11b50 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
11b60 29 7b 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20  ){.  if( iCol<0 
11b70 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69  || iCol==pTab->i
11b80 50 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  PKey ){.    sqli
11b90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11ba0 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 43   OP_Rowid, iTabC
11bb0 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  ur, regOut);.  }
11bc0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70  else{.    int op
11bd0 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54 61   = IsVirtual(pTa
11be0 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20  b) ? OP_VColumn 
11bf0 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20  : OP_Column;.   
11c00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11c10 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 43 75  p3(v, op, iTabCu
11c20 72 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29  r, iCol, regOut)
11c30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c  ;.  }.  if( iCol
11c40 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
11c50 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28  e3ColumnDefault(
11c60 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72  v, pTab, iCol, r
11c70 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  egOut);.  }.}../
11c80 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
11c90 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74  de that will ext
11ca0 72 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e  ract the iColumn
11cb0 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a  -th column from.
11cc0 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e  ** table pTab an
11cd0 64 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75  d store the colu
11ce0 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61 20 72 65  mn value in a re
11cf0 67 69 73 74 65 72 2e 20 20 41 6e 20 65 66 66 6f  gister.  An effo
11d00 72 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f  rt.** is made to
11d10 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d   store the colum
11d20 6e 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  n value in regis
11d30 74 65 72 20 69 52 65 67 2c 20 62 75 74 20 74 68  ter iReg, but th
11d40 69 73 20 69 73 0a 2a 2a 20 6e 6f 74 20 67 75 61  is is.** not gua
11d50 72 61 6e 74 65 65 64 2e 20 20 54 68 65 20 6c 6f  ranteed.  The lo
11d60 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f  cation of the co
11d70 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 72 65  lumn value is re
11d80 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
11d90 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f  ere must be an o
11da0 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54  pen cursor to pT
11db0 61 62 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65  ab in iTable whe
11dc0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
11dd0 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66  * is called.  If
11de0 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20   iColumn<0 then 
11df0 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65  code is generate
11e00 64 20 74 68 61 74 20 65 78 74 72 61 63 74 73 20  d that extracts 
11e10 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e  the rowid..*/.in
11e20 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
11e30 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61  eGetColumn(.  Pa
11e40 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
11e50 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
11e60 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
11e70 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
11e80 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44   *pTab,     /* D
11e90 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
11ea0 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72  e table we are r
11eb0 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20  eading from */. 
11ec0 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
11ed0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
11ee0 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a  e table column *
11ef0 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
11f00 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
11f10 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  or pointing to t
11f20 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
11f30 74 20 69 52 65 67 20 20 20 20 20 20 20 20 20 2f  t iReg         /
11f40 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20  * Store results 
11f50 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  here */.){.  Vdb
11f60 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
11f70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
11f80 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
11f90 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  e *p;..  for(i=0
11fa0 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
11fb0 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
11fc0 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
11fd0 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
11fe0 2d 3e 69 52 65 67 3e 30 20 26 26 20 70 2d 3e 69  ->iReg>0 && p->i
11ff0 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26  Table==iTable &&
12000 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f   p->iColumn==iCo
12010 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d  lumn ){.      p-
12020 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69  >lru = pParse->i
12030 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20  CacheCnt++;.    
12040 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
12050 68 65 50 69 6e 52 65 67 69 73 74 65 72 28 70 50  hePinRegister(pP
12060 61 72 73 65 2c 20 70 2d 3e 69 52 65 67 29 3b 0a  arse, p->iReg);.
12070 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e        return p->
12080 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  iReg;.    }.  } 
12090 20 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30   .  assert( v!=0
120a0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
120b0 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66  rCodeGetColumnOf
120c0 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69  Table(v, pTab, i
120d0 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20  Table, iColumn, 
120e0 69 52 65 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  iReg);.  sqlite3
120f0 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
12100 50 61 72 73 65 2c 20 69 54 61 62 6c 65 2c 20 69  Parse, iTable, i
12110 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20  Column, iReg);. 
12120 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a   return iReg;.}.
12130 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c  ./*.** Clear all
12140 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 65 6e   column cache en
12150 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tries..*/.void s
12160 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
12170 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50 61 72  lear(Parse *pPar
12180 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  se){.  int i;.  
12190 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
121a0 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c   *p;..  for(i=0,
121b0 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
121c0 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
121d0 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
121e0 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
121f0 3e 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 63  >iReg ){.      c
12200 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70  acheEntryClear(p
12210 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20  Parse, p);.     
12220 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20   p->iReg = 0;.  
12230 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
12240 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   Record the fact
12250 20 74 68 61 74 20 61 6e 20 61 66 66 69 6e 69 74   that an affinit
12260 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63  y change has occ
12270 75 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a  urred on iCount.
12280 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73 74 61  ** registers sta
12290 72 74 69 6e 67 20 77 69 74 68 20 69 53 74 61 72  rting with iStar
122a0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
122b0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
122c0 69 74 79 43 68 61 6e 67 65 28 50 61 72 73 65 20  ityChange(Parse 
122d0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 53 74  *pParse, int iSt
122e0 61 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29  art, int iCount)
122f0 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  {.  sqlite3ExprC
12300 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
12310 65 2c 20 69 53 74 61 72 74 2c 20 69 43 6f 75 6e  e, iStart, iCoun
12320 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  t);.}../*.** Gen
12330 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f  erate code to mo
12340 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ve content from 
12350 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e  registers iFrom.
12360 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a  ..iFrom+nReg-1.*
12370 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69  * over to iTo..i
12380 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20  To+nReg-1. Keep 
12390 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
123a0 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a   up-to-date..*/.
123b0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
123c0 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a  CodeMove(Parse *
123d0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f  pParse, int iFro
123e0 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20  m, int iTo, int 
123f0 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  nReg){.  int i;.
12400 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
12410 68 65 20 2a 70 3b 0a 20 20 69 66 28 20 4e 45 56  he *p;.  if( NEV
12420 45 52 28 69 46 72 6f 6d 3d 3d 69 54 6f 29 20 29  ER(iFrom==iTo) )
12430 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
12440 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 50 61  e3VdbeAddOp3(pPa
12450 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d  rse->pVdbe, OP_M
12460 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c  ove, iFrom, iTo,
12470 20 6e 52 65 67 29 3b 0a 20 20 66 6f 72 28 69 3d   nReg);.  for(i=
12480 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
12490 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
124a0 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
124b0 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  , p++){.    int 
124c0 78 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20  x = p->iReg;.   
124d0 20 69 66 28 20 78 3e 3d 69 46 72 6f 6d 20 26 26   if( x>=iFrom &&
124e0 20 78 3c 69 46 72 6f 6d 2b 6e 52 65 67 20 29 7b   x<iFrom+nReg ){
124f0 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 2b  .      p->iReg +
12500 3d 20 69 54 6f 2d 69 46 72 6f 6d 3b 0a 20 20 20  = iTo-iFrom;.   
12510 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
12520 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
12530 20 63 6f 70 79 20 63 6f 6e 74 65 6e 74 20 66 72   copy content fr
12540 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69 46 72  om registers iFr
12550 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d  om...iFrom+nReg-
12560 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f  1.** over to iTo
12570 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 0a 2a 2f  ..iTo+nReg-1..*/
12580 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
12590 72 43 6f 64 65 43 6f 70 79 28 50 61 72 73 65 20  rCodeCopy(Parse 
125a0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72  *pParse, int iFr
125b0 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74  om, int iTo, int
125c0 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b   nReg){.  int i;
125d0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 69 46 72  .  if( NEVER(iFr
125e0 6f 6d 3d 3d 69 54 6f 29 20 29 20 72 65 74 75 72  om==iTo) ) retur
125f0 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
12600 6e 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nReg; i++){.    
12610 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12620 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  2(pParse->pVdbe,
12630 20 4f 50 5f 43 6f 70 79 2c 20 69 46 72 6f 6d 2b   OP_Copy, iFrom+
12640 69 2c 20 69 54 6f 2b 69 29 3b 0a 20 20 7d 0a 7d  i, iTo+i);.  }.}
12650 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
12660 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
12670 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f  efined(SQLITE_CO
12680 56 45 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a  VERAGE_TEST)./*.
12690 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
126a0 66 20 61 6e 79 20 72 65 67 69 73 74 65 72 20 69  f any register i
126b0 6e 20 74 68 65 20 72 61 6e 67 65 20 69 46 72 6f  n the range iFro
126c0 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69 76  m..iTo (inclusiv
126d0 65 29 0a 2a 2a 20 69 73 20 75 73 65 64 20 61 73  e).** is used as
126e0 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6c   part of the col
126f0 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  umn cache..**.**
12700 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
12710 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 73 73   used within ass
12720 65 72 74 28 29 20 61 6e 64 20 74 65 73 74 63 61  ert() and testca
12730 73 65 28 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79  se() macros only
12740 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  .** and does not
12750 20 61 70 70 65 61 72 20 69 6e 20 61 20 6e 6f 72   appear in a nor
12760 6d 61 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74  mal build..*/.st
12770 61 74 69 63 20 69 6e 74 20 75 73 65 64 41 73 43  atic int usedAsC
12780 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65  olumnCache(Parse
12790 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46   *pParse, int iF
127a0 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20  rom, int iTo){. 
127b0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
127c0 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
127d0 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
127e0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
127f0 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
12800 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
12810 20 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52     int r = p->iR
12820 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69  eg;.    if( r>=i
12830 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29  From && r<=iTo )
12840 20 72 65 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a   return 1;    /*
12850 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20  NO_TEST*/.  }.  
12860 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
12870 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
12880 55 47 20 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56  UG || SQLITE_COV
12890 45 52 41 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 2f  ERAGE_TEST */../
128a0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
128b0 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72  de into the curr
128c0 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c  ent Vdbe to eval
128d0 75 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a  uate the given.*
128e0 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 41  * expression.  A
128f0 74 74 65 6d 70 74 20 74 6f 20 73 74 6f 72 65 20  ttempt to store 
12900 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 72  the results in r
12910 65 67 69 73 74 65 72 20 22 74 61 72 67 65 74 22  egister "target"
12920 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
12930 72 65 67 69 73 74 65 72 20 77 68 65 72 65 20 72  register where r
12940 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
12950 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68  d..**.** With th
12960 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 72  is routine, ther
12970 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e 74 65  e is no guarante
12980 65 20 74 68 61 74 20 72 65 73 75 6c 74 73 20 77  e that results w
12990 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64  ill.** be stored
129a0 20 69 6e 20 74 61 72 67 65 74 2e 20 20 54 68 65   in target.  The
129b0 20 72 65 73 75 6c 74 20 6d 69 67 68 74 20 62 65   result might be
129c0 20 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20   stored in some 
129d0 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69 73 74 65  other.** registe
129e0 72 20 69 66 20 69 74 20 69 73 20 63 6f 6e 76 65  r if it is conve
129f0 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20  nient to do so. 
12a00 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
12a10 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68  ction.** must ch
12a20 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63  eck the return c
12a30 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65  ode and move the
12a40 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20   results to the 
12a50 64 65 73 69 72 65 64 0a 2a 2a 20 72 65 67 69 73  desired.** regis
12a60 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
12a70 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
12a80 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
12a90 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
12aa0 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62  t target){.  Vdb
12ab0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
12ac0 56 64 62 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d  Vdbe;  /* The VM
12ad0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
12ae0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b  ion */.  int op;
12af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b00 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
12b10 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
12b20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 74 61    int inReg = ta
12b30 72 67 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52  rget;       /* R
12b40 65 73 75 6c 74 73 20 73 74 6f 72 65 64 20 69 6e  esults stored in
12b50 20 72 65 67 69 73 74 65 72 20 69 6e 52 65 67 20   register inReg 
12b60 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
12b70 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  1 = 0;         /
12b80 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72  * If non-zero fr
12b90 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  ee this temporar
12ba0 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  y register */.  
12bb0 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30  int regFree2 = 0
12bc0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ;         /* If 
12bd0 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68  non-zero free th
12be0 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  is temporary reg
12bf0 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
12c00 31 2c 20 72 32 2c 20 72 33 2c 20 72 34 3b 20 20  1, r2, r3, r4;  
12c10 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20       /* Various 
12c20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  register numbers
12c30 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
12c40 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
12c50 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
12c60 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20  connection */.. 
12c70 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
12c80 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61  0 && target<=pPa
12c90 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69  rse->nMem );.  i
12ca0 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61  f( v==0 ){.    a
12cb0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
12cc0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
12cd0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
12ce0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70  .  }..  if( pExp
12cf0 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d  r==0 ){.    op =
12d00 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73   TK_NULL;.  }els
12d10 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70  e{.    op = pExp
12d20 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69  r->op;.  }.  swi
12d30 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
12d40 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
12d50 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e  N: {.      AggIn
12d60 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70  fo *pAggInfo = p
12d70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a  Expr->pAggInfo;.
12d80 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
12d90 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d  Info_col *pCol =
12da0 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c   &pAggInfo->aCol
12db0 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20  [pExpr->iAgg];. 
12dc0 20 20 20 20 20 69 66 28 20 21 70 41 67 67 49 6e       if( !pAggIn
12dd0 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29  fo->directMode )
12de0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
12df0 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29  ( pCol->iMem>0 )
12e00 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  ;.        inReg 
12e10 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20  = pCol->iMem;.  
12e20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12e30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67     }else if( pAg
12e40 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e  gInfo->useSortin
12e50 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20  gIdx ){.        
12e60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12e70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
12e80 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e  pAggInfo->sortin
12e90 67 49 64 78 50 54 61 62 2c 0a 20 20 20 20 20 20  gIdxPTab,.      
12ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12eb0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
12ec0 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72  orterColumn, tar
12ed0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72  get);.        br
12ee0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
12ef0 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c     /* Otherwise,
12f00 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20   fall thru into 
12f10 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61  the TK_COLUMN ca
12f20 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  se */.    }.    
12f30 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
12f40 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
12f50 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20  r->iTable<0 ){. 
12f60 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 6f         /* This o
12f70 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e  nly happens when
12f80 20 63 6f 64 69 6e 67 20 63 68 65 63 6b 20 63 6f   coding check co
12f90 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20  nstraints */.   
12fa0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
12fb0 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30 20 29 3b  rse->ckBase>0 );
12fc0 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
12fd0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
12fe0 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65  + pParse->ckBase
12ff0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13000 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73         inReg = s
13010 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
13020 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
13030 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20  pExpr->pTab,.   
13040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
13060 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 45  xpr->iColumn, pE
13070 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72  xpr->iTable, tar
13080 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  get);.      }.  
13090 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
130a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
130b0 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f  EGER: {.      co
130c0 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  deInteger(pParse
130d0 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67  , pExpr, 0, targ
130e0 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
130f0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
13100 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
13110 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63  TING_POINT.    c
13120 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a  ase TK_FLOAT: {.
13130 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
13140 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
13150 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
13160 65 29 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  e) );.      code
13170 52 65 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e 75  Real(v, pExpr->u
13180 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72 67  .zToken, 0, targ
13190 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
131a0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
131b0 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
131c0 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  G: {.      asser
131d0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
131e0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
131f0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
13200 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13210 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p4(v, OP_String8
13220 2c 20 30 2c 20 74 61 72 67 65 74 2c 20 30 2c 20  , 0, target, 0, 
13230 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
13240 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
13250 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
13260 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20   TK_NULL: {.    
13270 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13280 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
13290 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
132a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
132b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
132c0 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a  IT_BLOB_LITERAL.
132d0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
132e0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b  : {.      int n;
132f0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
13300 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61 72  r *z;.      char
13310 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61   *zBlob;.      a
13320 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
13330 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
13340 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
13350 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
13360 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d  pr->u.zToken[0]=
13370 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75  ='x' || pExpr->u
13380 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20  .zToken[0]=='X' 
13390 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
133a0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
133b0 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20  [1]=='\'' );.   
133c0 20 20 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75     z = &pExpr->u
133d0 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20  .zToken[2];.    
133e0 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72    n = sqlite3Str
133f0 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20  len30(z) - 1;.  
13400 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d      assert( z[n]
13410 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20  =='\'' );.      
13420 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48  zBlob = sqlite3H
13430 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33  exToBlob(sqlite3
13440 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29  VdbeDb(v), z, n)
13450 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
13460 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
13470 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65  Blob, n/2, targe
13480 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f  t, 0, zBlob, P4_
13490 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
134a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
134b0 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
134c0 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20  VARIABLE: {.    
134d0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
134e0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
134f0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
13500 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13510 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21  pExpr->u.zToken!
13520 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
13530 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
13540 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  ken[0]!=0 );.   
13550 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13560 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72 69 61  dOp2(v, OP_Varia
13570 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ble, pExpr->iCol
13580 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  umn, target);.  
13590 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 75      if( pExpr->u
135a0 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b  .zToken[1]!=0 ){
135b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
135c0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
135d0 5b 30 5d 3d 3d 27 3f 27 20 0a 20 20 20 20 20 20  [0]=='?' .      
135e0 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63 6d 70         || strcmp
135f0 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
13600 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b  , pParse->azVar[
13610 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31  pExpr->iColumn-1
13620 5d 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ])==0 );.       
13630 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
13640 67 65 50 34 28 76 2c 20 2d 31 2c 20 70 50 61 72  geP4(v, -1, pPar
13650 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d  se->azVar[pExpr-
13660 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 2c 20 50 34 5f  >iColumn-1], P4_
13670 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d  STATIC);.      }
13680 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13690 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
136a0 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20  REGISTER: {.    
136b0 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d    inReg = pExpr-
136c0 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 62  >iTable;.      b
136d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
136e0 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20  case TK_AS: {.  
136f0 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
13700 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
13710 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
13720 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
13730 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13740 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
13750 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20  TE_OMIT_CAST.   
13760 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b   case TK_CAST: {
13770 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73  .      /* Expres
13780 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72  sions of the for
13790 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74 20  m:   CAST(pLeft 
137a0 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20  AS token) */.   
137b0 20 20 20 69 6e 74 20 61 66 66 2c 20 74 6f 5f 6f     int aff, to_o
137c0 70 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  p;.      inReg =
137d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
137e0 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
137f0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
13800 67 65 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  get);.      asse
13810 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
13820 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
13830 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
13840 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 41    aff = sqlite3A
13850 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70  ffinityType(pExp
13860 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
13870 20 20 20 20 74 6f 5f 6f 70 20 3d 20 61 66 66 20      to_op = aff 
13880 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  - SQLITE_AFF_TEX
13890 54 20 2b 20 4f 50 5f 54 6f 54 65 78 74 3b 0a 20  T + OP_ToText;. 
138a0 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f       assert( to_
138b0 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 20 20  op==OP_ToText   
138c0 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f   || aff!=SQLITE_
138d0 41 46 46 5f 54 45 58 54 20 20 20 20 29 3b 0a 20  AFF_TEXT    );. 
138e0 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f       assert( to_
138f0 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 20 20  op==OP_ToBlob   
13900 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f   || aff!=SQLITE_
13910 41 46 46 5f 4e 4f 4e 45 20 20 20 20 29 3b 0a 20  AFF_NONE    );. 
13920 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f       assert( to_
13930 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63  op==OP_ToNumeric
13940 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f   || aff!=SQLITE_
13950 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20  AFF_NUMERIC );. 
13960 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f       assert( to_
13970 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 20 20 20  op==OP_ToInt    
13980 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f   || aff!=SQLITE_
13990 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20  AFF_INTEGER );. 
139a0 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f       assert( to_
139b0 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 20 20  op==OP_ToReal   
139c0 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f   || aff!=SQLITE_
139d0 41 46 46 5f 52 45 41 4c 20 20 20 20 29 3b 0a 20  AFF_REAL    );. 
139e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74       testcase( t
139f0 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20  o_op==OP_ToText 
13a00 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
13a10 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42  e( to_op==OP_ToB
13a20 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 74 65 73  lob );.      tes
13a30 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50  tcase( to_op==OP
13a40 5f 54 6f 4e 75 6d 65 72 69 63 20 29 3b 0a 20 20  _ToNumeric );.  
13a50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f      testcase( to
13a60 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 29 3b  _op==OP_ToInt );
13a70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13a80 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61   to_op==OP_ToRea
13a90 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  l );.      if( i
13aa0 6e 52 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a  nReg!=target ){.
13ab0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13ac0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13ad0 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61  SCopy, inReg, ta
13ae0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69  rget);.        i
13af0 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20  nReg = target;. 
13b00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
13b10 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
13b20 2c 20 74 6f 5f 6f 70 2c 20 69 6e 52 65 67 29 3b  , to_op, inReg);
13b30 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13b40 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63   usedAsColumnCac
13b50 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67  he(pParse, inReg
13b60 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20 20 20  , inReg) );.    
13b70 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
13b80 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
13b90 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20  (pParse, inReg, 
13ba0 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
13bb0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
13bc0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
13bd0 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  T */.    case TK
13be0 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
13bf0 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
13c00 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
13c10 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
13c20 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
13c30 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  _EQ: {.      ass
13c40 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c  ert( TK_LT==OP_L
13c50 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
13c60 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20  t( TK_LE==OP_Le 
13c70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
13c80 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b   TK_GT==OP_Gt );
13c90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
13ca0 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20  K_GE==OP_Ge );. 
13cb0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
13cc0 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20  EQ==OP_Eq );.   
13cd0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45     assert( TK_NE
13ce0 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ne );.     
13cf0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
13d00 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65  K_LT );.      te
13d10 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
13d20 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
13d30 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29  ase( op==TK_GT )
13d40 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13d50 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20  ( op==TK_GE );. 
13d60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
13d70 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20  p==TK_EQ );.    
13d80 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
13d90 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 72  TK_NE );.      r
13da0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
13db0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
13dc0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
13dd0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
13de0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
13df0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
13e00 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
13e10 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
13e20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
13e30 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
13e40 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
13e50 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
13e60 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
13e70 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53   inReg, SQLITE_S
13e80 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 74  TOREP2);.      t
13e90 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
13ea0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
13eb0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
13ec0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
13ed0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
13ee0 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
13ef0 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20  se TK_ISNOT: {. 
13f00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
13f10 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20  p==TK_IS );.    
13f20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
13f30 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20  TK_ISNOT );.    
13f40 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
13f50 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
13f60 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
13f70 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
13f80 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
13f90 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
13fa0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
13fb0 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
13fc0 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54       op = (op==T
13fd0 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20  K_IS) ? TK_EQ : 
13fe0 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f 64  TK_NE;.      cod
13ff0 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
14000 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
14010 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
14020 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14030 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65      r1, r2, inRe
14040 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50  g, SQLITE_STOREP
14050 32 20 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  2 | SQLITE_NULLE
14060 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  Q);.      testca
14070 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
14080 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14090 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
140a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
140b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
140c0 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  _AND:.    case T
140d0 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54  K_OR:.    case T
140e0 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65  K_PLUS:.    case
140f0 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61   TK_STAR:.    ca
14100 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20  se TK_MINUS:.   
14110 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20   case TK_REM:.  
14120 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44    case TK_BITAND
14130 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
14140 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TOR:.    case TK
14150 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65  _SLASH:.    case
14160 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20   TK_LSHIFT:.    
14170 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20  case TK_RSHIFT: 
14180 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
14190 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  CAT: {.      ass
141a0 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f  ert( TK_AND==OP_
141b0 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  And );.      ass
141c0 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f  ert( TK_OR==OP_O
141d0 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
141e0 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41  t( TK_PLUS==OP_A
141f0 64 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  dd );.      asse
14200 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50  rt( TK_MINUS==OP
14210 5f 53 75 62 74 72 61 63 74 20 29 3b 0a 20 20 20  _Subtract );.   
14220 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45     assert( TK_RE
14230 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20  M==OP_Remainder 
14240 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14250 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42   TK_BITAND==OP_B
14260 69 74 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61  itAnd );.      a
14270 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d  ssert( TK_BITOR=
14280 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 0a 20 20 20  =OP_BitOr );.   
14290 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c     assert( TK_SL
142a0 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29  ASH==OP_Divide )
142b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
142c0 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68  TK_LSHIFT==OP_Sh
142d0 69 66 74 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  iftLeft );.     
142e0 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49   assert( TK_RSHI
142f0 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68  FT==OP_ShiftRigh
14300 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
14310 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50  t( TK_CONCAT==OP
14320 5f 43 6f 6e 63 61 74 20 29 3b 0a 20 20 20 20 20  _Concat );.     
14330 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
14340 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 74  K_AND );.      t
14350 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
14360 4f 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  OR );.      test
14370 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55  case( op==TK_PLU
14380 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
14390 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55  ase( op==TK_MINU
143a0 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
143b0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20  ase( op==TK_REM 
143c0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
143d0 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44  e( op==TK_BITAND
143e0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
143f0 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52  se( op==TK_BITOR
14400 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14410 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48  se( op==TK_SLASH
14420 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14430 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46  se( op==TK_LSHIF
14440 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
14450 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49  ase( op==TK_RSHI
14460 46 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  FT );.      test
14470 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e  case( op==TK_CON
14480 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  CAT );.      r1 
14490 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
144a0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
144b0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
144c0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
144d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
144e0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
144f0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
14500 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
14510 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14520 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c  3(v, op, r2, r1,
14530 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
14540 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
14550 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
14560 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
14570 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
14580 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
14590 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b  ase TK_UMINUS: {
145a0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
145b0 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
145c0 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
145d0 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20   pLeft );.      
145e0 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
145f0 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  K_INTEGER ){.   
14600 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
14610 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
14620 31 2c 20 74 61 72 67 65 74 29 3b 0a 23 69 66 6e  1, target);.#ifn
14630 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14640 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
14650 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
14660 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f  Left->op==TK_FLO
14670 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  AT ){.        as
14680 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
14690 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
146a0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
146b0 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
146c0 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65  , pLeft->u.zToke
146d0 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23  n, 1, target);.#
146e0 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
146f0 65 7b 0a 20 20 20 20 20 20 20 20 72 65 67 46 72  e{.        regFr
14700 65 65 31 20 3d 20 72 31 20 3d 20 73 71 6c 69 74  ee1 = r1 = sqlit
14710 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
14720 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
14730 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14740 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
14750 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 72  , r1);.        r
14760 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
14770 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
14780 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
14790 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
147a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
147b0 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61  Op3(v, OP_Subtra
147c0 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67  ct, r2, r1, targ
147d0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  et);.        tes
147e0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
147f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
14800 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67      inReg = targ
14810 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  et;.      break;
14820 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
14830 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63  TK_BITNOT:.    c
14840 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
14850 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
14860 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74  ITNOT==OP_BitNot
14870 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14880 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74  ( TK_NOT==OP_Not
14890 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
148a0 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f  se( op==TK_BITNO
148b0 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
148c0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20  ase( op==TK_NOT 
148d0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
148e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
148f0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
14900 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
14910 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
14920 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
14930 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  );.      inReg =
14940 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 73   target;.      s
14950 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14960 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65  (v, op, r1, inRe
14970 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
14980 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
14990 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
149a0 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
149b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
149c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
149d0 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73  TK_ISNULL==OP_Is
149e0 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73  Null );.      as
149f0 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c  sert( TK_NOTNULL
14a00 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a  ==OP_NotNull );.
14a10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14a20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
14a30 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14a40 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
14a50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14a60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14a70 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72  _Integer, 1, tar
14a80 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  get);.      r1 =
14a90 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
14aa0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
14ab0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
14ac0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
14ad0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
14ae0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72  =0 );.      addr
14af0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
14b00 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b  dOp1(v, op, r1);
14b10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14b20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
14b30 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 2d  ddImm, target, -
14b40 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
14b50 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
14b60 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72   addr);.      br
14b70 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
14b80 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
14b90 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67  ION: {.      Agg
14ba0 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45  Info *pInfo = pE
14bb0 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20  xpr->pAggInfo;. 
14bc0 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d       if( pInfo==
14bd0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
14be0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
14bf0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
14c00 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
14c10 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
14c20 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69  rMsg(pParse, "mi
14c30 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74  suse of aggregat
14c40 65 3a 20 25 73 28 29 22 2c 20 70 45 78 70 72 2d  e: %s()", pExpr-
14c50 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
14c60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14c70 20 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d 3e   inReg = pInfo->
14c80 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67  aFunc[pExpr->iAg
14c90 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d  g].iMem;.      }
14ca0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14cb0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
14cc0 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20  CONST_FUNC:.    
14cd0 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
14ce0 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  : {.      ExprLi
14cf0 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20  st *pFarg;      
14d00 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63   /* List of func
14d10 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
14d20 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 61 72  /.      int nFar
14d30 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
14d40 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e 63  * Number of func
14d50 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
14d60 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  /.      FuncDef 
14d70 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20 20 2f  *pDef;         /
14d80 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 64  * The function d
14d90 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74  efinition object
14da0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 49   */.      int nI
14db0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
14dc0 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68   /* Length of th
14dd0 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  e function name 
14de0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
14df0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
14e00 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  d;       /* The 
14e10 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
14e20 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e 73 74  .      int const
14e30 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f 2a  Mask = 0;     /*
14e40 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74 69 6f   Mask of functio
14e50 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74  n arguments that
14e60 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a 2f   are constant */
14e70 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
14e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14e90 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
14ea0 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20  .      u8 enc = 
14eb0 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20 2f 2a  ENC(db);      /*
14ec0 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69   The text encodi
14ed0 6e 67 20 75 73 65 64 20 62 79 20 74 68 69 73 20  ng used by this 
14ee0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
14ef0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
14f00 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20 63 6f   = 0;    /* A co
14f10 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
14f20 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72   */..      asser
14f30 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
14f40 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
14f50 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
14f60 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
14f70 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 20 29 3b  TK_CONST_FUNC );
14f80 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14f90 20 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e   op==TK_FUNCTION
14fa0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78   );.      if( Ex
14fb0 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
14fc0 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
14fd0 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
14fe0 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20   pFarg = 0;.    
14ff0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15000 20 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e   pFarg = pExpr->
15010 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d  x.pList;.      }
15020 0a 20 20 20 20 20 20 6e 46 61 72 67 20 3d 20 70  .      nFarg = p
15030 46 61 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45  Farg ? pFarg->nE
15040 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 61  xpr : 0;.      a
15050 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
15060 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
15070 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
15080 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72       zId = pExpr
15090 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
150a0 20 20 6e 49 64 20 3d 20 73 71 6c 69 74 65 33 53    nId = sqlite3S
150b0 74 72 6c 65 6e 33 30 28 7a 49 64 29 3b 0a 20 20  trlen30(zId);.  
150c0 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
150d0 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
150e0 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 46 61  b, zId, nId, nFa
150f0 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20  rg, enc, 0);.   
15100 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29     if( pDef==0 )
15110 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
15120 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15130 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74  , "unknown funct
15140 69 6f 6e 3a 20 25 2e 2a 73 28 29 22 2c 20 6e 49  ion: %.*s()", nI
15150 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  d, zId);.       
15160 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
15170 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70  .      /* Attemp
15180 74 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c 65  t a direct imple
15190 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
151a0 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53   built-in COALES
151b0 43 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20 2a  CE() and.      *
151c0 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74  * IFNULL() funct
151d0 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f 69  ions.  This avoi
151e0 64 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 65  ds unnecessary e
151f0 76 61 6c 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20  valation of.    
15200 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 70    ** arguments p
15210 61 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 6f  ast the first no
15220 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e  n-NULL argument.
15230 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
15240 69 66 28 20 70 44 65 66 2d 3e 66 6c 61 67 73 20  if( pDef->flags 
15250 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f  & SQLITE_FUNC_CO
15260 41 4c 45 53 43 45 20 29 7b 0a 20 20 20 20 20 20  ALESCE ){.      
15270 20 20 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63    int endCoalesc
15280 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
15290 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
152a0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61       assert( nFa
152b0 72 67 3e 3d 32 20 29 3b 0a 20 20 20 20 20 20 20  rg>=2 );.       
152c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
152d0 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
152e0 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  a[0].pExpr, targ
152f0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  et);.        for
15300 28 69 3d 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69  (i=1; i<nFarg; i
15310 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
15320 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15330 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
15340 74 61 72 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65  target, endCoale
15350 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sce);.          
15360 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
15370 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 74  Remove(pParse, t
15380 61 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 20  arget, 1);.     
15390 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
153a0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
153b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
153c0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
153d0 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d  rse, pFarg->a[i]
153e0 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
153f0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
15400 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
15410 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20  Parse, 1);.     
15420 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
15430 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
15440 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65  abel(v, endCoale
15450 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  sce);.        br
15460 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20  eak;.      }... 
15470 20 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29       if( pFarg )
15480 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  {.        r1 = s
15490 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
154a0 67 65 28 70 50 61 72 73 65 2c 20 6e 46 61 72 67  ge(pParse, nFarg
154b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
154c0 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
154d0 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20  pParse);     /* 
154e0 54 69 63 6b 65 74 20 32 65 61 32 34 32 35 64 33  Ticket 2ea2425d3
154f0 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  4be */.        s
15500 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
15510 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
15520 46 61 72 67 2c 20 72 31 2c 20 31 29 3b 0a 20 20  Farg, r1, 1);.  
15530 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
15540 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
15550 2c 20 31 29 3b 20 20 20 2f 2a 20 54 69 63 6b 65  , 1);   /* Ticke
15560 74 20 32 65 61 32 34 32 35 64 33 34 62 65 20 2a  t 2ea2425d34be *
15570 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /.      }else{. 
15580 20 20 20 20 20 20 20 72 31 20 3d 20 30 3b 0a 20         r1 = 0;. 
15590 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
155a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
155b0 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a  ALTABLE.      /*
155c0 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f   Possibly overlo
155d0 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ad the function 
155e0 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67  if the first arg
155f0 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a  ument is.      *
15600 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  * a virtual tabl
15610 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20  e column..      
15620 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  **.      ** For 
15630 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20  infix functions 
15640 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47  (LIKE, GLOB, REG
15650 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20  EXP, and MATCH) 
15660 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  use the.      **
15670 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
15680 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c  , not the first,
15690 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74   as the argument
156a0 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20   to test to.    
156b0 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
156c0 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20  s a column in a 
156d0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20  virtual table.  
156e0 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63  This is done bec
156f0 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  ause.      ** th
15700 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f  e left operand o
15710 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e  f infix function
15720 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77  s (the operand w
15730 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20  e want to.      
15740 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c  ** control overl
15750 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20  oading) ends up 
15760 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
15770 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20  gument to the.  
15780 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
15790 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e    The expression
157a0 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65   "A glob B" is e
157b0 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20  quivalent to .  
157c0 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41      ** "glob(B,A
157d0 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75  ).  We want to u
157e0 73 65 20 74 68 65 20 41 20 69 6e 20 22 41 20 67  se the A in "A g
157f0 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20  lob B" to test. 
15800 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63       ** for func
15810 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67  tion overloading
15820 2e 20 20 42 75 74 20 77 65 20 75 73 65 20 74 68  .  But we use th
15830 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f  e B term in "glo
15840 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a  b(B,A)"..      *
15850 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72  /.      if( nFar
15860 67 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d 3e  g>=2 && (pExpr->
15870 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69 78  flags & EP_Infix
15880 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20  Func) ){.       
15890 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56   pDef = sqlite3V
158a0 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74  tabOverloadFunct
158b0 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46  ion(db, pDef, nF
158c0 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d  arg, pFarg->a[1]
158d0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  .pExpr);.      }
158e0 65 6c 73 65 20 69 66 28 20 6e 46 61 72 67 3e 30  else if( nFarg>0
158f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
15900 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76   = sqlite3VtabOv
15910 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64  erloadFunction(d
15920 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20  b, pDef, nFarg, 
15930 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
15940 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  r);.      }.#end
15950 69 66 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  if.      for(i=0
15960 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b  ; i<nFarg; i++){
15970 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 33  .        if( i<3
15980 32 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  2 && sqlite3Expr
15990 49 73 43 6f 6e 73 74 61 6e 74 28 70 46 61 72 67  IsConstant(pFarg
159a0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
159b0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
159c0 4d 61 73 6b 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a  Mask |= (1<<i);.
159d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
159e0 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 6c 61    if( (pDef->fla
159f0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
15a00 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26  _NEEDCOLL)!=0 &&
15a10 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
15a20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
15a30 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
15a40 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
15a50 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
15a60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15a70 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 6c      if( pDef->fl
15a80 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
15a90 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20  C_NEEDCOLL ){.  
15aa0 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
15ab0 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
15ac0 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20  DfltColl; .     
15ad0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15ae0 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53  dOp4(v, OP_CollS
15af0 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68  eq, 0, 0, 0, (ch
15b00 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  ar *)pColl, P4_C
15b10 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d  OLLSEQ);.      }
15b20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15b30 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46  beAddOp4(v, OP_F
15b40 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73 74 4d 61  unction, constMa
15b50 73 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c 0a  sk, r1, target,.
15b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b70 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
15b80 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  Def, P4_FUNCDEF)
15b90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
15ba0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28  dbeChangeP5(v, (
15bb0 75 38 29 6e 46 61 72 67 29 3b 0a 20 20 20 20 20  u8)nFarg);.     
15bc0 20 69 66 28 20 6e 46 61 72 67 20 29 7b 0a 20 20   if( nFarg ){.  
15bd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
15be0 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
15bf0 61 72 73 65 2c 20 72 31 2c 20 6e 46 61 72 67 29  arse, r1, nFarg)
15c00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15c10 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
15c20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15c30 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
15c40 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20  se TK_EXISTS:.  
15c50 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
15c60 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
15c70 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  se( op==TK_EXIST
15c80 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
15c90 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45  ase( op==TK_SELE
15ca0 43 54 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65  CT );.      inRe
15cb0 67 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53  g = sqlite3CodeS
15cc0 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
15cd0 20 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20   pExpr, 0, 0);. 
15ce0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15cf0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
15d00 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  : {.      int de
15d10 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69  stIfFalse = sqli
15d20 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
15d30 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64  (v);.      int d
15d40 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69  estIfNull = sqli
15d50 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
15d60 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
15d70 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15d80 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
15d90 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
15da0 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61  e3ExprCodeIN(pPa
15db0 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
15dc0 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e  IfFalse, destIfN
15dd0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
15de0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15df0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
15e00 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
15e10 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
15e20 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
15e30 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 73 71  False);.      sq
15e40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15e50 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61  v, OP_AddImm, ta
15e60 72 67 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  rget, 0);.      
15e70 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
15e80 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49  veLabel(v, destI
15e90 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
15ea0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
15eb0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
15ec0 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20  _SUBQUERY */... 
15ed0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20     /*.    **    
15ee0 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20  x BETWEEN y AND 
15ef0 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  z.    **.    ** 
15f00 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65  This is equivale
15f10 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20  nt to.    **.   
15f20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20   **    x>=y AND 
15f30 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  x<=z.    **.    
15f40 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20 69  ** X is stored i
15f50 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a  n pExpr->pLeft..
15f60 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72      ** Y is stor
15f70 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  ed in pExpr->pLi
15f80 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a  st->a[0].pExpr..
15f90 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72      ** Z is stor
15fa0 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  ed in pExpr->pLi
15fb0 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a  st->a[1].pExpr..
15fc0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
15fd0 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
15fe0 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
15ff0 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
16000 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
16010 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74  rList_item *pLIt
16020 65 6d 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  em = pExpr->x.pL
16030 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78  ist->a;.      Ex
16040 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 4c 49  pr *pRight = pLI
16050 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20  tem->pExpr;..   
16060 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
16070 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
16080 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 65 67 46  se, pLeft, &regF
16090 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
160a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
160b0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52  eTemp(pParse, pR
160c0 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
160d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
160e0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
160f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16100 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
16110 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74        r3 = sqlit
16120 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
16130 72 73 65 29 3b 0a 20 20 20 20 20 20 72 34 20 3d  rse);.      r4 =
16140 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
16150 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
16160 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
16170 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
16180 67 68 74 2c 20 4f 50 5f 47 65 2c 0a 20 20 20 20  ght, OP_Ge,.    
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
161a0 2c 20 72 32 2c 20 72 33 2c 20 53 51 4c 49 54 45  , r2, r3, SQLITE
161b0 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20  _STOREP2);.     
161c0 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20   pLItem++;.     
161d0 20 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d   pRight = pLItem
161e0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ->pExpr;.      s
161f0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
16200 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
16210 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 72 32  Free2);.      r2
16220 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
16230 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
16240 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
16250 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
16260 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
16270 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
16280 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
16290 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65  t, pRight, OP_Le
162a0 2c 20 72 31 2c 20 72 32 2c 20 72 34 2c 20 53 51  , r1, r2, r4, SQ
162b0 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20  LITE_STOREP2);. 
162c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
162d0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 6e 64  AddOp3(v, OP_And
162e0 2c 20 72 33 2c 20 72 34 2c 20 74 61 72 67 65 74  , r3, r4, target
162f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16300 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
16310 50 61 72 73 65 2c 20 72 33 29 3b 0a 20 20 20 20  Parse, r3);.    
16320 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
16330 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
16340 72 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r4);.      break
16350 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
16360 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20   TK_UPLUS: {.   
16370 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
16380 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
16390 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
163a0 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a  pLeft, target);.
163b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
163c0 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
163d0 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20  TRIGGER: {.     
163e0 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64   /* If the opcod
163f0 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c  e is TK_TRIGGER,
16400 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
16410 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65  sion is a refere
16420 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  nce.      ** to 
16430 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  a column in the 
16440 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70  new.* or old.* p
16450 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61  seudo-tables ava
16460 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20  ilable to.      
16470 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  ** trigger progr
16480 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ams. In this cas
16490 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73  e Expr.iTable is
164a0 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68   set to 1 for th
164b0 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a  e.      ** new.*
164c0 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f   pseudo-table, o
164d0 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e  r 0 for the old.
164e0 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20  * pseudo-table. 
164f0 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20  Expr.iColumn.   
16500 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20     ** is set to 
16510 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  the column of th
16520 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74  e pseudo-table t
16530 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31  o read, or to -1
16540 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   to.      ** rea
16550 64 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c  d the rowid fiel
16560 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
16570 20 20 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73    ** The express
16580 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
16590 65 64 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50  ed using an OP_P
165a0 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65  aram opcode. The
165b0 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 70 61 72   p1.      ** par
165c0 61 6d 65 74 65 72 20 69 73 20 73 65 74 20 74 6f  ameter is set to
165d0 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f   0 for an old.ro
165e0 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 6f  wid reference, o
165f0 72 20 74 6f 20 28 69 2b 31 29 0a 20 20 20 20 20  r to (i+1).     
16600 20 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e 63 65   ** to reference
16610 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20   another column 
16620 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65  of the old.* pse
16630 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72 65  udo-table, where
16640 20 0a 20 20 20 20 20 20 2a 2a 20 69 20 69 73 20   .      ** i is 
16650 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
16660 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e   column. For a n
16670 65 77 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e  ew.rowid referen
16680 63 65 2c 20 70 31 20 69 73 0a 20 20 20 20 20 20  ce, p1 is.      
16690 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c  ** set to (n+1),
166a0 20 77 68 65 72 65 20 6e 20 69 73 20 74 68 65 20   where n is the 
166b0 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
166c0 73 20 69 6e 20 65 61 63 68 20 70 73 65 75 64 6f  s in each pseudo
166d0 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  -table..      **
166e0 20 46 6f 72 20 61 20 72 65 66 65 72 65 6e 63 65   For a reference
166f0 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 63 6f   to any other co
16700 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e  lumn in the new.
16710 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20  * pseudo-table, 
16720 70 31 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  p1.      ** is s
16730 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77  et to (n+2+i), w
16740 68 65 72 65 20 6e 20 61 6e 64 20 69 20 61 72 65  here n and i are
16750 20 61 73 20 64 65 66 69 6e 65 64 20 70 72 65 76   as defined prev
16760 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20  iously. For.    
16770 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66    ** example, if
16780 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 77 68   the table on wh
16790 69 63 68 20 74 72 69 67 67 65 72 73 20 61 72 65  ich triggers are
167a0 20 62 65 69 6e 67 20 66 69 72 65 64 20 69 73 0a   being fired is.
167b0 20 20 20 20 20 20 2a 2a 20 64 65 63 6c 61 72 65        ** declare
167c0 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  d as:.      **. 
167d0 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
167e0 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
167f0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
16800 2a 2a 20 54 68 65 6e 20 70 31 20 69 73 20 69 6e  ** Then p1 is in
16810 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c  terpreted as fol
16820 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  lows:.      **. 
16830 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20       **   p1==0 
16840 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69    ->    old.rowi
16850 64 20 20 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e  d     p1==3   ->
16860 20 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20      new.rowid.  
16870 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20      **   p1==1  
16880 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20 20   ->    old.a    
16890 20 20 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20       p1==4   -> 
168a0 20 20 20 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a     new.a.      *
168b0 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20  *   p1==2   ->  
168c0 20 20 6f 6c 64 2e 62 20 20 20 20 20 20 20 20 20    old.b         
168d0 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65  p1==5   ->    ne
168e0 77 2e 62 20 20 20 20 20 20 20 0a 20 20 20 20 20  w.b       .     
168f0 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
16900 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70  *pTab = pExpr->p
16910 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70  Tab;.      int p
16920 31 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  1 = pExpr->iTabl
16930 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b  e * (pTab->nCol+
16940 31 29 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e  1) + 1 + pExpr->
16950 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20  iColumn;..      
16960 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69  assert( pExpr->i
16970 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70  Table==0 || pExp
16980 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a  r->iTable==1 );.
16990 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
169a0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31  xpr->iColumn>=-1
169b0 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
169c0 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  mn<pTab->nCol );
169d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
169e0 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20  Tab->iPKey<0 || 
169f0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  pExpr->iColumn!=
16a00 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20  pTab->iPKey );. 
16a10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e       assert( p1>
16a20 3d 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e  =0 && p1<(pTab->
16a30 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20  nCol*2+2) );..  
16a40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16a50 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61  ddOp2(v, OP_Para
16a60 6d 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a  m, p1, target);.
16a70 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
16a80 74 28 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e 20  t((v, "%s.%s -> 
16a90 24 25 64 22 2c 0a 20 20 20 20 20 20 20 20 28 70  $%d",.        (p
16aa0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22  Expr->iTable ? "
16ab0 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20  new" : "old"),. 
16ac0 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69         (pExpr->i
16ad0 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69  Column<0 ? "rowi
16ae0 64 22 20 3a 20 70 45 78 70 72 2d 3e 70 54 61 62  d" : pExpr->pTab
16af0 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43  ->aCol[pExpr->iC
16b00 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20  olumn].zName),. 
16b10 20 20 20 20 20 20 20 74 61 72 67 65 74 0a 20 20         target.  
16b20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66      ));..#ifndef
16b30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
16b40 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
16b50 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
16b60 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66 69  mn has REAL affi
16b70 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75 72  nity, it may cur
16b80 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64  rently be stored
16b90 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20   as an.      ** 
16ba0 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50 5f  integer. Use OP_
16bb0 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f 20  RealAffinity to 
16bc0 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  make sure it is 
16bd0 72 65 61 6c 6c 79 20 72 65 61 6c 2e 20 20 2a 2f  really real.  */
16be0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
16bf0 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20  ->iColumn>=0 .  
16c00 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43       && pTab->aC
16c10 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ol[pExpr->iColum
16c20 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  n].affinity==SQL
16c30 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20  ITE_AFF_REAL.   
16c40 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
16c50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
16c60 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69  v, OP_RealAffini
16c70 74 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ty, target);.   
16c80 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
16c90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
16ca0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46  .    /*.    ** F
16cb0 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20  orm A:.    **   
16cc0 43 41 53 45 20 78 20 57 48 45 4e 20 65 31 20 54  CASE x WHEN e1 T
16cd0 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54  HEN r1 WHEN e2 T
16ce0 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20  HEN r2 ... WHEN 
16cf0 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
16d00 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
16d10 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20   ** Form B:.    
16d20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 65  **   CASE WHEN e
16d30 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65  1 THEN r1 WHEN e
16d40 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48  2 THEN r2 ... WH
16d50 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c  EN eN THEN rN EL
16d60 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
16d70 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73      ** Form A is
16d80 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72   can be transfor
16d90 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75  med into the equ
16da0 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61  ivalent form B a
16db0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a  s follows:.    *
16dc0 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d  *   CASE WHEN x=
16dd0 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  e1 THEN r1 WHEN 
16de0 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  x=e2 THEN r2 ...
16df0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57  .    **        W
16e00 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e  HEN x=eN THEN rN
16e10 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
16e20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20  **.    ** X (if 
16e30 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e  it exists) is in
16e40 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20   pExpr->pLeft.. 
16e50 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 70 45     ** Y is in pE
16e60 78 70 72 2d 3e 70 52 69 67 68 74 2e 20 20 54 68  xpr->pRight.  Th
16e70 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69  e Y is also opti
16e80 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 72 65 20  onal.  If there 
16e90 69 73 20 6e 6f 0a 20 20 20 20 2a 2a 20 45 4c 53  is no.    ** ELS
16ea0 45 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 20  E clause and no 
16eb0 6f 74 68 65 72 20 74 65 72 6d 20 6d 61 74 63 68  other term match
16ec0 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  es, then the res
16ed0 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ult of the.    *
16ee0 2a 20 65 78 70 72 73 73 69 6f 6e 20 69 73 20 4e  * exprssion is N
16ef0 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69  ULL..    ** Ei i
16f00 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  s in pExpr->pLis
16f10 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69  t->a[i*2] and Ri
16f20 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   is pExpr->pList
16f30 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20  ->a[i*2+1]..    
16f40 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  **.    ** The re
16f50 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72  sult of the expr
16f60 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69  ession is the Ri
16f70 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d   for the first m
16f80 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20  atching Ei,.    
16f90 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65 20 69  ** or if there i
16fa0 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69  s no matching Ei
16fb0 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20  , the ELSE term 
16fc0 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20 69  Y, or if there i
16fd0 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45  s.    ** no ELSE
16fe0 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20   term, NULL..   
16ff0 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
17000 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f   assert( op==TK_
17010 43 41 53 45 20 29 3b 20 7b 0a 20 20 20 20 20 20  CASE ); {.      
17020 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20  int endLabel;   
17030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17040 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20    /* GOTO label 
17050 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20  for end of CASE 
17060 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  stmt */.      in
17070 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20  t nextCase;     
17080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17090 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f  /* GOTO label fo
170a0 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75  r next WHEN clau
170b0 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  se */.      int 
170c0 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  nExpr;          
170d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
170e0 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48   2x number of WH
170f0 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
17100 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
17110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17120 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
17130 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ter */.      Exp
17140 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20  rList *pEList;  
17150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17160 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74  * List of WHEN t
17170 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74  erms */.      st
17180 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
17190 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20  em *aListelem;  
171a0 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e  /* Array of WHEN
171b0 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
171c0 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20  Expr opCompare; 
171d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171e0 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65    /* The X==Ei e
171f0 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
17200 20 20 20 45 78 70 72 20 63 61 63 68 65 58 3b 20     Expr cacheX; 
17210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17220 20 20 20 20 20 2f 2a 20 43 61 63 68 65 64 20 65       /* Cached e
17230 78 70 72 65 73 73 69 6f 6e 20 58 20 2a 2f 0a 20  xpression X */. 
17240 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20       Expr *pX;  
17250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17260 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20         /* The X 
17270 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
17280 20 20 20 20 45 78 70 72 20 2a 70 54 65 73 74 20      Expr *pTest 
17290 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
172a0 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28        /* X==Ei (
172b0 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20  form A) or just 
172c0 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20  Ei (form B) */. 
172d0 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69       VVA_ONLY( i
172e0 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c 20 3d  nt iCacheLevel =
172f0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
17300 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61  evel; )..      a
17310 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
17320 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
17330 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26 20  P_xIsSelect) && 
17340 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29  pExpr->x.pList )
17350 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 28  ;.      assert((
17360 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
17370 6e 45 78 70 72 20 25 20 32 29 20 3d 3d 20 30 29  nExpr % 2) == 0)
17380 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
17390 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
173a0 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20  Expr > 0);.     
173b0 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   pEList = pExpr-
173c0 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
173d0 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69  aListelem = pELi
173e0 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78  st->a;.      nEx
173f0 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  pr = pEList->nEx
17400 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62  pr;.      endLab
17410 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  el = sqlite3Vdbe
17420 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
17430 20 20 20 20 69 66 28 20 28 70 58 20 3d 20 70 45      if( (pX = pE
17440 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29  xpr->pLeft)!=0 )
17450 7b 0a 20 20 20 20 20 20 20 20 63 61 63 68 65 58  {.        cacheX
17460 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20   = *pX;.        
17470 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70  testcase( pX->op
17480 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
17490 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
174a0 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49   pX->op==TK_REGI
174b0 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20 20 20  STER );.        
174c0 63 61 63 68 65 58 2e 69 54 61 62 6c 65 20 3d 20  cacheX.iTable = 
174d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
174e0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2c 20  emp(pParse, pX, 
174f0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
17500 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
17510 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
17520 20 20 20 20 20 63 61 63 68 65 58 2e 6f 70 20 3d       cacheX.op =
17530 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20   TK_REGISTER;.  
17540 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
17550 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20  op = TK_EQ;.    
17560 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c      opCompare.pL
17570 65 66 74 20 3d 20 26 63 61 63 68 65 58 3b 0a 20  eft = &cacheX;. 
17580 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 26         pTest = &
17590 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20  opCompare;.     
175a0 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35     /* Ticket b35
175b0 31 64 39 35 66 39 63 64 35 65 66 31 37 65 39 64  1d95f9cd5ef17e9d
175c0 39 64 62 61 65 31 38 66 35 63 61 38 36 31 31 31  9dbae18f5ca86111
175d0 39 30 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a  90001:.        *
175e0 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72  * The value in r
175f0 65 67 46 72 65 65 31 20 6d 69 67 68 74 20 67 65  egFree1 might ge
17600 74 20 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20  t SCopy-ed into 
17610 74 68 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e  the file result.
17620 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d  .        ** So m
17630 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
17640 65 20 72 65 67 46 72 65 65 31 20 72 65 67 69 73  e regFree1 regis
17650 74 65 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65  ter is not reuse
17660 64 20 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20  d for other.    
17670 20 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20      ** purposes 
17680 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65  and possibly ove
17690 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20  rwritten.  */.  
176a0 20 20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d        regFree1 =
176b0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
176c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
176d0 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20  pr; i=i+2){.    
176e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
176f0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
17700 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 58  ;.        if( pX
17710 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
17720 73 65 72 74 28 20 70 54 65 73 74 21 3d 30 20 29  sert( pTest!=0 )
17730 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f  ;.          opCo
17740 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61  mpare.pRight = a
17750 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
17760 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  r;.        }else
17770 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 73  {.          pTes
17780 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d  t = aListelem[i]
17790 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
177a0 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74 43 61  }.        nextCa
177b0 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
177c0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
177d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
177e0 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pTest->op==TK_CO
177f0 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
17800 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
17810 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 73 74  se(pParse, pTest
17820 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49  , nextCase, SQLI
17830 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
17840 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
17850 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d  ( aListelem[i+1]
17860 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43  .pExpr->op==TK_C
17870 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20  OLUMN );.       
17880 20 74 65 73 74 63 61 73 65 28 20 61 4c 69 73 74   testcase( aList
17890 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d  elem[i+1].pExpr-
178a0 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
178b0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
178c0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
178d0 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se, aListelem[i+
178e0 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  1].pExpr, target
178f0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
17900 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17910 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 4c  OP_Goto, 0, endL
17920 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  abel);.        s
17930 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
17940 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20  op(pParse, 1);. 
17950 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17960 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
17970 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20  , nextCase);.   
17980 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
17990 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a  Expr->pRight ){.
179a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
179b0 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
179c0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
179d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
179e0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
179f0 67 68 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  ght, target);.  
17a00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17a10 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
17a20 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 1);.      }els
17a30 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
17a40 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17a50 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
17a60 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  et);.      }.   
17a70 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
17a80 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
17a90 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 0a 20  Parse->nErr>0 . 
17aa0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
17ab0 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
17ac0 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c 20 29 3b  ==iCacheLevel );
17ad0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17ae0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
17af0 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20  , endLabel);.   
17b00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17b10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17b20 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20  MIT_TRIGGER.    
17b30 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b  case TK_RAISE: {
17b40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17b50 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
17b60 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20  OE_Rollback .   
17b70 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72          || pExpr
17b80 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41  ->affinity==OE_A
17b90 62 6f 72 74 0a 20 20 20 20 20 20 20 20 20 20 20  bort.           
17ba0 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  || pExpr->affini
17bb0 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20  ty==OE_Fail.    
17bc0 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
17bd0 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67  >affinity==OE_Ig
17be0 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  nore.      );.  
17bf0 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d      if( !pParse-
17c00 3e 70 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a  >pTriggerTab ){.
17c10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
17c20 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
17c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c40 20 20 20 20 20 20 20 22 52 41 49 53 45 28 29 20         "RAISE() 
17c50 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  may only be used
17c60 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65   within a trigge
17c70 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20  r-program");.   
17c80 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
17c90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
17ca0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
17cb0 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20  ==OE_Abort ){.  
17cc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79        sqlite3May
17cd0 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20  Abort(pParse);. 
17ce0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
17cf0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
17d00 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
17d10 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
17d20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66     if( pExpr->af
17d30 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72  finity==OE_Ignor
17d40 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
17d50 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a  ite3VdbeAddOp4(.
17d60 20 20 20 20 20 20 20 20 20 20 20 20 76 2c 20 4f              v, O
17d70 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f  P_Halt, SQLITE_O
17d80 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c  K, OE_Ignore, 0,
17d90 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
17da0 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ,0);.      }else
17db0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
17dc0 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
17dd0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 61  pParse, pExpr->a
17de0 66 66 69 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e  ffinity, pExpr->
17df0 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20  u.zToken, 0);.  
17e00 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72 65      }..      bre
17e10 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
17e20 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
17e30 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
17e40 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
17e50 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
17e60 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
17e70 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74  regFree2);.  ret
17e80 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a  urn inReg;.}../*
17e90 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
17ea0 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e  e to evaluate an
17eb0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
17ec0 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
17ed0 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69  s.** into a regi
17ee0 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68  ster.  Return th
17ef0 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  e register numbe
17f00 72 20 77 68 65 72 65 20 74 68 65 20 72 65 73 75  r where the resu
17f10 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65  lts.** are store
17f20 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
17f30 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65  register is a te
17f40 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
17f50 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 65 61   that can be dea
17f60 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65  llocated,.** the
17f70 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62  n write its numb
17f80 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20  er into *pReg.  
17f90 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72 65  If the result re
17fa0 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a  gister is not.**
17fb0 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68   a temporary, th
17fc0 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20  en set *pReg to 
17fd0 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  zero..*/.int sql
17fe0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
17ff0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
18000 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
18010 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72   *pReg){.  int r
18020 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
18030 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
18040 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65   int r2 = sqlite
18050 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
18060 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72  pParse, pExpr, r
18070 31 29 3b 0a 20 20 69 66 28 20 72 32 3d 3d 72 31  1);.  if( r2==r1
18080 20 29 7b 0a 20 20 20 20 2a 70 52 65 67 20 3d 20   ){.    *pReg = 
18090 72 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r1;.  }else{.   
180a0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
180b0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
180c0 31 29 3b 0a 20 20 20 20 2a 70 52 65 67 20 3d 20  1);.    *pReg = 
180d0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
180e0 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  r2;.}../*.** Gen
180f0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
18100 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78  will evaluate ex
18110 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61  pression pExpr a
18120 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20  nd store the.** 
18130 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73  results in regis
18140 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65  ter target.  The
18150 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61   results are gua
18160 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61  ranteed to appea
18170 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  r.** in register
18180 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 69 6e 74 20   target..*/.int 
18190 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
181a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
181b0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
181c0 74 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69  target){.  int i
181d0 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  nReg;..  assert(
181e0 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72   target>0 && tar
181f0 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65  get<=pParse->nMe
18200 6d 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  m );.  if( pExpr
18210 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   && pExpr->op==T
18220 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20  K_REGISTER ){.  
18230 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18240 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
18250 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70  e, OP_Copy, pExp
18260 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65  r->iTable, targe
18270 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
18280 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
18290 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
182a0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
182b0 72 67 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72  rget);.    asser
182c0 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  t( pParse->pVdbe
182d0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
182e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
182f0 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74      if( inReg!=t
18300 61 72 67 65 74 20 26 26 20 70 50 61 72 73 65 2d  arget && pParse-
18310 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 20 20  >pVdbe ){.      
18320 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18330 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  2(pParse->pVdbe,
18340 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67   OP_SCopy, inReg
18350 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d  , target);.    }
18360 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 74 61  .  }.  return ta
18370 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rget;.}../*.** G
18380 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
18390 74 20 65 76 61 6c 75 74 65 73 20 74 68 65 20 67  t evalutes the g
183a0 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
183b0 61 6e 64 20 70 75 74 73 20 74 68 65 20 72 65 73  and puts the res
183c0 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  ult.** in regist
183d0 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a  er target..**.**
183e0 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70   Also make a cop
183f0 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  y of the express
18400 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  ion results into
18410 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22   another "cache"
18420 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64   register.** and
18430 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70 72   modify the expr
18440 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74  ession so that t
18450 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20  he next time it 
18460 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a  is evaluated,.**
18470 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   the result is a
18480 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63   copy of the cac
18490 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a  he register..**.
184a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
184b0 69 73 20 75 73 65 64 20 66 6f 72 20 65 78 70 72  is used for expr
184c0 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65  essions that are
184d0 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a   used multiple .
184e0 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20  ** times.  They 
184f0 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e  are evaluated on
18500 63 65 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c  ce and the resul
18510 74 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ts of the expres
18520 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73  sion.** are reus
18530 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
18540 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63  e3ExprCodeAndCac
18550 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
18560 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
18570 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64  nt target){.  Vd
18580 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
18590 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 6e 52  pVdbe;.  int inR
185a0 65 67 3b 0a 20 20 69 6e 52 65 67 20 3d 20 73 71  eg;.  inReg = sq
185b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
185c0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
185d0 67 65 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  get);.  assert( 
185e0 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 2f 2a  target>0 );.  /*
185f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
18600 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 65 72 6d   called for term
18610 73 20 74 6f 20 49 4e 53 45 52 54 20 6f 72 20 55  s to INSERT or U
18620 50 44 41 54 45 2e 20 20 41 6e 64 20 74 68 65 20  PDATE.  And the 
18630 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72 20  only.  ** other 
18640 70 6c 61 63 65 20 77 68 65 72 65 20 65 78 70 72  place where expr
18650 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 63  essions can be c
18660 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 54 4b  onverted into TK
18670 5f 52 45 47 49 53 54 45 52 20 69 73 0a 20 20 2a  _REGISTER is.  *
18680 2a 20 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73  * in WHERE claus
18690 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 53  e processing.  S
186a0 6f 20 61 73 20 63 75 72 72 65 6e 74 6c 79 20 69  o as currently i
186b0 6d 70 6c 65 6d 65 6e 74 65 64 2c 20 74 68 65 72  mplemented, ther
186c0 65 20 69 73 0a 20 20 2a 2a 20 6e 6f 20 77 61 79  e is.  ** no way
186d0 20 66 6f 72 20 61 20 54 4b 5f 52 45 47 49 53 54   for a TK_REGIST
186e0 45 52 20 74 6f 20 65 78 69 73 74 20 68 65 72 65  ER to exist here
186f0 2e 20 20 42 75 74 20 69 74 20 73 65 65 6d 73 20  .  But it seems 
18700 70 72 75 64 65 6e 74 20 74 6f 0a 20 20 2a 2a 20  prudent to.  ** 
18710 6b 65 65 70 20 74 68 65 20 41 4c 57 41 59 53 28  keep the ALWAYS(
18720 29 20 69 6e 20 63 61 73 65 20 74 68 65 20 63 6f  ) in case the co
18730 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 63  nditions above c
18740 68 61 6e 67 65 20 77 69 74 68 20 66 75 74 75 72  hange with futur
18750 65 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74  e.  ** modificat
18760 69 6f 6e 73 20 6f 72 20 65 6e 68 61 6e 63 65 6d  ions or enhancem
18770 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 28 20 41  ents. */.  if( A
18780 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 6f 70 21  LWAYS(pExpr->op!
18790 3d 54 4b 5f 52 45 47 49 53 54 45 52 29 20 29 7b  =TK_REGISTER) ){
187a0 20 20 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 3b    .    int iMem;
187b0 0a 20 20 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50  .    iMem = ++pP
187c0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
187d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
187e0 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 69 6e  2(v, OP_Copy, in
187f0 52 65 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  Reg, iMem);.    
18800 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
18810 69 4d 65 6d 3b 0a 20 20 20 20 70 45 78 70 72 2d  iMem;.    pExpr-
18820 3e 6f 70 32 20 3d 20 70 45 78 70 72 2d 3e 6f 70  >op2 = pExpr->op
18830 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  ;.    pExpr->op 
18840 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
18850 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65   }.  return inRe
18860 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  g;.}../*.** Retu
18870 72 6e 20 54 52 55 45 20 69 66 20 70 45 78 70 72  rn TRUE if pExpr
18880 20 69 73 20 61 6e 20 63 6f 6e 73 74 61 6e 74 20   is an constant 
18890 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
188a0 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  is appropriate.*
188b0 2a 20 66 6f 72 20 66 61 63 74 6f 72 69 6e 67 20  * for factoring 
188c0 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 20 20  out of a loop.  
188d0 41 70 70 72 6f 70 72 69 61 74 65 20 65 78 70 72  Appropriate expr
188e0 65 73 73 69 6f 6e 73 20 61 72 65 3a 0a 2a 2a 0a  essions are:.**.
188f0 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20 65 78 70  **    *  Any exp
18900 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65 76 61  ression that eva
18910 6c 75 61 74 65 73 20 74 6f 20 74 77 6f 20 6f 72  luates to two or
18920 20 6d 6f 72 65 20 6f 70 63 6f 64 65 73 2e 0a 2a   more opcodes..*
18930 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20 4f  *.**    *  Any O
18940 50 5f 49 6e 74 65 67 65 72 2c 20 4f 50 5f 52 65  P_Integer, OP_Re
18950 61 6c 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 4f  al, OP_String, O
18960 50 5f 42 6c 6f 62 2c 20 4f 50 5f 4e 75 6c 6c 2c  P_Blob, OP_Null,
18970 20 0a 2a 2a 20 20 20 20 20 20 20 6f 72 20 4f 50   .**       or OP
18980 5f 56 61 72 69 61 62 6c 65 20 74 68 61 74 20 64  _Variable that d
18990 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
189a0 62 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 0a  be placed in a .
189b0 2a 2a 20 20 20 20 20 20 20 73 70 65 63 69 66 69  **       specifi
189c0 63 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a  c register..**.*
189d0 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  * There is no po
189e0 69 6e 74 20 69 6e 20 66 61 63 74 6f 72 69 6e 67  int in factoring
189f0 20 6f 75 74 20 73 69 6e 67 6c 65 2d 69 6e 73 74   out single-inst
18a00 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74  ruction constant
18a10 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
18a20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
18a30 70 6c 61 63 65 64 20 69 6e 20 61 20 70 61 72 74  placed in a part
18a40 69 63 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e  icular register.
18a50 20 20 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 66    .** We could f
18a60 61 63 74 6f 72 20 74 68 65 6d 20 6f 75 74 2c 20  actor them out, 
18a70 62 75 74 20 74 68 65 6e 20 77 65 20 77 6f 75 6c  but then we woul
18a80 64 20 65 6e 64 20 75 70 20 61 64 64 69 6e 67 20  d end up adding 
18a90 61 6e 0a 2a 2a 20 4f 50 5f 53 43 6f 70 79 20 69  an.** OP_SCopy i
18aa0 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 6d 6f  nstruction to mo
18ab0 76 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74  ve the value int
18ac0 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65  o the correct re
18ad0 67 69 73 74 65 72 0a 2a 2a 20 6c 61 74 65 72 2e  gister.** later.
18ae0 20 20 57 65 20 6d 69 67 68 74 20 61 73 20 77 65    We might as we
18af0 6c 6c 20 6a 75 73 74 20 75 73 65 20 74 68 65 20  ll just use the 
18b00 6f 72 69 67 69 6e 61 6c 20 69 6e 73 74 72 75 63  original instruc
18b10 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 61 76 6f 69  tion and.** avoi
18b20 64 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 2e 0a  d the OP_SCopy..
18b30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
18b40 41 70 70 72 6f 70 72 69 61 74 65 46 6f 72 46 61  AppropriateForFa
18b50 63 74 6f 72 69 6e 67 28 45 78 70 72 20 2a 70 29  ctoring(Expr *p)
18b60 7b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  {.  if( !sqlite3
18b70 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
18b80 74 4a 6f 69 6e 28 70 29 20 29 7b 0a 20 20 20 20  tJoin(p) ){.    
18b90 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4f 6e  return 0;  /* On
18ba0 6c 79 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72  ly constant expr
18bb0 65 73 73 69 6f 6e 73 20 61 72 65 20 61 70 70 72  essions are appr
18bc0 6f 70 72 69 61 74 65 20 66 6f 72 20 66 61 63 74  opriate for fact
18bd0 6f 72 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69  oring */.  }.  i
18be0 66 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45  f( (p->flags & E
18bf0 50 5f 46 69 78 65 64 44 65 73 74 29 3d 3d 30 20  P_FixedDest)==0 
18c00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
18c10 20 20 2f 2a 20 41 6e 79 20 63 6f 6e 73 74 61 6e    /* Any constan
18c20 74 20 77 69 74 68 6f 75 74 20 61 20 66 69 78 65  t without a fixe
18c30 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  d destination is
18c40 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a   appropriate */.
18c50 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e    }.  while( p->
18c60 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 20 70  op==TK_UPLUS ) p
18c70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 73   = p->pLeft;.  s
18c80 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
18c90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18ca0 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c  MIT_BLOB_LITERAL
18cb0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
18cc0 42 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61  B:.#endif.    ca
18cd0 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a  se TK_VARIABLE:.
18ce0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
18cf0 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  GER:.    case TK
18d00 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65  _FLOAT:.    case
18d10 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 63 61   TK_NULL:.    ca
18d20 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
18d30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18d40 70 2d 3e 6f 70 3d 3d 54 4b 5f 42 4c 4f 42 20 29  p->op==TK_BLOB )
18d50 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
18d60 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49  ( p->op==TK_VARI
18d70 41 42 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65  ABLE );.      te
18d80 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
18d90 4b 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20  K_INTEGER );.   
18da0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
18db0 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 3b 0a  op==TK_FLOAT );.
18dc0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18dd0 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c 20 29  p->op==TK_NULL )
18de0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
18df0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49  ( p->op==TK_STRI
18e00 4e 47 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 53  NG );.      /* S
18e10 69 6e 67 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f  ingle-instructio
18e20 6e 20 63 6f 6e 73 74 61 6e 74 73 20 77 69 74 68  n constants with
18e30 20 61 20 66 69 78 65 64 20 64 65 73 74 69 6e 61   a fixed destina
18e40 74 69 6f 6e 20 61 72 65 0a 20 20 20 20 20 20 2a  tion are.      *
18e50 2a 20 62 65 74 74 65 72 20 64 6f 6e 65 20 69 6e  * better done in
18e60 2d 6c 69 6e 65 2e 20 20 49 66 20 77 65 20 66 61  -line.  If we fa
18e70 63 74 6f 72 20 74 68 65 6d 2c 20 74 68 65 79 20  ctor them, they 
18e80 77 69 6c 6c 20 6a 75 73 74 20 65 6e 64 0a 20 20  will just end.  
18e90 20 20 20 20 2a 2a 20 75 70 20 67 65 6e 65 72 61      ** up genera
18ea0 74 69 6e 67 20 61 6e 20 4f 50 5f 53 43 6f 70 79  ting an OP_SCopy
18eb0 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 76 61 6c   to move the val
18ec0 75 65 20 74 6f 20 74 68 65 20 64 65 73 74 69 6e  ue to the destin
18ed0 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72  ation.      ** r
18ee0 65 67 69 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20  egister. */.    
18ef0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
18f00 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  }.    case TK_UM
18f10 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 66  INUS: {.      if
18f20 28 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d  ( p->pLeft->op==
18f30 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 2d 3e 70  TK_FLOAT || p->p
18f40 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  Left->op==TK_INT
18f50 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
18f60 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
18f70 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
18f80 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
18f90 3a 20 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  : {.      break;
18fa0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
18fb0 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
18fc0 49 66 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  If pExpr is a co
18fd0 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f  nstant expressio
18fe0 6e 20 74 68 61 74 20 69 73 20 61 70 70 72 6f 70  n that is approp
18ff0 72 69 61 74 65 20 66 6f 72 0a 2a 2a 20 66 61 63  riate for.** fac
19000 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20 61 20  toring out of a 
19010 6c 6f 6f 70 2c 20 74 68 65 6e 20 65 76 61 6c 75  loop, then evalu
19020 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ate the expressi
19030 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67  on.** into a reg
19040 69 73 74 65 72 20 61 6e 64 20 63 6f 6e 76 65 72  ister and conver
19050 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
19060 20 69 6e 74 6f 20 61 20 54 4b 5f 52 45 47 49 53   into a TK_REGIS
19070 54 45 52 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  TER.** expressio
19080 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
19090 20 65 76 61 6c 43 6f 6e 73 74 45 78 70 72 28 57   evalConstExpr(W
190a0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
190b0 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
190c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
190d0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
190e0 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
190f0 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
19100 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 63 61 73 65   TK_IN:.    case
19110 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a   TK_REGISTER: {.
19120 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
19130 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  _Prune;.    }.  
19140 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
19150 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
19160 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  AGG_FUNCTION:.  
19170 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f    case TK_CONST_
19180 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  FUNC: {.      /*
19190 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74   The arguments t
191a0 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 76  o a function hav
191b0 65 20 61 20 66 69 78 65 64 20 64 65 73 74 69 6e  e a fixed destin
191c0 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20  ation..      ** 
191d0 4d 61 72 6b 20 74 68 65 6d 20 74 68 69 73 20 77  Mark them this w
191e0 61 79 20 74 6f 20 61 76 6f 69 64 20 67 65 6e 65  ay to avoid gene
191f0 72 61 74 65 64 20 75 6e 6e 65 65 64 65 64 20 4f  rated unneeded O
19200 50 5f 53 43 6f 70 79 0a 20 20 20 20 20 20 2a 2a  P_SCopy.      **
19210 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 0a   instructions. .
19220 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45        */.      E
19230 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
19240 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
19250 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
19260 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
19270 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
19280 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ect) );.      if
19290 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
192a0 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74     int i = pList
192b0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
192c0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
192d0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70  _item *pItem = p
192e0 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20  List->a;.       
192f0 20 66 6f 72 28 3b 20 69 3e 30 3b 20 69 2d 2d 2c   for(; i>0; i--,
19300 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
19310 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
19320 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 20 29 20  pItem->pExpr) ) 
19330 70 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 66 6c  pItem->pExpr->fl
19340 61 67 73 20 7c 3d 20 45 50 5f 46 69 78 65 64 44  ags |= EP_FixedD
19350 65 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  est;.        }. 
19360 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
19370 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
19380 69 66 28 20 69 73 41 70 70 72 6f 70 72 69 61 74  if( isAppropriat
19390 65 46 6f 72 46 61 63 74 6f 72 69 6e 67 28 70 45  eForFactoring(pE
193a0 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  xpr) ){.    int 
193b0 72 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  r1 = ++pParse->n
193c0 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20 72 32 3b  Mem;.    int r2;
193d0 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65  .    r2 = sqlite
193e0 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
193f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72  pParse, pExpr, r
19400 31 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45  1);.    if( NEVE
19410 52 28 72 31 21 3d 72 32 29 20 29 20 73 71 6c 69  R(r1!=r2) ) sqli
19420 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
19430 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
19440 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20     pExpr->op2 = 
19450 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 70  pExpr->op;.    p
19460 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45  Expr->op = TK_RE
19470 47 49 53 54 45 52 3b 0a 20 20 20 20 70 45 78 70  GISTER;.    pExp
19480 72 2d 3e 69 54 61 62 6c 65 20 3d 20 72 32 3b 0a  r->iTable = r2;.
19490 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
194a0 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rune;.  }.  retu
194b0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
194c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 65 76 61  .}../*.** Preeva
194d0 6c 75 61 74 65 20 63 6f 6e 73 74 61 6e 74 20 73  luate constant s
194e0 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 69  ubexpressions wi
194f0 74 68 69 6e 20 70 45 78 70 72 20 61 6e 64 20 73  thin pExpr and s
19500 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75  tore the.** resu
19510 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 73  lts in registers
19520 2e 20 20 4d 6f 64 69 66 79 20 70 45 78 70 72 20  .  Modify pExpr 
19530 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73  so that the cons
19540 74 61 6e 74 20 73 75 62 65 78 70 72 65 73 69 6f  tant subexpresio
19550 6e 73 0a 2a 2a 20 61 72 65 20 54 4b 5f 52 45 47  ns.** are TK_REG
19560 49 53 54 45 52 20 6f 70 63 6f 64 65 73 20 74 68  ISTER opcodes th
19570 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  at refer to the 
19580 70 72 65 63 6f 6d 70 75 74 65 64 20 76 61 6c 75  precomputed valu
19590 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
195a0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
195b0 70 20 69 66 20 74 68 65 20 6a 75 6d 70 20 74 6f  p if the jump to
195c0 20 74 68 65 20 63 6f 6f 6b 69 65 2d 63 68 65 63   the cookie-chec
195d0 6b 20 63 6f 64 65 20 68 61 73 0a 2a 2a 20 61 6c  k code has.** al
195e0 72 65 61 64 79 20 6f 63 63 75 72 2e 20 20 53 69  ready occur.  Si
195f0 6e 63 65 20 74 68 65 20 63 6f 6f 6b 69 65 2d 63  nce the cookie-c
19600 68 65 63 6b 20 6a 75 6d 70 20 69 73 20 67 65 6e  heck jump is gen
19610 65 72 61 74 65 64 20 70 72 69 6f 72 20 74 6f 0a  erated prior to.
19620 2a 2a 20 61 6e 79 20 6f 74 68 65 72 20 73 65 72  ** any other ser
19630 69 6f 75 73 20 70 72 6f 63 65 73 73 69 6e 67 2c  ious processing,
19640 20 74 68 69 73 20 63 68 65 63 6b 20 65 6e 73 75   this check ensu
19650 72 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69  res that there i
19660 73 20 6e 6f 0a 2a 2a 20 77 61 79 20 74 6f 20 61  s no.** way to a
19670 63 63 69 64 65 6e 74 6c 79 20 62 79 70 61 73 73  ccidently bypass
19680 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e   the constant in
19690 69 74 69 61 6c 69 7a 61 74 69 6f 6e 73 2e 0a 2a  itializations..*
196a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
196b0 65 20 69 73 20 61 6c 73 6f 20 61 20 6e 6f 2d 6f  e is also a no-o
196c0 70 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f  p if the SQLITE_
196d0 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 20 6f  FactorOutConst o
196e0 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 69  ptimization.** i
196f0 73 20 64 69 73 61 62 6c 65 64 20 76 69 61 20 74  s disabled via t
19700 68 65 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  he sqlite3_test_
19710 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
19720 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
19730 54 49 4f 4e 53 29 0a 2a 2a 20 69 6e 74 65 72 66  TIONS).** interf
19740 61 63 65 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77  ace.  This allow
19750 73 20 74 65 73 74 20 6c 6f 67 69 63 20 74 6f 20  s test logic to 
19760 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
19770 73 61 6d 65 20 61 6e 73 77 65 72 20 69 73 0a 2a  same answer is.*
19780 2a 20 6f 62 74 61 69 6e 65 64 20 66 6f 72 20 71  * obtained for q
19790 75 65 72 69 65 73 20 72 65 67 61 72 64 6c 65 73  ueries regardles
197a0 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20  s of whether or 
197b0 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 73 20 61 72  not constants ar
197c0 65 0a 2a 2a 20 70 72 65 63 6f 6d 70 75 74 65 64  e.** precomputed
197d0 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 73 20   into registers 
197e0 6f 72 20 69 66 20 74 68 65 79 20 61 72 65 20 69  or if they are i
197f0 6e 73 65 72 74 65 64 20 69 6e 2d 6c 69 6e 65 2e  nserted in-line.
19800 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
19810 45 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74  ExprCodeConstant
19820 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
19830 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
19840 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 69 66 28   Walker w;.  if(
19850 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
19860 6f 74 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  oto ) return;.  
19870 69 66 28 20 28 70 50 61 72 73 65 2d 3e 64 62 2d  if( (pParse->db-
19880 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
19890 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29 21  FactorOutConst)!
198a0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77  =0 ) return;.  w
198b0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
198c0 20 65 76 61 6c 43 6f 6e 73 74 45 78 70 72 3b 0a   evalConstExpr;.
198d0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
198e0 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 70 50 61  ack = 0;.  w.pPa
198f0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
19900 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
19910 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 0a  &w, pExpr);.}...
19920 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
19930 6f 64 65 20 74 68 61 74 20 70 75 73 68 65 73 20  ode that pushes 
19940 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65  the value of eve
19950 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ry element of th
19960 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65  e given.** expre
19970 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20  ssion list into 
19980 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65  a sequence of re
19990 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e  gisters beginnin
199a0 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a  g at target..**.
199b0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
199c0 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
199d0 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f 0a 69   evaluated..*/.i
199e0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
199f0 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  deExprList(.  Pa
19a00 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
19a10 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
19a20 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
19a30 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54  t *pList,   /* T
19a40 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
19a50 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  st to be coded *
19a60 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20  /.  int target, 
19a70 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
19a80 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74 73  to write results
19a90 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 48 61 72 64   */.  int doHard
19aa0 43 6f 70 79 20 20 20 20 20 2f 2a 20 4d 61 6b 65  Copy     /* Make
19ab0 20 61 20 68 61 72 64 20 63 6f 70 79 20 6f 66 20   a hard copy of 
19ac0 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 2a 2f  every element */
19ad0 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  .){.  struct Exp
19ae0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
19af0 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  m;.  int i, n;. 
19b00 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
19b10 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  0 );.  assert( t
19b20 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73  arget>0 );.  ass
19b30 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64  ert( pParse->pVd
19b40 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76  be!=0 );  /* Nev
19b50 65 72 20 67 65 74 73 20 74 68 69 73 20 66 61 72  er gets this far
19b60 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20   otherwise */.  
19b70 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  n = pList->nExpr
19b80 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
19b90 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e  ist->a, i=0; i<n
19ba0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
19bb0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
19bc0 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
19bd0 0a 20 20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d  .    int inReg =
19be0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
19bf0 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
19c00 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b  Expr, target+i);
19c10 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d  .    if( inReg!=
19c20 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20  target+i ){.    
19c30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19c40 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
19c50 65 2c 20 64 6f 48 61 72 64 43 6f 70 79 20 3f 20  e, doHardCopy ? 
19c60 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f  OP_Copy : OP_SCo
19c70 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  py,.            
19c80 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 52 65              inRe
19c90 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  g, target+i);.  
19ca0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
19cb0 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   n;.}../*.** Gen
19cc0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
19cd0 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f   BETWEEN operato
19ce0 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45  r..**.**    x BE
19cf0 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a  TWEEN y AND z.**
19d00 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73  .** The above is
19d10 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a   equivalent to .
19d20 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e  **.**    x>=y AN
19d30 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64  D x<=z.**.** Cod
19d40 65 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61  e it as such, ta
19d50 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20  king care to do 
19d60 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78  the common subex
19d70 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 65 6d  pression.** elem
19d80 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a  entation of x..*
19d90 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
19da0 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 0a 20  prCodeBetween(. 
19db0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
19dc0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
19dd0 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
19de0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
19df0 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
19e00 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45 4e 20   /* The BETWEEN 
19e10 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
19e20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20 20  int dest,       
19e30 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
19e40 66 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61  f the jump is ta
19e50 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d  ken */.  int jum
19e60 70 49 66 54 72 75 65 2c 20 20 20 2f 2a 20 54 61  pIfTrue,   /* Ta
19e70 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74  ke the jump if t
19e80 68 65 20 42 45 54 57 45 45 4e 20 69 73 20 74 72  he BETWEEN is tr
19e90 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  ue */.  int jump
19ea0 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b  IfNull    /* Tak
19eb0 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68  e the jump if th
19ec0 65 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55 4c  e BETWEEN is NUL
19ed0 4c 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 65  L */.){.  Expr e
19ee0 78 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54  xprAnd;     /* T
19ef0 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20  he AND operator 
19f00 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d  in  x>=y AND x<=
19f10 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d  z  */.  Expr com
19f20 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54 68 65  pLeft;    /* The
19f30 20 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a    x>=y  term */.
19f40 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74    Expr compRight
19f50 3b 20 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a  ;   /* The  x<=z
19f60 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72    term */.  Expr
19f70 20 65 78 70 72 58 3b 20 20 20 20 20 20 20 2f 2a   exprX;       /*
19f80 20 54 68 65 20 20 78 20 20 73 75 62 65 78 70 72   The  x  subexpr
19f90 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
19fa0 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a  regFree1 = 0; /*
19fb0 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72   Temporary use r
19fc0 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73  egister */..  as
19fd0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
19fe0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
19ff0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
1a000 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d   exprX = *pExpr-
1a010 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e  >pLeft;.  exprAn
1a020 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20  d.op = TK_AND;. 
1a030 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d   exprAnd.pLeft =
1a040 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78   &compLeft;.  ex
1a050 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26  prAnd.pRight = &
1a060 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d  compRight;.  com
1a070 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45  pLeft.op = TK_GE
1a080 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65  ;.  compLeft.pLe
1a090 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63  ft = &exprX;.  c
1a0a0 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d  ompLeft.pRight =
1a0b0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
1a0c0 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63  >a[0].pExpr;.  c
1a0d0 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b  ompRight.op = TK
1a0e0 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  _LE;.  compRight
1a0f0 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b  .pLeft = &exprX;
1a100 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69  .  compRight.pRi
1a110 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ght = pExpr->x.p
1a120 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
1a130 3b 0a 20 20 65 78 70 72 58 2e 69 54 61 62 6c 65  ;.  exprX.iTable
1a140 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1a150 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26  deTemp(pParse, &
1a160 65 78 70 72 58 2c 20 26 72 65 67 46 72 65 65 31  exprX, &regFree1
1a170 29 3b 0a 20 20 65 78 70 72 58 2e 6f 70 20 3d 20  );.  exprX.op = 
1a180 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 69  TK_REGISTER;.  i
1a190 66 28 20 6a 75 6d 70 49 66 54 72 75 65 20 29 7b  f( jumpIfTrue ){
1a1a0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1a1b0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 26  IfTrue(pParse, &
1a1c0 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a  exprAnd, dest, j
1a1d0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65  umpIfNull);.  }e
1a1e0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
1a1f0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1a200 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65  se, &exprAnd, de
1a210 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1a220 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
1a230 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1a240 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
1a250 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 64 65  .  /* Ensure ade
1a260 71 75 61 74 65 20 74 65 73 74 20 63 6f 76 65 72  quate test cover
1a270 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  age */.  testcas
1a280 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30  e( jumpIfTrue==0
1a290 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
1a2a0 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
1a2b0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1a2c0 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26  jumpIfTrue==0 &&
1a2d0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
1a2e0 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
1a2f0 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
1a300 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75  pIfTrue==0 && ju
1a310 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
1a320 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1a330 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1a340 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49  True==0 && jumpI
1a350 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
1a360 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
1a370 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
1a380 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e!=0 && jumpIfNu
1a390 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
1a3a0 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
1a3b0 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d  se( jumpIfTrue!=
1a3c0 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  0 && jumpIfNull=
1a3d0 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
1a3e0 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
1a3f0 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26   jumpIfTrue!=0 &
1a400 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
1a410 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
1a420 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
1a430 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a  mpIfTrue!=0 && j
1a440 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
1a450 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 7d  regFree1!=0 );.}
1a460 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1a470 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
1a480 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
1a490 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
1a4a0 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
1a4b0 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
1a4c0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1a4d0 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65   is true but exe
1a4e0 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e  cution.** contin
1a4f0 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72  ues straight thr
1a500 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  u if the express
1a510 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a  ion is false..**
1a520 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
1a530 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
1a540 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72  to NULL (neither
1a550 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29   true nor false)
1a560 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74  , then.** take t
1a570 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a  he jump if the j
1a580 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69  umpIfNull flag i
1a590 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  s SQLITE_JUMPIFN
1a5a0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
1a5b0 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20  code depends on 
1a5c0 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65  the fact that ce
1a5d0 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75  rtain token valu
1a5e0 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a  es (ex: TK_EQ).*
1a5f0 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61  * are the same a
1a600 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20  s opcode values 
1a610 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74  (ex: OP_Eq) that
1a620 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
1a630 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
1a640 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63  operation.  Spec
1a650 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  ial comments in 
1a660 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d  vdbe.c and the m
1a670 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72  kopcodeh.awk scr
1a680 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61  ipt in.** the ma
1a690 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65  ke process cause
1a6a0 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f   these values to
1a6b0 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28   align.  Assert(
1a6c0 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a  )s in the code.*
1a6d0 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74  * below verify t
1a6e0 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20  hat the numbers 
1a6f0 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72  are aligned corr
1a700 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ectly..*/.void s
1a710 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
1a720 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1a730 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
1a740 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49   dest, int jumpI
1a750 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a  fNull){.  Vdbe *
1a760 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1a770 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b  e;.  int op = 0;
1a780 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
1a790 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
1a7a0 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee2 = 0;.  int r
1a7b0 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74  1, r2;..  assert
1a7c0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  ( jumpIfNull==SQ
1a7d0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
1a7e0 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  || jumpIfNull==0
1a7f0 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
1a800 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65 74 75  v==0) )     retu
1a810 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 61 6e 63  rn;  /* Existanc
1a820 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65  e of VDBE checke
1a830 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20  d by caller */. 
1a840 20 69 66 28 20 4e 45 56 45 52 28 70 45 78 70 72   if( NEVER(pExpr
1a850 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ==0) ) return;  
1a860 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73 20 63  /* No way this c
1a870 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f  an happen */.  o
1a880 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
1a890 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
1a8a0 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
1a8b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
1a8c0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1a8d0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
1a8e0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1a8f0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1a900 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1a910 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
1a920 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1a930 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1a940 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
1a950 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49  ,jumpIfNull^SQLI
1a960 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
1a970 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a980 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
1a990 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
1a9a0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1a9b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1a9c0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1a9d0 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71  v, d2);.      sq
1a9e0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1a9f0 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20  p(pParse, 1);.  
1aa00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1aa10 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
1aa20 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1aa30 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1aa40 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1aa50 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
1aa60 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1aa70 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1aa80 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
1aa90 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
1aaa0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1aab0 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
1aac0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
1aad0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1aae0 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
1aaf0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1ab00 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1ab10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1ab20 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
1ab30 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
1ab40 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1ab50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ab60 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
1ab70 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
1ab80 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
1ab90 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
1aba0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
1abb0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
1abc0 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  Q: {.      asser
1abd0 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20  t( TK_LT==OP_Lt 
1abe0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1abf0 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b   TK_LE==OP_Le );
1ac00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1ac10 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  K_GT==OP_Gt );. 
1ac20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1ac30 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20  GE==OP_Ge );.   
1ac40 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51     assert( TK_EQ
1ac50 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20  ==OP_Eq );.     
1ac60 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d   assert( TK_NE==
1ac70 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 74  OP_Ne );.      t
1ac80 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1ac90 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LT );.      test
1aca0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20  case( op==TK_LE 
1acb0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1acc0 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a  e( op==TK_GT );.
1acd0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ace0 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20  op==TK_GE );.   
1acf0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1ad00 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20  =TK_EQ );.      
1ad10 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1ad20 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _NE );.      tes
1ad30 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1ad40 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31  l==0 );.      r1
1ad50 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1ad60 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1ad70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1ad80 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
1ad90 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
1ada0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1adb0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
1adc0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
1add0 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
1ade0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1adf0 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
1ae00 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
1ae10 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
1ae20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1ae30 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1ae40 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1ae50 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ae60 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1ae70 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ae80 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1ae90 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
1aea0 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  ISNOT: {.      t
1aeb0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1aec0 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IS );.      test
1aed0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
1aee0 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  OT );.      r1 =
1aef0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1af00 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1af10 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1af20 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
1af30 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1af40 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1af50 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
1af60 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f  gFree2);.      o
1af70 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20  p = (op==TK_IS) 
1af80 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b  ? TK_EQ : TK_NE;
1af90 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
1afa0 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
1afb0 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
1afc0 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
1afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
1afe0 2c 20 72 32 2c 20 64 65 73 74 2c 20 53 51 4c 49  , r2, dest, SQLI
1aff0 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
1b000 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1b010 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1b020 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1b030 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1b040 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1b050 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
1b060 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
1b070 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73  NULL: {.      as
1b080 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d  sert( TK_ISNULL=
1b090 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20  =OP_IsNull );.  
1b0a0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
1b0b0 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75  OTNULL==OP_NotNu
1b0c0 6c 6c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ll );.      test
1b0d0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
1b0e0 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ULL );.      tes
1b0f0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
1b100 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72  TNULL );.      r
1b110 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1b120 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1b130 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1b140 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1b150 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b160 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73  2(v, op, r1, des
1b170 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
1b180 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1b190 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1b1a0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1b1b0 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
1b1c0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1b1d0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1b1e0 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77      exprCodeBetw
1b1f0 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  een(pParse, pExp
1b200 72 2c 20 64 65 73 74 2c 20 31 2c 20 6a 75 6d 70  r, dest, 1, jump
1b210 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
1b220 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
1b230 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b240 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
1b250 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
1b260 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65   int destIfFalse
1b270 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1b280 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
1b290 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
1b2a0 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20   = jumpIfNull ? 
1b2b0 64 65 73 74 20 3a 20 64 65 73 74 49 66 46 61 6c  dest : destIfFal
1b2c0 73 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se;.      sqlite
1b2d0 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
1b2e0 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49  se, pExpr, destI
1b2f0 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75  fFalse, destIfNu
1b300 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
1b310 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b320 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74  OP_Goto, 0, dest
1b330 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b340 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1b350 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  (v, destIfFalse)
1b360 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1b370 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1b380 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
1b390 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1b3a0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1b3b0 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65  , pExpr, &regFre
1b3c0 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
1b3d0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1b3e0 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c  OP_If, r1, dest,
1b3f0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b   jumpIfNull!=0);
1b400 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1b410 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1b420 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1b430 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1b440 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1b450 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1b460 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1b470 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
1b480 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
1b490 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1b4a0 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a  e, regFree2);  .
1b4b0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1b4c0 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
1b4d0 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
1b4e0 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
1b4f0 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
1b500 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
1b510 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
1b520 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65  n is false but e
1b530 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
1b540 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
1b550 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
1b560 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a  ssion is true..*
1b570 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
1b580 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
1b590 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
1b5a0 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
1b5b0 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69  ) then.** jump i
1b5c0 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20  f jumpIfNull is 
1b5d0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1b5e0 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67  L or fall throug
1b5f0 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a  h if jumpIfNull.
1b600 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ** is 0..*/.void
1b610 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
1b620 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lse(Parse *pPars
1b630 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
1b640 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
1b650 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
1b660 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1b670 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
1b680 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
1b690 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  e1 = 0;.  int re
1b6a0 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e  gFree2 = 0;.  in
1b6b0 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73  t r1, r2;..  ass
1b6c0 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ert( jumpIfNull=
1b6d0 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  =SQLITE_JUMPIFNU
1b6e0 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c  LL || jumpIfNull
1b6f0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  ==0 );.  if( NEV
1b700 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
1b710 6e 3b 20 2f 2a 20 45 78 69 73 74 61 6e 63 65 20  n; /* Existance 
1b720 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20  of VDBE checked 
1b730 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69  by caller */.  i
1b740 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20  f( pExpr==0 )   
1b750 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54   return;..  /* T
1b760 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70  he value of pExp
1b770 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65  r->op and op are
1b780 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c   related as foll
1b790 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
1b7a0 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20       pExpr->op  
1b7b0 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a            op.  *
1b7c0 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  *       --------
1b7d0 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d  -          -----
1b7e0 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20  -----.  **      
1b7f0 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20   TK_ISNULL      
1b800 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20      OP_NotNull. 
1b810 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54   **       TK_NOT
1b820 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f  NULL         OP_
1b830 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  IsNull.  **     
1b840 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20    TK_NE         
1b850 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20       OP_Eq.  ** 
1b860 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20        TK_EQ     
1b870 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20           OP_Ne. 
1b880 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20   **       TK_GT 
1b890 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
1b8a0 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Le.  **       TK
1b8b0 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _LE             
1b8c0 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20   OP_Gt.  **     
1b8d0 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20    TK_GE         
1b8e0 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20       OP_Lt.  ** 
1b8f0 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20        TK_LT     
1b900 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20           OP_Ge. 
1b910 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68   **.  ** For oth
1b920 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78  er values of pEx
1b930 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e  pr->op, op is un
1b940 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73  defined and unus
1b950 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c  ed..  ** The val
1b960 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50  ue of TK_ and OP
1b970 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20  _ constants are 
1b980 61 72 72 61 6e 67 65 64 20 73 75 63 68 20 74 68  arranged such th
1b990 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63  at we.  ** can c
1b9a0 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70 69  ompute the mappi
1b9b0 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74  ng above using t
1b9c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70  he following exp
1b9d0 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73  ression..  ** As
1b9e0 73 65 72 74 28 29 73 20 76 65 72 69 66 79 20 74  sert()s verify t
1b9f0 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74  hat the computat
1ba00 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ion is correct..
1ba10 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45    */.  op = ((pE
1ba20 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55  xpr->op+(TK_ISNU
1ba30 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53  LL&1))^1)-(TK_IS
1ba40 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56  NULL&1);..  /* V
1ba50 65 72 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c  erify correct al
1ba60 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61  ignment of TK_ a
1ba70 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
1ba80 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1ba90 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53  pExpr->op!=TK_IS
1baa0 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e  NULL || op==OP_N
1bab0 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65  otNull );.  asse
1bac0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1bad0 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  K_NOTNULL || op=
1bae0 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20  =OP_IsNull );.  
1baf0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1bb00 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_NE || op==
1bb10 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72  OP_Eq );.  asser
1bb20 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1bb30 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65  _EQ || op==OP_Ne
1bb40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1bb50 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c  xpr->op!=TK_LT |
1bb60 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20  | op==OP_Ge );. 
1bb70 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1bb80 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d  op!=TK_LE || op=
1bb90 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65  =OP_Gt );.  asse
1bba0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1bbb0 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GT || op==OP_L
1bbc0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
1bbd0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20  Expr->op!=TK_GE 
1bbe0 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a  || op==OP_Lt );.
1bbf0 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
1bc00 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
1bc10 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20   TK_AND: {.     
1bc20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1bc30 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1bc40 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
1bc50 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
1bc60 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
1bc70 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1bc80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1bc90 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
1bca0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
1bcb0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1bcc0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1bcd0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1bce0 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OR: {.      int 
1bcf0 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
1bd00 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1bd10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1bd20 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1bd30 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1bd40 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
1bd50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1bd60 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
1bd70 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1bd80 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e   d2, jumpIfNull^
1bd90 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1bda0 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
1bdb0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1bdc0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1bdd0 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
1bde0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
1bdf0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1be00 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
1be10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1be20 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31  chePop(pParse, 1
1be30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1be40 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1be50 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  K_NOT: {.      t
1be60 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1be70 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1be80 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
1be90 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1bea0 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
1beb0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1bec0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1bed0 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
1bee0 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
1bef0 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
1bf00 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
1bf10 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
1bf20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
1bf30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1bf40 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20  op==TK_LT );.   
1bf50 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1bf60 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20  =TK_LE );.      
1bf70 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1bf80 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GT );.      tes
1bf90 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45  tcase( op==TK_GE
1bfa0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1bfb0 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b  se( op==TK_EQ );
1bfc0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1bfd0 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20   op==TK_NE );.  
1bfe0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1bff0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1c000 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1c010 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1c020 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1c030 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1c040 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
1c050 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1c060 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1c070 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
1c080 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
1c090 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
1c0a0 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
1c0b0 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
1c0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1c0d0 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d  1, r2, dest, jum
1c0e0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1c0f0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1c100 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1c110 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1c120 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
1c130 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1c140 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
1c150 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a  ase TK_ISNOT: {.
1c160 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c170 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
1c180 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1c190 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
1c1a0 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20  K_ISNOT );.     
1c1b0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1c1c0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1c1d0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1c1e0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1c1f0 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1c200 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1c210 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1c220 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1c230 20 20 20 20 6f 70 20 3d 20 28 70 45 78 70 72 2d      op = (pExpr-
1c240 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  >op==TK_IS) ? TK
1c250 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20 20 20  _NE : TK_EQ;.   
1c260 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1c270 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1c280 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
1c290 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
1c2a0 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
1c2b0 2c 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e  , dest, SQLITE_N
1c2c0 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65  ULLEQ);.      te
1c2d0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1c2e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
1c2f0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
1c300 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1c310 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1c320 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
1c330 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
1c340 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1c350 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
1c360 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  L );.      testc
1c370 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
1c380 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ULL );.      r1 
1c390 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1c3a0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1c3b0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1c3c0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71  Free1);.      sq
1c3d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1c3e0 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29  v, op, r1, dest)
1c3f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1c400 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1c410 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c420 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1c430 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
1c440 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1c450 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1c460 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65    exprCodeBetwee
1c470 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
1c480 20 64 65 73 74 2c 20 30 2c 20 6a 75 6d 70 49 66   dest, 0, jumpIf
1c490 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
1c4a0 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
1c4b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
1c4c0 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
1c4d0 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
1c4e0 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b  f( jumpIfNull ){
1c4f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c500 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
1c510 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
1c520 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
1c530 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
1c540 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c  destIfNull = sql
1c550 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1c560 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  l(v);.        sq
1c570 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
1c580 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
1c590 65 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  est, destIfNull)
1c5a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1c5b0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1c5c0 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  l(v, destIfNull)
1c5d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c5e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
1c5f0 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  dif.    default:
1c600 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71   {.      r1 = sq
1c610 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1c620 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  p(pParse, pExpr,
1c630 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1c640 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c650 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp3(v, OP_IfNot
1c660 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
1c670 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
1c680 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1c690 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1c6a0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1c6b0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1c6c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1c6d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
1c6e0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1c6f0 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
1c700 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1c710 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1c720 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  gFree2);.}../*.*
1c730 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70  * Do a deep comp
1c740 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78  arison of two ex
1c750 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20  pression trees. 
1c760 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   Return 0 if the
1c770 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69   two.** expressi
1c780 6f 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65 74 65  ons are complete
1c790 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 52  ly identical.  R
1c7a0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 79 20  eturn 1 if they 
1c7b0 64 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62  differ only.** b
1c7c0 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  y a COLLATE oper
1c7d0 61 74 6f 72 20 61 74 20 74 68 65 20 74 6f 70 20  ator at the top 
1c7e0 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 32  level.  Return 2
1c7f0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 64 69   if there are di
1c800 66 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74 68  fferences.** oth
1c810 65 72 20 74 68 61 6e 20 74 68 65 20 74 6f 70 2d  er than the top-
1c820 6c 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f 70  level COLLATE op
1c830 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 53 6f  erator..**.** So
1c840 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75  metimes this rou
1c850 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
1c860 20 32 20 65 76 65 6e 20 69 66 20 74 68 65 20 74   2 even if the t
1c870 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  wo expressions.*
1c880 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75  * really are equ
1c890 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20  ivalent.  If we 
1c8a0 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61  cannot prove tha
1c8b0 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
1c8c0 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63  s are.** identic
1c8d0 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20  al, we return 2 
1c8e0 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
1c8f0 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75    So if this rou
1c900 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
1c910 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e  2, then you do n
1c920 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66  ot really know f
1c930 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68  or certain if th
1c940 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
1c950 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
1c960 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67  e.  But if you g
1c970 65 74 20 61 20 30 20 6f 72 20 31 20 72 65 74 75  et a 0 or 1 retu
1c980 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20  rn, then you.** 
1c990 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20  can be sure the 
1c9a0 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
1c9b0 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68  the same.  In th
1c9c0 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a  e places where.*
1c9d0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
1c9e0 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20  s used, it does 
1c9f0 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20  not hurt to get 
1ca00 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68 61  an extra 2 - tha
1ca10 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20  t.** just might 
1ca20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73  result in some s
1ca30 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63  lightly slower c
1ca40 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e  ode.  But return
1ca50 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72  ing.** an incorr
1ca60 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64  ect 0 or 1 could
1ca70 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75   lead to a malfu
1ca80 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
1ca90 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
1caa0 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72  e(Expr *pA, Expr
1cab0 20 2a 70 42 29 7b 0a 20 20 69 66 28 20 70 41 3d   *pB){.  if( pA=
1cac0 3d 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a 20 20 20  =0||pB==0 ){.   
1cad0 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 20 3f   return pB==pA ?
1cae0 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 61 73   0 : 2;.  }.  as
1caf0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e  sert( !ExprHasAn
1cb00 79 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45 50  yProperty(pA, EP
1cb10 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
1cb20 64 75 63 65 64 29 20 29 3b 0a 20 20 61 73 73 65  duced) );.  asse
1cb30 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79 50  rt( !ExprHasAnyP
1cb40 72 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f 54  roperty(pB, EP_T
1cb50 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
1cb60 63 65 64 29 20 29 3b 0a 20 20 69 66 28 20 45 78  ced) );.  if( Ex
1cb70 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 41  prHasProperty(pA
1cb80 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1cb90 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  || ExprHasProper
1cba0 74 79 28 70 42 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pB, EP_xIsSel
1cbb0 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ect) ){.    retu
1cbc0 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 2;.  }.  if( 
1cbd0 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pA->flags & EP_
1cbe0 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e  Distinct)!=(pB->
1cbf0 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
1cc00 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b  nct) ) return 2;
1cc10 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70  .  if( pA->op!=p
1cc20 42 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e 20 32  B->op ) return 2
1cc30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
1cc40 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
1cc50 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29  Left, pB->pLeft)
1cc60 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69   ) return 2;.  i
1cc70 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
1cc80 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74  mpare(pA->pRight
1cc90 2c 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29 20  , pB->pRight) ) 
1cca0 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20  return 2;.  if( 
1ccb0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
1ccc0 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69  ompare(pA->x.pLi
1ccd0 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74 29  st, pB->x.pList)
1cce0 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69   ) return 2;.  i
1ccf0 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70  f( pA->iTable!=p
1cd00 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d  B->iTable || pA-
1cd10 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43  >iColumn!=pB->iC
1cd20 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32  olumn ) return 2
1cd30 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
1cd40 72 6f 70 65 72 74 79 28 70 41 2c 20 45 50 5f 49  roperty(pA, EP_I
1cd50 6e 74 56 61 6c 75 65 29 20 29 7b 0a 20 20 20 20  ntValue) ){.    
1cd60 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
1cd70 65 72 74 79 28 70 42 2c 20 45 50 5f 49 6e 74 56  erty(pB, EP_IntV
1cd80 61 6c 75 65 29 20 7c 7c 20 70 41 2d 3e 75 2e 69  alue) || pA->u.i
1cd90 56 61 6c 75 65 21 3d 70 42 2d 3e 75 2e 69 56 61  Value!=pB->u.iVa
1cda0 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  lue ){.      ret
1cdb0 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 2;.    }.  }
1cdc0 65 6c 73 65 20 69 66 28 20 70 41 2d 3e 6f 70 21  else if( pA->op!
1cdd0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41  =TK_COLUMN && pA
1cde0 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20  ->u.zToken ){.  
1cdf0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1ce00 70 65 72 74 79 28 70 42 2c 20 45 50 5f 49 6e 74  perty(pB, EP_Int
1ce10 56 61 6c 75 65 29 20 7c 7c 20 4e 45 56 45 52 28  Value) || NEVER(
1ce20 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d 3d 30 29  pB->u.zToken==0)
1ce30 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
1ce40 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1ce50 43 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e  Cmp(pA->u.zToken
1ce60 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d  ,pB->u.zToken)!=
1ce70 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
1ce80 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 2;.    }.  }. 
1ce90 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20   if( (pA->flags 
1cea0 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29  & EP_ExpCollate)
1ceb0 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45  !=(pB->flags & E
1cec0 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20 29 20  P_ExpCollate) ) 
1ced0 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
1cee0 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pA->flags & EP_
1cef0 45 78 70 43 6f 6c 6c 61 74 65 29 21 3d 30 20 26  ExpCollate)!=0 &
1cf00 26 20 70 41 2d 3e 70 43 6f 6c 6c 21 3d 70 42 2d  & pA->pColl!=pB-
1cf10 3e 70 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 20  >pColl ) return 
1cf20 32 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  2;.  return 0;.}
1cf30 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
1cf40 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a  two ExprList obj
1cf50 65 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20  ects.  Return 0 
1cf60 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e  if they are iden
1cf70 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f  tical and .** no
1cf80 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64  n-zero if they d
1cf90 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79  iffer in any way
1cfa0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1cfb0 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72  tine might retur
1cfc0 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65  n non-zero for e
1cfd0 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69  quivalent ExprLi
1cfe0 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c  sts.  The.** onl
1cff0 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69  y consequence wi
1d000 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f  ll be disabled o
1d010 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42  ptimizations.  B
1d020 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ut this routine.
1d030 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65  ** must never re
1d040 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77  turn 0 if the tw
1d050 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63  o ExprList objec
1d060 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  ts are different
1d070 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e  , or.** a malfun
1d080 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ction will resul
1d090 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c  t..**.** Two NUL
1d0a0 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63  L pointers are c
1d0b0 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
1d0c0 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61  the same.  But a
1d0d0 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a   NULL pointer.**
1d0e0 20 61 6c 77 61 79 73 20 64 69 66 66 65 72 73 20   always differs 
1d0f0 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  from a non-NULL 
1d100 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
1d110 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
1d120 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74 20  ompare(ExprList 
1d130 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *pA, ExprList *p
1d140 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  B){.  int i;.  i
1d150 66 28 20 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d  f( pA==0 && pB==
1d160 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1d170 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d  if( pA==0 || pB=
1d180 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
1d190 20 69 66 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d   if( pA->nExpr!=
1d1a0 70 42 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75  pB->nExpr ) retu
1d1b0 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  rn 1;.  for(i=0;
1d1c0 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b   i<pA->nExpr; i+
1d1d0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
1d1e0 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e  xprA = pA->a[i].
1d1f0 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  pExpr;.    Expr 
1d200 2a 70 45 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b  *pExprB = pB->a[
1d210 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
1d220 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  ( pA->a[i].sortO
1d230 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73  rder!=pB->a[i].s
1d240 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74 75 72  ortOrder ) retur
1d250 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 1;.    if( sql
1d260 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
1d270 70 45 78 70 72 41 2c 20 70 45 78 70 72 42 29 20  pExprA, pExprB) 
1d280 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
1d290 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1d2a0 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
1d2b0 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41  lement to the pA
1d2c0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61  ggInfo->aCol[] a
1d2d0 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68  rray.  Return th
1d2e0 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68  e index of.** th
1d2f0 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20  e new element.  
1d300 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  Return a negativ
1d310 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c  e number if mall
1d320 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  oc fails..*/.sta
1d330 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e  tic int addAggIn
1d340 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33  foColumn(sqlite3
1d350 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70   *db, AggInfo *p
1d360 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Info){.  int i;.
1d370 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20    pInfo->aCol = 
1d380 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
1d390 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c  cate(.       db,
1d3a0 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  .       pInfo->a
1d3b0 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65  Col,.       size
1d3c0 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30  of(pInfo->aCol[0
1d3d0 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20 20  ]),.       3,.  
1d3e0 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f       &pInfo->nCo
1d3f0 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 70 49  lumn,.       &pI
1d400 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 41 6c 6c 6f  nfo->nColumnAllo
1d410 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29  c,.       &i.  )
1d420 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20  ;.  return i;.} 
1d430 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61     ../*.** Add a
1d440 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
1d450 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  the pAggInfo->aF
1d460 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65  unc[] array.  Re
1d470 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
1d480 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65  f.** the new ele
1d490 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ment.  Return a 
1d4a0 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
1d4b0 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e  if malloc fails.
1d4c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1d4d0 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71  ddAggInfoFunc(sq
1d4e0 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e  lite3 *db, AggIn
1d4f0 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e  fo *pInfo){.  in
1d500 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46  t i;.  pInfo->aF
1d510 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72  unc = sqlite3Arr
1d520 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
1d530 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70     db, .       p
1d540 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20  Info->aFunc,.   
1d550 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f      sizeof(pInfo
1d560 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20  ->aFunc[0]),.   
1d570 20 20 20 20 33 2c 0a 20 20 20 20 20 20 20 26 70      3,.       &p
1d580 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20  Info->nFunc,.   
1d590 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e      &pInfo->nFun
1d5a0 63 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26  cAlloc,.       &
1d5b0 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  i.  );.  return 
1d5c0 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  i;.}    ../*.** 
1d5d0 54 68 69 73 20 69 73 20 74 68 65 20 78 45 78 70  This is the xExp
1d5e0 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20  rCallback for a 
1d5f0 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74  tree walker.  It
1d600 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69   is used to.** i
1d610 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33  mplement sqlite3
1d620 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
1d630 67 61 74 65 73 28 29 2e 20 20 53 65 65 20 73 71  gates().  See sq
1d640 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
1d650 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f  Aggregates.** fo
1d660 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
1d670 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
1d680 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41  tic int analyzeA
1d690 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20  ggregate(Walker 
1d6a0 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
1d6b0 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pExpr){.  int i;
1d6c0 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
1d6d0 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75  pNC = pWalker->u
1d6e0 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70  .pNC;.  Parse *p
1d6f0 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
1d700 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  rse;.  SrcList *
1d710 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pSrcList = pNC->
1d720 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49  pSrcList;.  AggI
1d730 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20  nfo *pAggInfo = 
1d740 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a  pNC->pAggInfo;..
1d750 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
1d760 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
1d770 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
1d780 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
1d790 4e 3a 20 7b 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 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
1d7c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d7d0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
1d7e0 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f  OLUMN );.      /
1d7f0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1d800 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  f the column is 
1d810 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61  in one of the ta
1d820 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
1d830 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65  .      ** clause
1d840 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74   of the aggregat
1d850 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20  e query */.     
1d860 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 72 63   if( ALWAYS(pSrc
1d870 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  List!=0) ){.    
1d880 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
1d890 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
1d8a0 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20   pSrcList->a;.  
1d8b0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1d8c0 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pSrcList->nSrc;
1d8d0 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
1d8e0 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
1d8f0 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
1d900 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ol;.          as
1d910 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e  sert( !ExprHasAn
1d920 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  yProperty(pExpr,
1d930 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
1d940 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
1d950 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
1d960 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d  ->iTable==pItem-
1d970 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >iCursor ){.    
1d980 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
1d990 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
1d9a0 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
1d9b0 20 70 45 78 70 72 20 72 65 66 65 72 73 20 74 6f   pExpr refers to
1d9c0 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20   a table.       
1d9d0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20       ** that is 
1d9e0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1d9f0 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67  se of the aggreg
1da00 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20 20  ate query.  .   
1da10 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
1da20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20          ** Make 
1da30 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  an entry for the
1da40 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49   column in pAggI
1da50 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74  nfo->aCol[] if t
1da60 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20  here.           
1da70 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e   ** is not an en
1da80 74 72 79 20 74 68 65 72 65 20 61 6c 72 65 61 64  try there alread
1da90 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  y..            *
1daa0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  /.            in
1dab0 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t k;.           
1dac0 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f   pCol = pAggInfo
1dad0 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->aCol;.        
1dae0 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
1daf0 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
1db00 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; k++, pCol++){.
1db10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1db20 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d  ( pCol->iTable==
1db30 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26  pExpr->iTable &&
1db40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1db50 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e     pCol->iColumn
1db60 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ==pExpr->iColumn
1db70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1db80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1db90 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1dba0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1dbb0 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41 67       if( (k>=pAg
1dbc0 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a  gInfo->nColumn).
1dbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
1dbe0 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 43  (k = addAggInfoC
1dbf0 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62  olumn(pParse->db
1dc00 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20  , pAggInfo))>=0 
1dc10 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
1dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
1dc30 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  ol = &pAggInfo->
1dc40 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20  aCol[k];.       
1dc50 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
1dc60 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b  b = pExpr->pTab;
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 54 61 62 6c 65 20 3d 20 70 45  Col->iTable = pE
1dc90 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
1dca0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
1dcb0 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72  >iColumn = pExpr
1dcc0 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
1dcd0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
1dce0 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
1dcf0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
1dd00 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
1dd10 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  rColumn = -1;.  
1dd20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
1dd30 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
1dd40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1dd50 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72  f( pAggInfo->pGr
1dd60 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20  oupBy ){.       
1dd70 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20           int j, 
1dd80 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
1dd90 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42     ExprList *pGB
1dda0 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72   = pAggInfo->pGr
1ddb0 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20  oupBy;.         
1ddc0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
1ddd0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65  prList_item *pTe
1dde0 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20  rm = pGB->a;.   
1ddf0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d               n =
1de00 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20   pGB->nExpr;.   
1de10 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
1de20 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20  (j=0; j<n; j++, 
1de30 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
1de40 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
1de50 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pE = pTerm->pE
1de60 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
1de70 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
1de80 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
1de90 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70  pE->iTable==pExp
1dea0 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20  r->iTable &&.   
1deb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dec0 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d     pE->iColumn==
1ded0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29  pExpr->iColumn )
1dee0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1def0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
1df00 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20  terColumn = j;. 
1df10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1df30 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1df40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1df50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1df60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1df70 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43  ( pCol->iSorterC
1df80 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
1df90 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
1dfa0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
1dfb0 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74   pAggInfo->nSort
1dfc0 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20  ingColumn++;.   
1dfd0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1dfe0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1dff0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20         /* There 
1e000 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20  is now an entry 
1e010 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41 67  for pExpr in pAg
1e020 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65  gInfo->aCol[] (e
1e030 69 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20  ither.          
1e040 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20    ** because it 
1e050 77 61 73 20 74 68 65 72 65 20 62 65 66 6f 72 65  was there before
1e060 20 6f 72 20 62 65 63 61 75 73 65 20 77 65 20 6a   or because we j
1e070 75 73 74 20 63 72 65 61 74 65 64 20 69 74 29 2e  ust created it).
1e080 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1e090 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78 70  Convert the pExp
1e0a0 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47  r to be a TK_AGG
1e0b0 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e  _COLUMN referrin
1e0c0 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20  g to that.      
1e0d0 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66        ** pAggInf
1e0e0 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e  o->aCol[] entry.
1e0f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
1e100 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
1e110 53 65 74 49 72 72 65 64 75 63 69 62 6c 65 28 70  SetIrreducible(p
1e120 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
1e130 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e     pExpr->pAggIn
1e140 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20  fo = pAggInfo;. 
1e150 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1e160 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f  ->op = TK_AGG_CO
1e170 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  LUMN;.          
1e180 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
1e190 28 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20  (i16)k;.        
1e1a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1e1b0 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20       } /* endif 
1e1c0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
1e1d0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f  Item->iCursor */
1e1e0 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e  .        } /* en
1e1f0 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63  d loop over pSrc
1e200 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  List */.      }.
1e210 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
1e220 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  _Prune;.    }.  
1e230 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
1e240 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
1e250 2f 2a 20 54 68 65 20 70 4e 43 2d 3e 6e 44 65 70  /* The pNC->nDep
1e260 74 68 3d 3d 30 20 74 65 73 74 20 63 61 75 73 65  th==0 test cause
1e270 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
1e280 74 69 6f 6e 73 20 69 6e 20 73 75 62 71 75 65 72  tions in subquer
1e290 69 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ies.      ** to 
1e2a0 62 65 20 69 67 6e 6f 72 65 64 20 2a 2f 0a 20 20  be ignored */.  
1e2b0 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 6e 44 65      if( pNC->nDe
1e2c0 70 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pth==0 ){.      
1e2d0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
1e2e0 65 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20  e if pExpr is a 
1e2f0 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f  duplicate of ano
1e300 74 68 65 72 20 61 67 67 72 65 67 61 74 65 20 0a  ther aggregate .
1e310 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
1e320 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65  ion that is alre
1e330 61 64 79 20 69 6e 20 74 68 65 20 70 41 67 67 49  ady in the pAggI
1e340 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20  nfo structure.  
1e350 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1e360 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
1e370 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41  func *pItem = pA
1e380 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20  ggInfo->aFunc;. 
1e390 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
1e3a0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
1e3b0 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
1e3c0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1e3d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
1e3e0 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c  re(pItem->pExpr,
1e3f0 20 70 45 78 70 72 29 3d 3d 30 20 29 7b 0a 20 20   pExpr)==0 ){.  
1e400 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1e410 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1e420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1e430 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  f( i>=pAggInfo->
1e440 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  nFunc ){.       
1e450 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f     /* pExpr is o
1e460 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61  riginal.  Make a
1e470 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41   new entry in pA
1e480 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a  ggInfo->aFunc[].
1e490 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1e4a0 20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20         u8 enc = 
1e4b0 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ENC(pParse->db);
1e4c0 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 61  .          i = a
1e4d0 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50  ddAggInfoFunc(pP
1e4e0 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e  arse->db, pAggIn
1e4f0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  fo);.          i
1e500 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( i>=0 ){.     
1e510 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
1e520 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1e530 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
1e540 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ect) );.        
1e550 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67      pItem = &pAg
1e560 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b  gInfo->aFunc[i];
1e570 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
1e580 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
1e590 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r;.            p
1e5a0 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70  Item->iMem = ++p
1e5b0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1e5c0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1e5d0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1e5e0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1e5f0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
1e600 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e       pItem->pFun
1e610 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  c = sqlite3FindF
1e620 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
1e630 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
1e640 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e         pExpr->u.
1e650 7a 54 6f 6b 65 6e 2c 20 73 71 6c 69 74 65 33 53  zToken, sqlite3S
1e660 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75  trlen30(pExpr->u
1e670 2e 7a 54 6f 6b 65 6e 29 2c 0a 20 20 20 20 20 20  .zToken),.      
1e680 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1e690 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45  pr->x.pList ? pE
1e6a0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
1e6b0 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29  xpr : 0, enc, 0)
1e6c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1e6d0 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
1e6e0 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a   EP_Distinct ){.
1e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
1e700 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
1e710 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
1e720 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
1e730 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1e740 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e    pItem->iDistin
1e750 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  ct = -1;.       
1e760 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e770 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1e780 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78       /* Make pEx
1e790 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  pr point to the 
1e7a0 61 70 70 72 6f 70 72 69 61 74 65 20 70 41 67 67  appropriate pAgg
1e7b0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e  Info->aFunc[] en
1e7c0 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  try.        */. 
1e7d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
1e7e0 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
1e7f0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b  ty(pExpr, EP_Tok
1e800 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
1e810 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78  d) );.        Ex
1e820 70 72 53 65 74 49 72 72 65 64 75 63 69 62 6c 65  prSetIrreducible
1e830 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  (pExpr);.       
1e840 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28   pExpr->iAgg = (
1e850 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70  i16)i;.        p
1e860 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d  Expr->pAggInfo =
1e870 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20   pAggInfo;.     
1e880 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
1e890 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  une;.      }.   
1e8a0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1e8b0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
1e8c0 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
1e8d0 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65  zeAggregatesInSe
1e8e0 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  lect(Walker *pWa
1e8f0 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53  lker, Select *pS
1e900 65 6c 65 63 74 29 7b 0a 20 20 4e 61 6d 65 43 6f  elect){.  NameCo
1e910 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61  ntext *pNC = pWa
1e920 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 69  lker->u.pNC;.  i
1e930 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d  f( pNC->nDepth==
1e940 30 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44  0 ){.    pNC->nD
1e950 65 70 74 68 2b 2b 3b 0a 20 20 20 20 73 71 6c 69  epth++;.    sqli
1e960 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
1e970 61 6c 6b 65 72 2c 20 70 53 65 6c 65 63 74 29 3b  alker, pSelect);
1e980 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68  .    pNC->nDepth
1e990 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57  --;.    return W
1e9a0 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 65 6c 73  RC_Prune;.  }els
1e9b0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  e{.    return WR
1e9c0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a  C_Continue;.  }.
1e9d0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
1e9e0 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
1e9f0 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ssion looking fo
1ea00 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  r aggregate func
1ea10 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72  tions and.** for
1ea20 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20   variables that 
1ea30 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64  need to be added
1ea40 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e   to the pParse->
1ea50 61 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a  aAgg[] array..**
1ea60 20 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c   Make additional
1ea70 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20   entries to the 
1ea80 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61  pParse->aAgg[] a
1ea90 72 72 61 79 20 61 73 20 6e 65 63 65 73 73 61 72  rray as necessar
1eaa0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
1eab0 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
1eac0 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  y be called afte
1ead0 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
1eae0 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61   has been.** ana
1eaf0 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33  lyzed by sqlite3
1eb00 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
1eb10 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
1eb20 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
1eb30 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e  gregates(NameCon
1eb40 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20  text *pNC, Expr 
1eb50 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65  *pExpr){.  Walke
1eb60 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  r w;.  w.xExprCa
1eb70 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65  llback = analyze
1eb80 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78  Aggregate;.  w.x
1eb90 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
1eba0 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
1ebb0 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e  esInSelect;.  w.
1ebc0 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61  u.pNC = pNC;.  a
1ebd0 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63  ssert( pNC->pSrc
1ebe0 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c  List!=0 );.  sql
1ebf0 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
1ec00 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pExpr);.}../*.*
1ec10 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78  * Call sqlite3Ex
1ec20 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
1ec30 74 65 73 28 29 20 66 6f 72 20 65 76 65 72 79 20  tes() for every 
1ec40 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e  expression in an
1ec50 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
1ec60 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ist.  Return the
1ec70 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
1ec80 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  s..**.** If an e
1ec90 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74  rror is found, t
1eca0 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63  he analysis is c
1ecb0 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69  ut short..*/.voi
1ecc0 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  d sqlite3ExprAna
1ecd0 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65  lyzeAggList(Name
1ece0 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78  Context *pNC, Ex
1ecf0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
1ed00 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1ed10 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1ed20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
1ed30 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70  ist ){.    for(p
1ed40 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
1ed50 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
1ed60 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
1ed70 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1ed80 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
1ed90 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d  gates(pNC, pItem
1eda0 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ->pExpr);.    }.
1edb0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
1edc0 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6e  ocate a single n
1edd0 65 77 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ew register for 
1ede0 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65  use to hold some
1edf0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
1ee00 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sult..*/.int sql
1ee10 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 50  ite3GetTempReg(P
1ee20 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
1ee30 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65   if( pParse->nTe
1ee40 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  mpReg==0 ){.    
1ee50 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d  return ++pParse-
1ee60 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74  >nMem;.  }.  ret
1ee70 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d  urn pParse->aTem
1ee80 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e  pReg[--pParse->n
1ee90 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a  TempReg];.}../*.
1eea0 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20  ** Deallocate a 
1eeb0 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67  register, making
1eec0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72   available for r
1eed0 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74  euse for some ot
1eee0 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a  her.** purpose..
1eef0 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73  **.** If a regis
1ef00 74 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ter is currently
1ef10 20 62 65 69 6e 67 20 75 73 65 64 20 62 79 20 74   being used by t
1ef20 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c  he column cache,
1ef30 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 61 6c   then.** the dal
1ef40 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64 65 66 65  location is defe
1ef50 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 63  rred until the c
1ef60 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e 65  olumn cache line
1ef70 20 74 68 61 74 20 75 73 65 73 0a 2a 2a 20 74 68   that uses.** th
1ef80 65 20 72 65 67 69 73 74 65 72 20 62 65 63 6f 6d  e register becom
1ef90 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69  es stale..*/.voi
1efa0 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  d sqlite3Release
1efb0 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70  TempReg(Parse *p
1efc0 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29  Parse, int iReg)
1efd0 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26 20  {.  if( iReg && 
1efe0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
1eff0 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73  <ArraySize(pPars
1f000 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a  e->aTempReg) ){.
1f010 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
1f020 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
1f030 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  *p;.    for(i=0,
1f040 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
1f050 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
1f060 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
1f070 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  p++){.      if( 
1f080 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b  p->iReg==iReg ){
1f090 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 65 6d 70  .        p->temp
1f0a0 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Reg = 1;.       
1f0b0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
1f0c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
1f0d0 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72  e->aTempReg[pPar
1f0e0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20  se->nTempReg++] 
1f0f0 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = iReg;.  }.}../
1f100 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72  *.** Allocate or
1f110 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c   deallocate a bl
1f120 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73  ock of nReg cons
1f130 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72  ecutive register
1f140 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  s.*/.int sqlite3
1f150 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61 72  GetTempRange(Par
1f160 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1f170 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20  nReg){.  int i, 
1f180 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d  n;.  i = pParse-
1f190 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20  >iRangeReg;.  n 
1f1a0 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  = pParse->nRange
1f1b0 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c  Reg;.  if( nReg<
1f1c0 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =n ){.    assert
1f1d0 28 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43  ( !usedAsColumnC
1f1e0 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c 20  ache(pParse, i, 
1f1f0 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20 70 50  i+n-1) );.    pP
1f200 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20  arse->iRangeReg 
1f210 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61  += nReg;.    pPa
1f220 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d  rse->nRangeReg -
1f230 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b  = nReg;.  }else{
1f240 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d  .    i = pParse-
1f250 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
1f260 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
1f270 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
1f280 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  i;.}.void sqlite
1f290 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
1f2a0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1f2b0 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e   int iReg, int n
1f2c0 52 65 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 45  Reg){.  sqlite3E
1f2d0 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
1f2e0 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 52 65  Parse, iReg, nRe
1f2f0 67 29 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e 70  g);.  if( nReg>p
1f300 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
1f310 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
1f320 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67  nRangeReg = nReg
1f330 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52  ;.    pParse->iR
1f340 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a  angeReg = iReg;.
1f350 20 20 7d 0a 7d 0a                                  }.}.