/ Hex Artifact Content
Login

Artifact 57fb8e7a05d4147e40b9f4c439e37ed2abab9332:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 73   clause expresss
0370: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0380: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0390: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
03a0: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
03b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
03c0: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
03d0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
03e0: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
03f0: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0400: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
0410: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
0420: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
0430: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
0440: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
0450: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
0460: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
0470: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  .  if( op==TK_SE
0480: 4c 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65  LECT ){.    asse
0490: 72 74 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  rt( pExpr->flags
04a0: 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b  &EP_xIsSelect );
04b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
04c0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
04d0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
04e0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
04f0: 45 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  Expr);.  }.#ifnd
0500: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
0510: 41 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  AST.  if( op==TK
0520: 5f 43 41 53 54 20 29 7b 0a 20 20 20 20 61 73 73  _CAST ){.    ass
0530: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
0540: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
0550: 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
0560: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41   return sqlite3A
0570: 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70  ffinityType(pExp
0580: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
0590: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 28  }.#endif.  if( (
05a0: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
05b0: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  N || op==TK_COLU
05c0: 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47  MN || op==TK_REG
05d0: 49 53 54 45 52 29 20 0a 20 20 20 26 26 20 70 45  ISTER) .   && pE
05e0: 78 70 72 2d 3e 70 54 61 62 21 3d 30 0a 20 20 29  xpr->pTab!=0.  )
05f0: 7b 0a 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f  {.    /* op==TK_
0600: 52 45 47 49 53 54 45 52 20 26 26 20 70 45 78 70  REGISTER && pExp
0610: 72 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65  r->pTab!=0 happe
0620: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
0630: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
0640: 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20   ** a TK_COLUMN 
0650: 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  but was previous
0660: 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  ly evaluated and
0670: 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67   cached in a reg
0680: 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  ister */.    int
0690: 20 6a 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c   j = pExpr->iCol
06a0: 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30  umn;.    if( j<0
06b0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
06c0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
06d0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
06e0: 3e 70 54 61 62 20 26 26 20 6a 3c 70 45 78 70 72  >pTab && j<pExpr
06f0: 2d 3e 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  ->pTab->nCol );.
0700: 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
0710: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
0720: 61 66 66 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20  affinity;.  }.  
0730: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66  return pExpr->af
0740: 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  finity;.}../*.**
0750: 20 53 65 74 20 74 68 65 20 65 78 70 6c 69 63 69   Set the explici
0760: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
0770: 65 6e 63 65 20 66 6f 72 20 61 6e 20 65 78 70 72  ence for an expr
0780: 65 73 73 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a  ession to the.**
0790: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
07a0: 6e 63 65 20 73 75 70 70 6c 69 65 64 20 69 6e 20  nce supplied in 
07b0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
07c0: 65 6e 74 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ent..*/.Expr *sq
07d0: 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f 6c 6c  lite3ExprSetColl
07e0: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 43 6f  (Expr *pExpr, Co
07f0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
0800: 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70 43   if( pExpr && pC
0810: 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 45 78 70 72  oll ){.    pExpr
0820: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b  ->pColl = pColl;
0830: 0a 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67  .    pExpr->flag
0840: 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61  s |= EP_ExpColla
0850: 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  te;.  }.  return
0860: 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pExpr;.}../*.**
0870: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
0880: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
0890: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
08a0: 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61   to be the colla
08b0: 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
08c0: 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e   named by pToken
08d0: 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .   Return a poi
08e0: 6e 74 65 72 20 74 6f 20 74 68 65 20 72 65 76 69  nter to the revi
08f0: 73 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  sed expression..
0900: 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** The collating
0910: 20 73 65 71 75 65 6e 63 65 20 69 73 20 6d 61 72   sequence is mar
0920: 6b 65 64 20 61 73 20 22 65 78 70 6c 69 63 69 74  ked as "explicit
0930: 22 20 75 73 69 6e 67 20 74 68 65 20 45 50 5f 45  " using the EP_E
0940: 78 70 43 6f 6c 6c 61 74 65 0a 2a 2a 20 66 6c 61  xpCollate.** fla
0950: 67 2e 20 20 41 6e 20 65 78 70 6c 69 63 69 74 20  g.  An explicit 
0960: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0970: 63 65 20 77 69 6c 6c 20 6f 76 65 72 72 69 64 65  ce will override
0980: 20 69 6d 70 6c 69 63 69 74 0a 2a 2a 20 63 6f 6c   implicit.** col
0990: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
09a0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
09b0: 65 33 45 78 70 72 53 65 74 43 6f 6c 6c 42 79 54  e3ExprSetCollByT
09c0: 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72  oken(Parse *pPar
09d0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
09e0: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d   Token *pCollNam
09f0: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c  e){.  char *zCol
0a00: 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
0a10: 20 20 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61    /* Dequoted na
0a20: 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20  me of collation 
0a30: 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 43 6f  sequence */.  Co
0a40: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
0a50: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
0a60: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c  arse->db;.  zCol
0a70: 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
0a80: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 43 6f  romToken(db, pCo
0a90: 6c 6c 4e 61 6d 65 29 3b 0a 20 20 70 43 6f 6c 6c  llName);.  pColl
0aa0: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
0ab0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
0ac0: 7a 43 6f 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65  zColl);.  sqlite
0ad0: 33 45 78 70 72 53 65 74 43 6f 6c 6c 28 70 45 78  3ExprSetColl(pEx
0ae0: 70 72 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 73 71  pr, pColl);.  sq
0af0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
0b00: 7a 43 6f 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e  zColl);.  return
0b10: 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pExpr;.}../*.**
0b20: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66 61   Return the defa
0b30: 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ult collation se
0b40: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65  quence for the e
0b50: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
0b60: 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20   If.** there is 
0b70: 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  no default colla
0b80: 74 69 6f 6e 20 74 79 70 65 2c 20 72 65 74 75 72  tion type, retur
0b90: 6e 20 30 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  n 0..*/.CollSeq 
0ba0: 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c  *sqlite3ExprColl
0bb0: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
0bc0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
0bd0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
0be0: 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 70  l = 0;.  Expr *p
0bf0: 20 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69 6c   = pExpr;.  whil
0c00: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  e( p ){.    int 
0c10: 6f 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  op;.    pColl = 
0c20: 70 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 66  p->pColl;.    if
0c30: 28 20 70 43 6f 6c 6c 20 29 20 62 72 65 61 6b 3b  ( pColl ) break;
0c40: 0a 20 20 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b  .    op = p->op;
0c50: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 54 61 62  .    if( p->pTab
0c60: 21 3d 30 20 26 26 20 28 0a 20 20 20 20 20 20 20  !=0 && (.       
0c70: 20 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55   op==TK_AGG_COLU
0c80: 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c  MN || op==TK_COL
0c90: 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45  UMN || op==TK_RE
0ca0: 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b  GISTER || op==TK
0cb0: 5f 54 52 49 47 47 45 52 0a 20 20 20 20 29 29 7b  _TRIGGER.    )){
0cc0: 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b  .      /* op==TK
0cd0: 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e  _REGISTER && p->
0ce0: 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20  pTab!=0 happens 
0cf0: 77 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f  when pExpr was o
0d00: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20  riginally.      
0d10: 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62  ** a TK_COLUMN b
0d20: 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ut was previousl
0d30: 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  y evaluated and 
0d40: 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69  cached in a regi
0d50: 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f  ster */.      co
0d60: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b  nst char *zColl;
0d70: 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70  .      int j = p
0d80: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
0d90: 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20   if( j>=0 ){.   
0da0: 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
0db0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
0dc0: 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70         zColl = p
0dd0: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
0de0: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  zColl;.        p
0df0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
0e00: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
0e10: 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29  C(db), zColl, 0)
0e20: 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
0e30: 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a  >pColl = pColl;.
0e40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
0e50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
0e60: 66 28 20 6f 70 21 3d 54 4b 5f 43 41 53 54 20 26  f( op!=TK_CAST &
0e70: 26 20 6f 70 21 3d 54 4b 5f 55 50 4c 55 53 20 29  & op!=TK_UPLUS )
0e80: 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
0e90: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
0ea0: 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pLeft;.  }.  if(
0eb0: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c   sqlite3CheckCol
0ec0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f  lSeq(pParse, pCo
0ed0: 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c  ll) ){ .    pCol
0ee0: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  l = 0;.  }.  ret
0ef0: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a  urn pColl;.}../*
0f00: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20  .** pExpr is an 
0f10: 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d  operand of a com
0f20: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
0f30: 2e 20 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a  .  aff2 is the.*
0f40: 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20  * type affinity 
0f50: 6f 66 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65  of the other ope
0f60: 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74  rand.  This rout
0f70: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a  ine returns the.
0f80: 2a 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74 79  ** type affinity
0f90: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
0fa0: 75 73 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d  used for the com
0fb0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
0fc0: 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65  ..*/.char sqlite
0fd0: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
0fe0: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68  (Expr *pExpr, ch
0ff0: 61 72 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72  ar aff2){.  char
1000: 20 61 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45   aff1 = sqlite3E
1010: 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70  xprAffinity(pExp
1020: 72 29 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26  r);.  if( aff1 &
1030: 26 20 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a  & aff2 ){.    /*
1040: 20 42 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74   Both sides of t
1050: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72  he comparison ar
1060: 65 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e  e columns. If on
1070: 65 20 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20  e has numeric.  
1080: 20 20 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75    ** affinity, u
1090: 73 65 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69  se that. Otherwi
10a0: 73 65 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69  se use no affini
10b0: 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ty..    */.    i
10c0: 66 28 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  f( sqlite3IsNume
10d0: 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 31  ricAffinity(aff1
10e0: 29 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75  ) || sqlite3IsNu
10f0: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 61 66  mericAffinity(af
1100: 66 32 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  f2) ){.      ret
1110: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  urn SQLITE_AFF_N
1120: 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73  UMERIC;.    }els
1130: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
1140: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1150: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
1160: 66 28 20 21 61 66 66 31 20 26 26 20 21 61 66 66  f( !aff1 && !aff
1170: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74  2 ){.    /* Neit
1180: 68 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 20  her side of the 
1190: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20  comparison is a 
11a0: 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65  column.  Compare
11b0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75   the.    ** resu
11c0: 6c 74 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20  lts directly..  
11d0: 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20    */.    return 
11e0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
11f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1200: 20 4f 6e 65 20 73 69 64 65 20 69 73 20 61 20 63   One side is a c
1210: 6f 6c 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72  olumn, the other
1220: 20 69 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65   is not. Use the
1230: 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74   columns affinit
1240: 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  y. */.    assert
1250: 28 20 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66  ( aff1==0 || aff
1260: 32 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  2==0 );.    retu
1270: 72 6e 20 28 61 66 66 31 20 2b 20 61 66 66 32 29  rn (aff1 + aff2)
1280: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  ;.  }.}../*.** p
1290: 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72  Expr is a compar
12a0: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20  ison operator.  
12b0: 52 65 74 75 72 6e 20 74 68 65 20 74 79 70 65 20  Return the type 
12c0: 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68  affinity that sh
12d0: 6f 75 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69  ould.** be appli
12e0: 65 64 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61  ed to both opera
12f0: 6e 64 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69  nds prior to doi
1300: 6e 67 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  ng the compariso
1310: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  n..*/.static cha
1320: 72 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69  r comparisonAffi
1330: 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72  nity(Expr *pExpr
1340: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20  ){.  char aff;. 
1350: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1360: 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78  op==TK_EQ || pEx
1370: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c  pr->op==TK_IN ||
1380: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
1390: 54 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70  T ||.          p
13a0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20  Expr->op==TK_GT 
13b0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
13c0: 5f 47 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _GE || pExpr->op
13d0: 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20  ==TK_LE ||.     
13e0: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d       pExpr->op==
13f0: 54 4b 5f 4e 45 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_NE || pExpr->
1400: 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78  op==TK_IS || pEx
1410: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
1420: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1430: 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20  xpr->pLeft );.  
1440: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70  aff = sqlite3Exp
1450: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  rAffinity(pExpr-
1460: 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70  >pLeft);.  if( p
1470: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a  Expr->pRight ){.
1480: 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
1490: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
14a0: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  (pExpr->pRight, 
14b0: 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  aff);.  }else if
14c0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
14d0: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
14e0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 61 66  elect) ){.    af
14f0: 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
1500: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
1510: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
1520: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
1530: 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69   aff);.  }else i
1540: 66 28 20 21 61 66 66 20 29 7b 0a 20 20 20 20 61  f( !aff ){.    a
1550: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
1560: 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75  NONE;.  }.  retu
1570: 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aff;.}../*.**
1580: 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70   pExpr is a comp
1590: 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f  arison expressio
15a0: 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c  n, eg. '=', '<',
15b0: 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a   IN(...) etc..**
15c0: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73   idx_affinity is
15d0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
15e0: 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   an indexed colu
15f0: 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a  mn. Return true.
1600: 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ** if the index 
1610: 77 69 74 68 20 61 66 66 69 6e 69 74 79 20 69 64  with affinity id
1620: 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62  x_affinity may b
1630: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
1640: 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61  ent.** the compa
1650: 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a  rison in pExpr..
1660: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
1670: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78  dexAffinityOk(Ex
1680: 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20  pr *pExpr, char 
1690: 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20  idx_affinity){. 
16a0: 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70   char aff = comp
16b0: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70  arisonAffinity(p
16c0: 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28  Expr);.  switch(
16d0: 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65   aff ){.    case
16e0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
16f0: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  :.      return 1
1700: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1710: 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20  E_AFF_TEXT:.    
1720: 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66    return idx_aff
1730: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
1740: 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61  F_TEXT;.    defa
1750: 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
1760: 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  n sqlite3IsNumer
1770: 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61  icAffinity(idx_a
1780: 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a  ffinity);.  }.}.
1790: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
17a0: 65 20 50 35 20 76 61 6c 75 65 20 74 68 61 74 20  e P5 value that 
17b0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
17c0: 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70  or a binary comp
17d0: 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65  arison.** opcode
17e0: 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65   (OP_Eq, OP_Ge e
17f0: 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d  tc.) used to com
1800: 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64 20  pare pExpr1 and 
1810: 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74 69  pExpr2..*/.stati
1820: 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61  c u8 binaryCompa
1830: 72 65 50 35 28 45 78 70 72 20 2a 70 45 78 70 72  reP5(Expr *pExpr
1840: 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c  1, Expr *pExpr2,
1850: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
1860: 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28 63 68  {.  u8 aff = (ch
1870: 61 72 29 73 71 6c 69 74 65 33 45 78 70 72 41 66  ar)sqlite3ExprAf
1880: 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a  finity(pExpr2);.
1890: 20 20 61 66 66 20 3d 20 28 75 38 29 73 71 6c 69    aff = (u8)sqli
18a0: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
18b0: 74 79 28 70 45 78 70 72 31 2c 20 61 66 66 29 20  ty(pExpr1, aff) 
18c0: 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c 6c  | (u8)jumpIfNull
18d0: 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  ;.  return aff;.
18e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
18f0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1900: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1910: 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  nce that should 
1920: 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20  be used by.** a 
1930: 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f  binary compariso
1940: 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61  n operator compa
1950: 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70  ring pLeft and p
1960: 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Right..**.** If 
1970: 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78  the left hand ex
1980: 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63  pression has a c
1990: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
19a0: 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20  e type, then it 
19b0: 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65  is.** used. Othe
19c0: 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  rwise the collat
19d0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
19e0: 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20   the right hand 
19f0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
1a00: 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65   used, or the de
1a10: 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69  fault (BINARY) i
1a20: 66 20 6e 65 69 74 68 65 72 20 65 78 70 72 65 73  f neither expres
1a30: 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61  sion has a colla
1a40: 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a  ting.** type..**
1a50: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69  .** Argument pRi
1a60: 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65  ght (but not pLe
1a70: 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c  ft) may be a nul
1a80: 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68  l pointer. In th
1a90: 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69  is case,.** it i
1aa0: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
1ab0: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
1ac0: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
1ad0: 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72  reCollSeq(.  Par
1ae0: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45  se *pParse, .  E
1af0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45  xpr *pLeft, .  E
1b00: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
1b10: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
1b20: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74  .  assert( pLeft
1b30: 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d   );.  if( pLeft-
1b40: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
1b50: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 61 73  ollate ){.    as
1b60: 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 70 43 6f  sert( pLeft->pCo
1b70: 6c 6c 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  ll );.    pColl 
1b80: 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a  = pLeft->pColl;.
1b90: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
1ba0: 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 66 6c  ht && pRight->fl
1bb0: 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
1bc0: 61 74 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ate ){.    asser
1bd0: 74 28 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c  t( pRight->pColl
1be0: 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20   );.    pColl = 
1bf0: 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20  pRight->pColl;. 
1c00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c   }else{.    pCol
1c10: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
1c20: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1c30: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21  Left);.    if( !
1c40: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
1c50: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1c60: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
1c70: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  , pRight);.    }
1c80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
1c90: 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  oll;.}../*.** Ge
1ca0: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1cb0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1cc0: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
1cd0: 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65   int codeCompare
1ce0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1cf0: 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  e,    /* The par
1d00: 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67  sing (and code g
1d10: 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65  enerating) conte
1d20: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  xt */.  Expr *pL
1d30: 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  eft,      /* The
1d40: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
1d50: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
1d60: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
1d70: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  t operand */.  i
1d80: 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20  nt opcode,      
1d90: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73   /* The comparis
1da0: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  on opcode */.  i
1db0: 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c  nt in1, int in2,
1dc0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
1dd0: 64 69 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f  ding operands */
1de0: 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
1df0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
1e00: 65 20 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20  e if true.  */. 
1e10: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   int jumpIfNull 
1e20: 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a     /* If true, j
1e30: 75 6d 70 20 69 66 20 65 69 74 68 65 72 20 6f 70  ump if either op
1e40: 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f  erand is NULL */
1e50: 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20  .){.  int p5;.  
1e60: 69 6e 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c  int addr;.  Coll
1e70: 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d  Seq *p4;..  p4 =
1e80: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
1e90: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
1ea0: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
1eb0: 68 74 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61  ht);.  p5 = bina
1ec0: 72 79 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66  ryCompareP5(pLef
1ed0: 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49  t, pRight, jumpI
1ee0: 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d  fNull);.  addr =
1ef0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f00: 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p4(pParse->pVdbe
1f10: 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64  , opcode, in2, d
1f20: 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20  est, in1,.      
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f40: 20 20 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20       (void*)p4, 
1f50: 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73  P4_COLLSEQ);.  s
1f60: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1f70: 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  P5(pParse->pVdbe
1f80: 2c 20 28 75 38 29 70 35 29 3b 0a 20 20 72 65 74  , (u8)p5);.  ret
1f90: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23 69 66  urn addr;.}..#if
1fa0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
1fb0: 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43  _DEPTH>0./*.** C
1fc0: 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65  heck that argume
1fd0: 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65  nt nHeight is le
1fe0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
1ff0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a   to the maximum.
2000: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65  ** expression de
2010: 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20  pth allowed. If 
2020: 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65  it is not, leave
2030: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2040: 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a  e in.** pParse..
2050: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2060: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50 61  prCheckHeight(Pa
2070: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2080: 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74   nHeight){.  int
2090: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20a0: 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20  .  int mxHeight 
20b0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c  = pParse->db->aL
20c0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
20d0: 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20  T_EXPR_DEPTH];. 
20e0: 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48   if( nHeight>mxH
20f0: 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c  eight ){.    sql
2100: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2110: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78  rse, .       "Ex
2120: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73  pression tree is
2130: 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69   too large (maxi
2140: 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20  mum depth %d)", 
2150: 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a  mxHeight.    );.
2160: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2170: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
2180: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68  urn rc;.}../* Th
2190: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  e following thre
21a0: 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69  e functions, hei
21b0: 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69  ghtOfExpr(), hei
21c0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a  ghtOfExprList().
21d0: 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53  ** and heightOfS
21e0: 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73 65  elect(), are use
21f0: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
2200: 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68  he maximum heigh
2210: 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72  t.** of any expr
2220: 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65  ession tree refe
2230: 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 74  renced by the st
2240: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
2250: 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61  s the.** first a
2260: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
2270: 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68  f this maximum h
2280: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
2290: 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
22a0: 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a  t value pointed.
22b0: 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68  ** to by pnHeigh
22c0: 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  t, the second pa
22d0: 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65  rameter, then se
22e0: 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74  t *pnHeight to t
22f0: 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f  hat.** value..*/
2300: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
2310: 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a  ghtOfExpr(Expr *
2320: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
2330: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
2340: 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74    if( p->nHeight
2350: 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20  >*pnHeight ){.  
2360: 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20      *pnHeight = 
2370: 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20  p->nHeight;.    
2380: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
2390: 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72  oid heightOfExpr
23a0: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
23b0: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
23c0: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
23d0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
23e0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
23f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69   i++){.      hei
2400: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69  ghtOfExpr(p->a[i
2410: 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68  ].pExpr, pnHeigh
2420: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
2430: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
2440: 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63  htOfSelect(Selec
2450: 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69  t *p, int *pnHei
2460: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ght){.  if( p ){
2470: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2480: 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48  r(p->pWhere, pnH
2490: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
24a0: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76  htOfExpr(p->pHav
24b0: 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ing, pnHeight);.
24c0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
24d0: 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65  (p->pLimit, pnHe
24e0: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
24f0: 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66 66 73  tOfExpr(p->pOffs
2500: 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  et, pnHeight);. 
2510: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
2520: 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70  ist(p->pEList, p
2530: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2540: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
2550: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48 65  ->pGroupBy, pnHe
2560: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
2570: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  tOfExprList(p->p
2580: 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67 68  OrderBy, pnHeigh
2590: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
25a0: 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f 72  Select(p->pPrior
25b0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  , pnHeight);.  }
25c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
25d0: 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76  e Expr.nHeight v
25e0: 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65 20 73  ariable in the s
25f0: 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
2600: 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65  as an .** argume
2610: 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73 69 6f  nt. An expressio
2620: 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c 64 72  n with no childr
2630: 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74 20 6f  en, Expr.pList o
2640: 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65  r .** Expr.pSele
2650: 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20 61 20  ct member has a 
2660: 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41 6e 79  height of 1. Any
2670: 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
2680: 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69 67 68  n.** has a heigh
2690: 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d  t equal to the m
26a0: 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66  aximum height of
26b0: 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72   any other .** r
26c0: 65 66 65 72 65 6e 63 65 64 20 45 78 70 72 20 70  eferenced Expr p
26d0: 6c 75 73 20 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74  lus one..*/.stat
26e0: 69 63 20 76 6f 69 64 20 65 78 70 72 53 65 74 48  ic void exprSetH
26f0: 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a  eight(Expr *p){.
2700: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
2710: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70  0;.  heightOfExp
2720: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65  r(p->pLeft, &nHe
2730: 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f  ight);.  heightO
2740: 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c  fExpr(p->pRight,
2750: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 69 66   &nHeight);.  if
2760: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
2770: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
2780: 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74  t) ){.    height
2790: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53  OfSelect(p->x.pS
27a0: 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29  elect, &nHeight)
27b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68  ;.  }else{.    h
27c0: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
27d0: 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65  p->x.pList, &nHe
27e0: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ight);.  }.  p->
27f0: 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68  nHeight = nHeigh
2800: 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t + 1;.}../*.** 
2810: 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65  Set the Expr.nHe
2820: 69 67 68 74 20 76 61 72 69 61 62 6c 65 20 75 73  ight variable us
2830: 69 6e 67 20 74 68 65 20 65 78 70 72 53 65 74 48  ing the exprSetH
2840: 65 69 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e  eight() function
2850: 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67  . If.** the heig
2860: 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ht is greater th
2870: 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  an the maximum a
2880: 6c 6c 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f  llowed expressio
2890: 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76  n depth,.** leav
28a0: 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  e an error in pP
28b0: 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  arse..*/.void sq
28c0: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
28d0: 68 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ht(Parse *pParse
28e0: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 65 78  , Expr *p){.  ex
28f0: 70 72 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a  prSetHeight(p);.
2900: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65    sqlite3ExprChe
2910: 63 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c  ckHeight(pParse,
2920: 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a   p->nHeight);.}.
2930: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2940: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
2950: 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69   of any expressi
2960: 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63  on tree referenc
2970: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c  ed.** by the sel
2980: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ect statement pa
2990: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
29a0: 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
29b0: 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
29c0: 67 68 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ght(Select *p){.
29d0: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
29e0: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c  0;.  heightOfSel
29f0: 65 63 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29  ect(p, &nHeight)
2a00: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67  ;.  return nHeig
2a10: 68 74 3b 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ht;.}.#else.  #d
2a20: 65 66 69 6e 65 20 65 78 70 72 53 65 74 48 65 69  efine exprSetHei
2a30: 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a  ght(y).#endif /*
2a40: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
2a50: 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a  _DEPTH>0 */../*.
2a60: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2a70: 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c 6c 6f  is the core allo
2a80: 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72 20 6e  cator for Expr n
2a90: 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73  odes..**.** Cons
2aa0: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
2ab0: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20  ession node and 
2ac0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
2ad0: 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a   to it.  Memory.
2ae0: 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65  ** for this node
2af0: 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70 54 6f   and for the pTo
2b00: 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ken argument is 
2b10: 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74  a single allocat
2b20: 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20  ion.** obtained 
2b30: 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
2b40: 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c  lloc().  The cal
2b50: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
2b60: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
2b70: 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
2b80: 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61  the node eventua
2b90: 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a  lly gets freed..
2ba0: 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65  **.** If dequote
2bb0: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
2bc0: 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69 74 20  he token (if it 
2bd0: 65 78 69 73 74 73 29 20 69 73 20 64 65 71 75 6f  exists) is dequo
2be0: 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75 6f  ted..** If dequo
2bf0: 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f 20  te is false, no 
2c00: 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70 65 72  dequoting is per
2c10: 66 6f 72 6d 61 6e 63 65 2e 20 20 54 68 65 20 64  formance.  The d
2c20: 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65  eQuote.** parame
2c30: 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69  ter is ignored i
2c40: 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  f pToken is NULL
2c50: 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e   or if the token
2c60: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70   does not.** app
2c70: 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64  ear to be quoted
2c80: 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73  .  If the quotes
2c90: 20 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72   were of the for
2ca0: 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d  m "..." (double-
2cb0: 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20  quotes).** then 
2cc0: 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64  the EP_DblQuoted
2cd0: 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
2ce0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  the expression n
2cf0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69  ode..**.** Speci
2d00: 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d  al case:  If op=
2d10: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20  =TK_INTEGER and 
2d20: 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f  pToken points to
2d30: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a   a string that.*
2d40: 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61  * can be transla
2d50: 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69  ted into a 32-bi
2d60: 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  t integer, then 
2d70: 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74  the token is not
2d80: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e  .** stored in u.
2d90: 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64  zToken.  Instead
2da0: 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  , the integer va
2db0: 6c 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a  lues is written.
2dc0: 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65  ** into u.iValue
2dd0: 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56   and the EP_IntV
2de0: 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74  alue flag is set
2df0: 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72  .  No extra stor
2e00: 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61  age.** is alloca
2e10: 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ted to hold the 
2e20: 69 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64  integer text and
2e30: 20 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61   the dequote fla
2e40: 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f  g is ignored..*/
2e50: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
2e60: 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74  prAlloc(.  sqlit
2e70: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
2e80: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
2e90: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
2ea0: 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e  Zero() (may be n
2eb0: 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  ull) */.  int op
2ec0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ed0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
2ee0: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  opcode */.  cons
2ef0: 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c  t Token *pToken,
2f00: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67      /* Token arg
2f10: 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65  ument.  Might be
2f20: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 64   NULL */.  int d
2f30: 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20  equote          
2f40: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65     /* True to de
2f50: 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20 45 78  quote */.){.  Ex
2f60: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  pr *pNew;.  int 
2f70: 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 69 6e  nExtra = 0;.  in
2f80: 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a 0a 20  t iValue = 0;.. 
2f90: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
2fa0: 20 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e     if( op!=TK_IN
2fb0: 54 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d  TEGER || pToken-
2fc0: 3e 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  >z==0.          
2fd0: 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  || sqlite3GetInt
2fe0: 33 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69  32(pToken->z, &i
2ff0: 56 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20  Value)==0 ){.   
3000: 20 20 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b     nExtra = pTok
3010: 65 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61  en->n+1;.      a
3020: 73 73 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30  ssert( iValue>=0
3030: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
3040: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
3050: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
3060: 69 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74  izeof(Expr)+nExt
3070: 72 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  ra);.  if( pNew 
3080: 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20  ){.    pNew->op 
3090: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e  = (u8)op;.    pN
30a0: 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20  ew->iAgg = -1;. 
30b0: 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b     if( pToken ){
30c0: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72  .      if( nExtr
30d0: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  a==0 ){.        
30e0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
30f0: 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
3100: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c      pNew->u.iVal
3110: 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20  ue = iValue;.   
3120: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3130: 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20    int c;.       
3140: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   pNew->u.zToken 
3150: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
3160: 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
3170: 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20  t( pToken->z!=0 
3180: 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20  || pToken->n==0 
3190: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
31a0: 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70  Token->n ) memcp
31b0: 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  y(pNew->u.zToken
31c0: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f  , pToken->z, pTo
31d0: 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  ken->n);.       
31e0: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b   pNew->u.zToken[
31f0: 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a  pToken->n] = 0;.
3200: 20 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75          if( dequ
3210: 6f 74 65 20 26 26 20 6e 45 78 74 72 61 3e 3d 33  ote && nExtra>=3
3220: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26   .             &
3230: 26 20 28 28 63 20 3d 20 70 54 6f 6b 65 6e 2d 3e  & ((c = pToken->
3240: 7a 5b 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20 63  z[0])=='\'' || c
3250: 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5b 27 20  =='"' || c=='[' 
3260: 7c 7c 20 63 3d 3d 27 60 27 29 20 29 7b 0a 20 20  || c=='`') ){.  
3270: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
3280: 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a  equote(pNew->u.z
3290: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  Token);.        
32a0: 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 70    if( c=='"' ) p
32b0: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
32c0: 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20  _DblQuoted;.    
32d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
32e0: 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
32f0: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a  AX_EXPR_DEPTH>0.
3300: 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68      pNew->nHeigh
3310: 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a  t = 1;.#endif  .
3320: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
3330: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  w;.}../*.** Allo
3340: 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  cate a new expre
3350: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20  ssion node from 
3360: 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  a zero-terminate
3370: 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73  d token that has
3380: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
3390: 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78   dequoted..*/.Ex
33a0: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28  pr *sqlite3Expr(
33b0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
33c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
33d0: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
33e0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28  DbMallocZero() (
33f0: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
3400: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
3410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
3420: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
3430: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
3440: 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54  zToken      /* T
3450: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20  oken argument.  
3460: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
3470: 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20  .){.  Token x;. 
3480: 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20   x.z = zToken;. 
3490: 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20   x.n = zToken ? 
34a0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
34b0: 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72  zToken) : 0;.  r
34c0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
34d0: 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26  rAlloc(db, op, &
34e0: 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x, 0);.}../*.** 
34f0: 41 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20  Attach subtrees 
3500: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
3510: 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64   to the Expr nod
3520: 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  e pRoot..**.** I
3530: 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68  f pRoot==NULL th
3540: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20  at means that a 
3550: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3560: 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
3570: 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74  rred..** In that
3580: 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68   case, delete th
3590: 65 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74  e subtrees pLeft
35a0: 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a   and pRight..*/.
35b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
35c0: 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a  AttachSubtrees(.
35d0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
35e0: 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20   Expr *pRoot,.  
35f0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45  Expr *pLeft,.  E
3600: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
3610: 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b   if( pRoot==0 ){
3620: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
3630: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
3640: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
3650: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74  Delete(db, pLeft
3660: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
3670: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69  prDelete(db, pRi
3680: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
3690: 20 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b     if( pRight ){
36a0: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52  .      pRoot->pR
36b0: 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  ight = pRight;. 
36c0: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
36d0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
36e0: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
36f0: 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c    pRoot->flags |
3700: 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b  = EP_ExpCollate;
3710: 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  .        pRoot->
3720: 70 43 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e  pColl = pRight->
3730: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  pColl;.      }. 
3740: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
3750: 66 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f  ft ){.      pRoo
3760: 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74  t->pLeft = pLeft
3770: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
3780: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  t->flags & EP_Ex
3790: 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20  pCollate ){.    
37a0: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
37b0: 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74   |= EP_ExpCollat
37c0: 65 3b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74  e;.        pRoot
37d0: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d  ->pColl = pLeft-
37e0: 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  >pColl;.      }.
37f0: 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65      }.    exprSe
3800: 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a  tHeight(pRoot);.
3810: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
3820: 6f 63 61 74 65 20 61 20 45 78 70 72 20 6e 6f 64  ocate a Expr nod
3830: 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73  e which joins as
3840: 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62   many as two sub
3850: 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65  trees..**.** One
3860: 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20   or both of the 
3870: 73 75 62 74 72 65 65 73 20 63 61 6e 20 62 65 20  subtrees can be 
3880: 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20  NULL.  Return a 
3890: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
38a0: 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e  ew.** Expr node.
38b0: 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20    Or, if an OOM 
38c0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
38d0: 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  t pParse->db->ma
38e0: 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66  llocFailed,.** f
38f0: 72 65 65 20 74 68 65 20 73 75 62 74 72 65 65 73  ree the subtrees
3900: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
3910: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
3920: 65 33 50 45 78 70 72 28 0a 20 20 50 61 72 73 65  e3PExpr(.  Parse
3930: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3940: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
3950: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
3960: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
3970: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
3980: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70   opcode */.  Exp
3990: 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20  r *pLeft,       
39a0: 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65       /* Left ope
39b0: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
39c0: 70 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  pRight,         
39d0: 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61    /* Right opera
39e0: 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  nd */.  const To
39f0: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20 20  ken *pToken     
3a00: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b 65  /* Argument toke
3a10: 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  n */.){.  Expr *
3a20: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
3a30: 41 4e 44 20 26 26 20 70 4c 65 66 74 20 26 26 20  AND && pLeft && 
3a40: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 2f 2a  pRight ){.    /*
3a50: 20 54 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20   Take advantage 
3a60: 6f 66 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74  of short-circuit
3a70: 20 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74   false optimizat
3a80: 69 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20  ion for AND */. 
3a90: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78     p = sqlite3Ex
3aa0: 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62  prAnd(pParse->db
3ab0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
3ac0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
3ad0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
3ae0: 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
3af0: 6f 70 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a  op, pToken, 1);.
3b00: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
3b10: 74 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50  ttachSubtrees(pP
3b20: 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65  arse->db, p, pLe
3b30: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  ft, pRight);.  }
3b40: 0a 20 20 69 66 28 20 70 20 29 20 7b 0a 20 20 20  .  if( p ) {.   
3b50: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
3b60: 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  kHeight(pParse, 
3b70: 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  p->nHeight);.  }
3b80: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
3b90: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69  /*.** Return 1 i
3ba0: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
3bb0: 6d 75 73 74 20 62 65 20 46 41 4c 53 45 20 69 6e  must be FALSE in
3bc0: 20 61 6c 6c 20 63 61 73 65 73 20 61 6e 64 20 30   all cases and 0
3bd0: 20 69 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   if the.** expre
3be0: 73 73 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 74  ssion might be t
3bf0: 72 75 65 2e 20 20 54 68 69 73 20 69 73 20 61 6e  rue.  This is an
3c00: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
3c10: 49 66 20 69 73 20 4f 4b 20 74 6f 0a 2a 2a 20 72  If is OK to.** r
3c20: 65 74 75 72 6e 20 30 20 68 65 72 65 20 65 76 65  eturn 0 here eve
3c30: 6e 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  n if the express
3c40: 69 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61 6c  ion really is al
3c50: 77 61 79 73 20 66 61 6c 73 65 20 28 61 20 0a 2a  ways false (a .*
3c60: 2a 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65  * false negative
3c70: 29 2e 20 20 42 75 74 20 69 74 20 69 73 20 61 20  ).  But it is a 
3c80: 62 75 67 20 74 6f 20 72 65 74 75 72 6e 20 31 20  bug to return 1 
3c90: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
3ca0: 6e 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 74 72  n.** might be tr
3cb0: 75 65 20 69 6e 20 73 6f 6d 65 20 72 61 72 65 20  ue in some rare 
3cc0: 63 69 72 63 75 6d 73 74 61 6e 63 65 73 20 28 61  circumstances (a
3cd0: 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e   false positive.
3ce0: 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ).**.** Note tha
3cf0: 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  t if the express
3d00: 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 63  ion is part of c
3d10: 6f 6e 64 69 74 69 6f 6e 61 6c 20 66 6f 72 20 61  onditional for a
3d20: 0a 2a 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74  .** LEFT JOIN, t
3d30: 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20 64 65  hen we cannot de
3d40: 74 65 72 6d 69 6e 65 20 61 74 20 63 6f 6d 70 69  termine at compi
3d50: 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20  le-time whether 
3d60: 6f 72 20 6e 6f 74 0a 2a 2a 20 69 73 20 69 74 20  or not.** is it 
3d70: 74 72 75 65 20 6f 72 20 66 61 6c 73 65 2c 20 73  true or false, s
3d80: 6f 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20  o always return 
3d90: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
3da0: 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
3db0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74  (Expr *p){.  int
3dc0: 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78   v = 0;.  if( Ex
3dd0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
3de0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20   EP_FromJoin) ) 
3df0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
3e00: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e  !sqlite3ExprIsIn
3e10: 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20 72  teger(p, &v) ) r
3e20: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
3e30: 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n v==0;.}../*.**
3e40: 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73   Join two expres
3e50: 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41  sions using an A
3e60: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  ND operator.  If
3e70: 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69   either expressi
3e80: 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74  on is.** NULL, t
3e90: 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
3ea0: 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73  the other expres
3eb0: 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f  sion..**.** If o
3ec0: 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f  ne side or the o
3ed0: 74 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20  ther of the AND 
3ee0: 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66  is known to be f
3ef0: 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65  alse, then inste
3f00: 61 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69  ad.** of returni
3f10: 6e 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73  ng an AND expres
3f20: 73 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72  sion, just retur
3f30: 6e 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70  n a constant exp
3f40: 72 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20  ression with.** 
3f50: 61 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65  a value of false
3f60: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
3f70: 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65  e3ExprAnd(sqlite
3f80: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65  3 *db, Expr *pLe
3f90: 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74  ft, Expr *pRight
3fa0: 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d  ){.  if( pLeft==
3fb0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
3fc0: 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20  pRight;.  }else 
3fd0: 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b  if( pRight==0 ){
3fe0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66  .    return pLef
3ff0: 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  t;.  }else if( e
4000: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
4010: 4c 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c 77  Left) || exprAlw
4020: 61 79 73 46 61 6c 73 65 28 70 52 69 67 68 74 29  aysFalse(pRight)
4030: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4040: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  xprDelete(db, pL
4050: 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eft);.    sqlite
4060: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
4070: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74  pRight);.    ret
4080: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
4090: 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45  lloc(db, TK_INTE
40a0: 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74  GER, &sqlite3Int
40b0: 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20  Tokens[0], 0);. 
40c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72   }else{.    Expr
40d0: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
40e0: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
40f0: 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _AND, 0, 0);.   
4100: 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61   sqlite3ExprAtta
4110: 63 68 53 75 62 74 72 65 65 73 28 64 62 2c 20 70  chSubtrees(db, p
4120: 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  New, pLeft, pRig
4130: 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ht);.    return 
4140: 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  pNew;.  }.}../*.
4150: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e  ** Construct a n
4160: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
4170: 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f  de for a functio
4180: 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a  n with multiple.
4190: 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f  ** arguments..*/
41a0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
41b0: 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65  prFunction(Parse
41c0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69   *pParse, ExprLi
41d0: 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
41e0: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70   *pToken){.  Exp
41f0: 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74  r *pNew;.  sqlit
4200: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
4210: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
4220: 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20  Token );.  pNew 
4230: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
4240: 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49  oc(db, TK_FUNCTI
4250: 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a  ON, pToken, 1);.
4260: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
4270: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
4280: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
4290: 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20  List); /* Avoid 
42a0: 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e  memory leak when
42b0: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
42c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
42d0: 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69   }.  pNew->x.pLi
42e0: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73  st = pList;.  as
42f0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
4300: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
4310: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
4320: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
4330: 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 4e 65  ight(pParse, pNe
4340: 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  w);.  return pNe
4350: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  w;.}../*.** Assi
4360: 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75  gn a variable nu
4370: 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65  mber to an expre
4380: 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64  ssion that encod
4390: 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a  es a wildcard.**
43a0: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
43b0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
43c0: 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64   .**.** Wildcard
43d0: 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  s consisting of 
43e0: 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65  a single "?" are
43f0: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65   assigned the ne
4400: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a  xt sequential.**
4410: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
4420: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
4430: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  s of the form "?
4440: 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65  nnn" are assigne
4450: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e  d the number "nn
4460: 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20  n".  We make.** 
4470: 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f  sure "nnn" is no
4480: 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69  t too be to avoi
4490: 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65  d a denial of se
44a0: 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65  rvice attack whe
44b0: 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61  n.** the SQL sta
44c0: 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f  tement comes fro
44d0: 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f  m an external so
44e0: 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  urce..**.** Wild
44f0: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
4500: 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22  m ":aaa", "@aaa"
4510: 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20  , or "$aaa" are 
4520: 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d  assigned the sam
4530: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74  e number.** as t
4540: 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74  he previous inst
4550: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
4560: 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69   wildcard.  Or i
4570: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
4580: 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20  rst.** instance 
4590: 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c  of the wildcard,
45a0: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
45b0: 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ial variable num
45c0: 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e  ber is.** assign
45d0: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
45e0: 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72  te3ExprAssignVar
45f0: 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50  Number(Parse *pP
4600: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
4610: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  r){.  sqlite3 *d
4620: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
4630: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
4640: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ..  if( pExpr==0
4650: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
4660: 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79  ert( !ExprHasAny
4670: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
4680: 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52  EP_IntValue|EP_R
4690: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
46a0: 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45  nly) );.  z = pE
46b0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
46c0: 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b   assert( z!=0 );
46d0: 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21  .  assert( z[0]!
46e0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d  =0 );.  if( z[1]
46f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69  ==0 ){.    /* Wi
4700: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
4710: 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20  rm "?".  Assign 
4720: 74 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c  the next variabl
4730: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
4740: 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f  assert( z[0]=='?
4750: 27 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  ' );.    pExpr->
4760: 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72  iColumn = (ynVar
4770: 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72  )(++pParse->nVar
4780: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
4790: 79 6e 56 61 72 20 78 20 3d 20 30 3b 0a 20 20 20  ynVar x = 0;.   
47a0: 20 75 33 32 20 6e 20 3d 20 73 71 6c 69 74 65 33   u32 n = sqlite3
47b0: 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20  Strlen30(z);.   
47c0: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29   if( z[0]=='?' )
47d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63  {.      /* Wildc
47e0: 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ard of the form 
47f0: 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74  "?nnn".  Convert
4800: 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74   "nnn" to an int
4810: 65 67 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a  eger and.      *
4820: 2a 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  * use it as the 
4830: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
4840: 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a  */.      i64 i;.
4850: 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20        int bOk = 
4860: 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34  0==sqlite3Atoi64
4870: 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c  (&z[1], &i, n-1,
4880: 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
4890: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
48a0: 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72  umn = x = (ynVar
48b0: 29 69 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  )i;.      testca
48c0: 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  se( i==0 );.    
48d0: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31    testcase( i==1
48e0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
48f0: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
4900: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
4910: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d  ARIABLE_NUMBER]-
4920: 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
4930: 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d  ase( i==db->aLim
4940: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
4950: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
4960: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f   );.      if( bO
4970: 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69  k==0 || i<1 || i
4980: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
4990: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
49a0: 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20  E_NUMBER] ){.   
49b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
49c0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61  rMsg(pParse, "va
49d0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75  riable number mu
49e0: 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31  st be between ?1
49f0: 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20   and ?%d",.     
4a00: 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69         db->aLimi
4a10: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
4a20: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29  ARIABLE_NUMBER])
4a30: 3b 0a 20 20 20 20 20 20 20 20 78 20 3d 20 30 3b  ;.        x = 0;
4a40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
4a50: 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61  f( i>pParse->nVa
4a60: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  r ){.        pPa
4a70: 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e 74  rse->nVar = (int
4a80: 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )i;.      }.    
4a90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
4aa0: 57 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22  Wildcards like "
4ab0: 3a 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72  :aaa", "$aaa" or
4ac0: 20 22 40 61 61 61 22 2e 20 20 52 65 75 73 65 20   "@aaa".  Reuse 
4ad0: 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c  the same variabl
4ae0: 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65  e.      ** numbe
4af0: 72 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61  r as the prior a
4b00: 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65  ppearance of the
4b10: 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69   same name, or i
4b20: 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20  f the name.     
4b30: 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70   ** has never ap
4b40: 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72  peared before, r
4b50: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61  euse the same va
4b60: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20  riable number.  
4b70: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 79 6e 56      */.      ynV
4b80: 61 72 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  ar i;.      for(
4b90: 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
4ba0: 7a 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  zVar; i++){.    
4bb0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
4bc0: 61 7a 56 61 72 5b 69 5d 20 26 26 20 6d 65 6d 63  azVar[i] && memc
4bd0: 6d 70 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  mp(pParse->azVar
4be0: 5b 69 5d 2c 7a 2c 6e 2b 31 29 3d 3d 30 20 29 7b  [i],z,n+1)==0 ){
4bf0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
4c00: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20  ->iColumn = x = 
4c10: 28 79 6e 56 61 72 29 69 2b 31 3b 0a 20 20 20 20  (ynVar)i+1;.    
4c20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4c30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
4c40: 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20       if( x==0 ) 
4c50: 78 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  x = pExpr->iColu
4c60: 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70  mn = (ynVar)(++p
4c70: 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20  Parse->nVar);.  
4c80: 20 20 7d 0a 20 20 20 20 69 66 28 20 78 3e 30 20    }.    if( x>0 
4c90: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70  ){.      if( x>p
4ca0: 50 61 72 73 65 2d 3e 6e 7a 56 61 72 20 29 7b 0a  Parse->nzVar ){.
4cb0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61          char **a
4cc0: 3b 0a 20 20 20 20 20 20 20 20 61 20 3d 20 73 71  ;.        a = sq
4cd0: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
4ce0: 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  b, pParse->azVar
4cf0: 2c 20 78 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29  , x*sizeof(a[0])
4d00: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
4d10: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  ==0 ) return;  /
4d20: 2a 20 45 72 72 6f 72 20 72 65 70 6f 72 74 65 64  * Error reported
4d30: 20 74 68 72 6f 75 67 68 20 64 62 2d 3e 6d 61 6c   through db->mal
4d40: 6c 6f 63 46 61 69 6c 65 64 20 2a 2f 0a 20 20 20  locFailed */.   
4d50: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56       pParse->azV
4d60: 61 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  ar = a;.        
4d70: 6d 65 6d 73 65 74 28 26 61 5b 70 50 61 72 73 65  memset(&a[pParse
4d80: 2d 3e 6e 7a 56 61 72 5d 2c 20 30 2c 20 28 78 2d  ->nzVar], 0, (x-
4d90: 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 29 2a 73  pParse->nzVar)*s
4da0: 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20  izeof(a[0]));.  
4db0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 7a        pParse->nz
4dc0: 56 61 72 20 3d 20 78 3b 0a 20 20 20 20 20 20 7d  Var = x;.      }
4dd0: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 21  .      if( z[0]!
4de0: 3d 27 3f 27 20 7c 7c 20 70 50 61 72 73 65 2d 3e  ='?' || pParse->
4df0: 61 7a 56 61 72 5b 78 2d 31 5d 3d 3d 30 20 29 7b  azVar[x-1]==0 ){
4e00: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4e10: 44 62 46 72 65 65 28 64 62 2c 20 70 50 61 72 73  DbFree(db, pPars
4e20: 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 29 3b 0a  e->azVar[x-1]);.
4e30: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
4e40: 61 7a 56 61 72 5b 78 2d 31 5d 20 3d 20 73 71 6c  azVar[x-1] = sql
4e50: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
4e60: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  , z, n);.      }
4e70: 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66  .    }.  } .  if
4e80: 28 20 21 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  ( !pParse->nErr 
4e90: 26 26 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e  && pParse->nVar>
4ea0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
4eb0: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
4ec0: 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20  _NUMBER] ){.    
4ed0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
4ee0: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
4ef0: 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22  y SQL variables"
4f00: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
4f10: 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65  Recursively dele
4f20: 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
4f30: 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   tree..*/.void s
4f40: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4f50: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
4f60: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d  pr *p){.  if( p=
4f70: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f  =0 ) return;.  /
4f80: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20  * Sanity check: 
4f90: 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
4fa0: 49 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d  IntValue is non-
4fb0: 6e 65 67 61 74 69 76 65 20 69 66 20 69 74 20 65  negative if it e
4fc0: 78 69 73 74 73 20 2a 2f 0a 20 20 61 73 73 65 72  xists */.  asser
4fd0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
4fe0: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
4ff0: 75 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c  ue) || p->u.iVal
5000: 75 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  ue>=0 );.  if( !
5010: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
5020: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
5030: 6c 79 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ly) ){.    sqlit
5040: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
5050: 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20   p->pLeft);.    
5060: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
5070: 65 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29  e(db, p->pRight)
5080: 3b 0a 20 20 20 20 69 66 28 20 21 45 78 70 72 48  ;.    if( !ExprH
5090: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
50a0: 5f 52 65 64 75 63 65 64 29 20 26 26 20 28 70 2d  _Reduced) && (p-
50b0: 3e 66 6c 61 67 73 32 20 26 20 45 50 32 5f 4d 61  >flags2 & EP2_Ma
50c0: 6c 6c 6f 63 65 64 54 6f 6b 65 6e 29 21 3d 30 20  llocedToken)!=0 
50d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
50e0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e  DbFree(db, p->u.
50f0: 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20  zToken);.    }. 
5100: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
5110: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
5120: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
5130: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
5140: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 53  lete(db, p->x.pS
5150: 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73  elect);.    }els
5160: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
5170: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
5180: 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  b, p->x.pList);.
5190: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
51a0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
51b0: 28 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29  (p, EP_Static) )
51c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
51d0: 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  ree(db, p);.  }.
51e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
51f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
5200: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  tes allocated fo
5210: 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
5220: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70   structure .** p
5230: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
5240: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69  st argument. Thi
5250: 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20  s is always one 
5260: 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  of EXPR_FULLSIZE
5270: 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45  ,.** EXPR_REDUCE
5280: 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f  DSIZE or EXPR_TO
5290: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a  KENONLYSIZE..*/.
52a0: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53  static int exprS
52b0: 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a  tructSize(Expr *
52c0: 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61  p){.  if( ExprHa
52d0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
52e0: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74  TokenOnly) ) ret
52f0: 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e  urn EXPR_TOKENON
5300: 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78  LYSIZE;.  if( Ex
5310: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
5320: 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 20 72   EP_Reduced) ) r
5330: 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43  eturn EXPR_REDUC
5340: 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e  EDSIZE;.  return
5350: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a   EXPR_FULLSIZE;.
5360: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70  }../*.** The dup
5370: 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f  edExpr*Size() ro
5380: 75 74 69 6e 65 73 20 65 61 63 68 20 72 65 74 75  utines each retu
5390: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
53a0: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 0a   bytes required.
53b0: 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f  ** to store a co
53c0: 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  py of an express
53d0: 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f  ion or expressio
53e0: 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20 64 69  n tree.  They di
53f0: 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d  ffer in.** how m
5400: 75 63 68 20 6f 66 20 74 68 65 20 74 72 65 65 20  uch of the tree 
5410: 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a  is measured..**.
5420: 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72  **     dupedExpr
5430: 53 74 72 75 63 74 53 69 7a 65 28 29 20 20 20 20  StructSize()    
5440: 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68   Size of only th
5450: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  e Expr structure
5460: 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78   .**     dupedEx
5470: 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20  prNodeSize()    
5480: 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20     Size of Expr 
5490: 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65  + space for toke
54a0: 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78  n.**     dupedEx
54b0: 70 72 53 69 7a 65 28 29 20 20 20 20 20 20 20 20  prSize()        
54c0: 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20     Expr + token 
54d0: 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e  + subtree compon
54e0: 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ents.**.********
54f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5530: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75  ***.**.** The du
5540: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
5550: 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  e() function ret
5560: 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20  urns two values 
5570: 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20  OR-ed together: 
5580: 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61   .** (1) the spa
5590: 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ce required for 
55a0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78  a copy of the Ex
55b0: 70 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c  pr structure onl
55c0: 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68  y and .** (2) th
55d0: 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74  e EP_xxx flags t
55e0: 68 61 74 20 69 6e 64 69 63 61 74 65 20 77 68 61  hat indicate wha
55f0: 74 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  t the structure 
5600: 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a  size should be..
5610: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
5620: 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f  lues is always o
5630: 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ne of:.**.**    
5640: 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a    EXPR_FULLSIZE.
5650: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45 44  **      EXPR_RED
5660: 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f  UCEDSIZE   | EP_
5670: 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20  Reduced.**      
5680: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
5690: 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  ZE | EP_TokenOnl
56a0: 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  y.**.** The size
56b0: 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72   of the structur
56c0: 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62  e can be found b
56d0: 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65  y masking the re
56e0: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66  turn value.** of
56f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
5700: 74 68 20 30 78 66 66 66 2e 20 20 54 68 65 20 66  th 0xfff.  The f
5710: 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e  lags can be foun
5720: 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65  d by masking the
5730: 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
5740: 20 77 69 74 68 20 45 50 5f 52 65 64 75 63 65 64   with EP_Reduced
5750: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a  |EP_TokenOnly..*
5760: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
5770: 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44  ith flags==EXPRD
5780: 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20  UP_REDUCE, this 
5790: 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f  routines works o
57a0: 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28  n full-size.** (
57b0: 75 6e 72 65 64 75 63 65 64 29 20 45 78 70 72 20  unreduced) Expr 
57c0: 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65 79 20  objects as they 
57d0: 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f  or originally co
57e0: 6e 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65  nstructed by the
57f0: 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69   parser..** Duri
5800: 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ng expression an
5810: 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e  alysis, extra in
5820: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d  formation is com
5830: 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20  puted and moved 
5840: 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61  into.** later pa
5850: 72 74 73 20 6f 66 20 74 65 68 20 45 78 70 72 20  rts of teh Expr 
5860: 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20  object and that 
5870: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
5880: 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70  n might get chop
5890: 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68  ped.** off if th
58a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
58b0: 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61  reduced.  Note a
58c0: 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73  lso that it does
58d0: 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20   not work to.** 
58e0: 6d 61 6b 65 20 61 20 45 58 50 52 44 55 50 5f 52  make a EXPRDUP_R
58f0: 45 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61 20  EDUCE copy of a 
5900: 72 65 64 75 63 65 64 20 65 78 70 72 65 73 73 69  reduced expressi
5910: 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20  on.  It is only 
5920: 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75  legal.** to redu
5930: 63 65 20 61 20 70 72 69 73 74 69 6e 65 20 65 78  ce a pristine ex
5940: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66 72  pression tree fr
5950: 6f 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20 20  om the parser.  
5960: 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
5970: 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45 78  on.** of dupedEx
5980: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 63  prStructSize() c
5990: 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20  ontain multiple 
59a0: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
59b0: 6e 74 73 20 74 68 61 74 20 61 74 74 65 6d 70 74  nts that attempt
59c0: 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20 74  .** to enforce t
59d0: 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  his constraint..
59e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
59f0: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
5a00: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
5a10: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69  lags){.  int nSi
5a20: 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c  ze;.  assert( fl
5a30: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
5a40: 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20  UCE || flags==0 
5a50: 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66  ); /* Only one f
5a60: 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65  lag value allowe
5a70: 64 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 28 66  d */.  if( 0==(f
5a80: 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44  lags&EXPRDUP_RED
5a90: 55 43 45 29 20 29 7b 0a 20 20 20 20 6e 53 69 7a  UCE) ){.    nSiz
5aa0: 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  e = EXPR_FULLSIZ
5ab0: 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
5ac0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
5ad0: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45  AnyProperty(p, E
5ae0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
5af0: 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61  educed) );.    a
5b00: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
5b10: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
5b20: 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20  omJoin) ); .    
5b30: 61 73 73 65 72 74 28 20 28 70 2d 3e 66 6c 61 67  assert( (p->flag
5b40: 73 32 20 26 20 45 50 32 5f 4d 61 6c 6c 6f 63 65  s2 & EP2_Malloce
5b50: 64 54 6f 6b 65 6e 29 3d 3d 30 20 29 3b 0a 20 20  dToken)==0 );.  
5b60: 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 66 6c    assert( (p->fl
5b70: 61 67 73 32 20 26 20 45 50 32 5f 49 72 72 65 64  ags2 & EP2_Irred
5b80: 75 63 69 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20  ucible)==0 );.  
5b90: 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c    if( p->pLeft |
5ba0: 7c 20 70 2d 3e 70 52 69 67 68 74 20 7c 7c 20 70  | p->pRight || p
5bb0: 2d 3e 70 43 6f 6c 6c 20 7c 7c 20 70 2d 3e 78 2e  ->pColl || p->x.
5bc0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e  pList ){.      n
5bd0: 53 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55  Size = EXPR_REDU
5be0: 43 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64  CEDSIZE | EP_Red
5bf0: 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  uced;.    }else{
5c00: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
5c10: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
5c20: 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  E | EP_TokenOnly
5c30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
5c40: 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f  turn nSize;.}../
5c50: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
5c60: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  on returns the s
5c70: 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 72 65  pace in bytes re
5c80: 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20  quired to store 
5c90: 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20  the copy .** of 
5ca0: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
5cb0: 72 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66  re and a copy of
5cc0: 20 74 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b   the Expr.u.zTok
5cd0: 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 74 68  en string (if th
5ce0: 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20  at.** string is 
5cf0: 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61  defined.).*/.sta
5d00: 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70  tic int dupedExp
5d10: 72 4e 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a  rNodeSize(Expr *
5d20: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
5d30: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70   int nByte = dup
5d40: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
5d50: 28 70 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66  (p, flags) & 0xf
5d60: 66 66 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48  ff;.  if( !ExprH
5d70: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5d80: 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d  _IntValue) && p-
5d90: 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
5da0: 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65   nByte += sqlite
5db0: 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a  3Strlen30(p->u.z
5dc0: 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20  Token)+1;.  }.  
5dd0: 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42  return ROUND8(nB
5de0: 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  yte);.}../*.** R
5df0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
5e00: 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
5e10: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  ed to create a d
5e20: 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20  uplicate of the 
5e30: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
5e40: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
5e50: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  st argument. The
5e60: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
5e70: 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f   is a.** mask co
5e80: 6e 74 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50  ntaining EXPRDUP
5e90: 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  _XXX flags..**.*
5ea0: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
5eb0: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70  rned includes sp
5ec0: 61 63 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  ace to create a 
5ed0: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
5ee0: 20 73 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c   struct.** itsel
5ef0: 66 20 61 6e 64 20 74 68 65 20 62 75 66 66 65 72  f and the buffer
5f00: 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20   referred to by 
5f10: 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69  Expr.u.zToken, i
5f20: 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f any..**.** If 
5f30: 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55  the EXPRDUP_REDU
5f40: 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  CE flag is set, 
5f50: 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
5f60: 76 61 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a  value includes .
5f70: 2a 2a 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c  ** space to dupl
5f80: 69 63 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e  icate all Expr n
5f90: 6f 64 65 73 20 69 6e 20 74 68 65 20 74 72 65 65  odes in the tree
5fa0: 20 66 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e   formed by Expr.
5fb0: 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78  pLeft .** and Ex
5fc0: 70 72 2e 70 52 69 67 68 74 20 76 61 72 69 61 62  pr.pRight variab
5fd0: 6c 65 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72  les (but not for
5fe0: 20 61 6e 79 20 73 74 72 75 63 74 75 72 65 73 20   any structures 
5ff0: 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a  pointed to or .*
6000: 2a 20 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d  * descended from
6010: 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73   the Expr.x.pLis
6020: 74 20 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c  t or Expr.x.pSel
6030: 65 63 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a  ect variables)..
6040: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
6050: 70 65 64 45 78 70 72 53 69 7a 65 28 45 78 70 72  pedExprSize(Expr
6060: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
6070: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30  .  int nByte = 0
6080: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
6090: 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78   nByte = dupedEx
60a0: 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c  prNodeSize(p, fl
60b0: 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c  ags);.    if( fl
60c0: 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55  ags&EXPRDUP_REDU
60d0: 43 45 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  CE ){.      nByt
60e0: 65 20 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69  e += dupedExprSi
60f0: 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61  ze(p->pLeft, fla
6100: 67 73 29 20 2b 20 64 75 70 65 64 45 78 70 72 53  gs) + dupedExprS
6110: 69 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66  ize(p->pRight, f
6120: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  lags);.    }.  }
6130: 0a 20 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b  .  return nByte;
6140: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
6150: 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
6160: 61 72 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70  ar to sqlite3Exp
6170: 72 44 75 70 28 29 2c 20 65 78 63 65 70 74 20 74  rDup(), except t
6180: 68 61 74 20 69 66 20 70 7a 42 75 66 66 65 72 20  hat if pzBuffer 
6190: 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  .** is not NULL 
61a0: 74 68 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69  then *pzBuffer i
61b0: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69  s assumed to poi
61c0: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c  nt to a buffer l
61d0: 61 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20  arge enough .** 
61e0: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70  to store the cop
61f0: 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20  y of expression 
6200: 70 2c 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66  p, the copies of
6210: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20   p->u.zToken.** 
6220: 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c  (if applicable),
6230: 20 61 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20   and the copies 
6240: 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20  of the p->pLeft 
6250: 61 6e 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78  and p->pRight ex
6260: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66  pressions,.** if
6270: 20 61 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74   any. Before ret
6280: 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65  urning, *pzBuffe
6290: 72 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  r is set to the 
62a0: 66 69 72 73 74 20 62 79 74 65 20 70 61 73 73 65  first byte passe
62b0: 64 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e  d the.** portion
62c0: 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 63   of the buffer c
62d0: 6f 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68  opied into by th
62e0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
62f0: 73 74 61 74 69 63 20 45 78 70 72 20 2a 65 78 70  static Expr *exp
6300: 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rDup(sqlite3 *db
6310: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  , Expr *p, int f
6320: 6c 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66  lags, u8 **pzBuf
6330: 66 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  fer){.  Expr *pN
6340: 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ew = 0;         
6350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6360: 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
6370: 2a 2f 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  */.  if( p ){.  
6380: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 52 65    const int isRe
6390: 64 75 63 65 64 20 3d 20 28 66 6c 61 67 73 26 45  duced = (flags&E
63a0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
63b0: 20 20 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a      u8 *zAlloc;.
63c0: 20 20 20 20 75 33 32 20 73 74 61 74 69 63 46 6c      u32 staticFl
63d0: 61 67 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73  ag = 0;..    ass
63e0: 65 72 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30  ert( pzBuffer==0
63f0: 20 7c 7c 20 69 73 52 65 64 75 63 65 64 20 29 3b   || isReduced );
6400: 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  ..    /* Figure 
6410: 6f 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69  out where to wri
6420: 74 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20  te the new Expr 
6430: 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
6440: 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29    if( pzBuffer )
6450: 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d  {.      zAlloc =
6460: 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20   *pzBuffer;.    
6470: 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45    staticFlag = E
6480: 50 5f 53 74 61 74 69 63 3b 0a 20 20 20 20 7d 65  P_Static;.    }e
6490: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f  lse{.      zAllo
64a0: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
64b0: 6c 6f 63 52 61 77 28 64 62 2c 20 64 75 70 65 64  locRaw(db, duped
64c0: 45 78 70 72 53 69 7a 65 28 70 2c 20 66 6c 61 67  ExprSize(p, flag
64d0: 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  s));.    }.    p
64e0: 4e 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41  New = (Expr *)zA
64f0: 6c 6c 6f 63 3b 0a 0a 20 20 20 20 69 66 28 20 70  lloc;..    if( p
6500: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  New ){.      /* 
6510: 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20  Set nNewSize to 
6520: 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74  the size allocat
6530: 65 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63  ed for the struc
6540: 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a  ture pointed to.
6550: 20 20 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77        ** by pNew
6560: 2e 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72  . This is either
6570: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20   EXPR_FULLSIZE, 
6580: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
6590: 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 45 58 50   or.      ** EXP
65a0: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e  R_TOKENONLYSIZE.
65b0: 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74   nToken is set t
65c0: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
65d0: 62 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20  bytes consumed. 
65e0: 20 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63       ** by the c
65f0: 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e  opy of the p->u.
6600: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69  zToken string (i
6610: 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f  f any)..      */
6620: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  .      const uns
6630: 69 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a  igned nStructSiz
6640: 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72  e = dupedExprStr
6650: 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  uctSize(p, flags
6660: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  );.      const i
6670: 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53  nt nNewSize = nS
6680: 74 72 75 63 74 53 69 7a 65 20 26 20 30 78 66 66  tructSize & 0xff
6690: 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f  f;.      int nTo
66a0: 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ken;.      if( !
66b0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
66c0: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
66d0: 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  && p->u.zToken )
66e0: 7b 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e  {.        nToken
66f0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
6700: 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20  30(p->u.zToken) 
6710: 2b 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  + 1;.      }else
6720: 7b 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e  {.        nToken
6730: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
6740: 20 20 20 20 69 66 28 20 69 73 52 65 64 75 63 65      if( isReduce
6750: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  d ){.        ass
6760: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
6770: 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63  erty(p, EP_Reduc
6780: 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ed)==0 );.      
6790: 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c    memcpy(zAlloc,
67a0: 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20   p, nNewSize);. 
67b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
67c0: 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20      int nSize = 
67d0: 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  exprStructSize(p
67e0: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
67f0: 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69  y(zAlloc, p, nSi
6800: 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ze);.        mem
6810: 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a  set(&zAlloc[nSiz
6820: 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c  e], 0, EXPR_FULL
6830: 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20  SIZE-nSize);.   
6840: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53     }..      /* S
6850: 65 74 20 74 68 65 20 45 50 5f 52 65 64 75 63 65  et the EP_Reduce
6860: 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c  d, EP_TokenOnly,
6870: 20 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66   and EP_Static f
6880: 6c 61 67 73 20 61 70 70 72 6f 70 72 69 61 74 65  lags appropriate
6890: 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  ly. */.      pNe
68a0: 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50  w->flags &= ~(EP
68b0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
68c0: 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 29  nOnly|EP_Static)
68d0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  ;.      pNew->fl
68e0: 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69  ags |= nStructSi
68f0: 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ze & (EP_Reduced
6900: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a  |EP_TokenOnly);.
6910: 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
6920: 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b  s |= staticFlag;
6930: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  ..      /* Copy 
6940: 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  the p->u.zToken 
6950: 73 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20  string, if any. 
6960: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 54 6f  */.      if( nTo
6970: 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ken ){.        c
6980: 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e  har *zToken = pN
6990: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28  ew->u.zToken = (
69a0: 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e  char*)&zAlloc[nN
69b0: 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20  ewSize];.       
69c0: 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20   memcpy(zToken, 
69d0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f  p->u.zToken, nTo
69e0: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ken);.      }.. 
69f0: 20 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d       if( 0==((p-
6a00: 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61  >flags|pNew->fla
6a10: 67 73 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e  gs) & EP_TokenOn
6a20: 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ly) ){.        /
6a30: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e  * Fill in the pN
6a40: 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72  ew->x.pSelect or
6a50: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d   pNew->x.pList m
6a60: 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ember. */.      
6a70: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
6a80: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
6a90: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
6aa0: 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c      pNew->x.pSel
6ab0: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
6ac0: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e  ectDup(db, p->x.
6ad0: 70 53 65 6c 65 63 74 2c 20 69 73 52 65 64 75 63  pSelect, isReduc
6ae0: 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ed);.        }el
6af0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
6b00: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71  ew->x.pList = sq
6b10: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
6b20: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c  (db, p->x.pList,
6b30: 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20   isReduced);.   
6b40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
6b50: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
6b60: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64   pNew->pLeft and
6b70: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a   pNew->pRight. *
6b80: 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  /.      if( Expr
6b90: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
6ba0: 4e 65 77 2c 20 45 50 5f 52 65 64 75 63 65 64 7c  New, EP_Reduced|
6bb0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
6bc0: 0a 20 20 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20  .        zAlloc 
6bd0: 2b 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65  += dupedExprNode
6be0: 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a  Size(p, flags);.
6bf0: 20 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72          if( Expr
6c00: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
6c10: 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 7b  , EP_Reduced) ){
6c20: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
6c30: 3e 70 4c 65 66 74 20 3d 20 65 78 70 72 44 75 70  >pLeft = exprDup
6c40: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45  (db, p->pLeft, E
6c50: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
6c60: 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  zAlloc);.       
6c70: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
6c80: 3d 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d  = exprDup(db, p-
6c90: 3e 70 52 69 67 68 74 2c 20 45 58 50 52 44 55 50  >pRight, EXPRDUP
6ca0: 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63  _REDUCE, &zAlloc
6cb0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
6cc0: 20 20 20 20 20 69 66 28 20 70 7a 42 75 66 66 65       if( pzBuffe
6cd0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  r ){.          *
6ce0: 70 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f  pzBuffer = zAllo
6cf0: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
6d00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6d10: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 32 20 3d    pNew->flags2 =
6d20: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
6d30: 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
6d40: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
6d50: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
6d60: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
6d70: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
6d80: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  b, p->pLeft, 0);
6d90: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
6da0: 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  >pRight = sqlite
6db0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
6dc0: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
6dd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
6de0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6df0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
6e00: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
6e10: 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73  roup of routines
6e20: 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65   make deep copie
6e30: 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  s of expressions
6e40: 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  ,.** expression 
6e50: 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c  lists, ID lists,
6e60: 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74   and select stat
6e70: 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70  ements.  The cop
6e80: 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65  ies can.** be de
6e90: 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e 67 20  leted (by being 
6ea0: 70 61 73 73 65 64 20 74 6f 20 74 68 65 69 72 20  passed to their 
6eb0: 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65  respective ...De
6ec0: 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29  lete() routines)
6ed0: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65  .** without effe
6ee0: 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e  cting the origin
6ef0: 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  als..**.** The e
6f00: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20  xpression list, 
6f10: 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c  ID, and source l
6f20: 69 73 74 73 20 72 65 74 75 72 6e 20 62 79 20 73  ists return by s
6f30: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
6f40: 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49  p(),.** sqlite3I
6f50: 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20  dListDup(), and 
6f60: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
6f70: 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66  p() can not be f
6f80: 75 72 74 68 65 72 20 65 78 70 61 6e 64 65 64 20  urther expanded 
6f90: 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e  .** by subsequen
6fa0: 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
6fb0: 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72  e*ListAppend() r
6fc0: 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  outines..**.** A
6fd0: 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74 20 74  ny tables that t
6fe0: 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74  he SrcList might
6ff0: 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f   point to are no
7000: 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2a  t duplicated..**
7010: 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61  .** The flags pa
7020: 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e 73  rameter contains
7030: 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f   a combination o
7040: 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 58 58  f the EXPRDUP_XX
7050: 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66 20 74  X flags..** If t
7060: 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  he EXPRDUP_REDUC
7070: 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  E flag is set, t
7080: 68 65 6e 20 74 68 65 20 73 74 72 75 63 74 75 72  hen the structur
7090: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 0a  e returned is a.
70a0: 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 76 65 72  ** truncated ver
70b0: 73 69 6f 6e 20 6f 66 20 74 68 65 20 75 73 75 61  sion of the usua
70c0: 6c 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  l Expr structure
70d0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 73 74   that will be st
70e0: 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20  ored as.** part 
70f0: 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  of the in-memory
7100: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
7110: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
7120: 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20  schema..*/.Expr 
7130: 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28  *sqlite3ExprDup(
7140: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
7150: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
7160: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 44  {.  return exprD
7170: 75 70 28 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c  up(db, p, flags,
7180: 20 30 29 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20   0);.}.ExprList 
7190: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
71a0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
71b0: 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e   ExprList *p, in
71c0: 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78 70 72  t flags){.  Expr
71d0: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74  List *pNew;.  st
71e0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
71f0: 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64  em *pItem, *pOld
7200: 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
7210: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
7220: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
7230: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
7240: 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  w(db, sizeof(*pN
7250: 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ew) );.  if( pNe
7260: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
7270: 0a 20 20 70 4e 65 77 2d 3e 69 45 43 75 72 73 6f  .  pNew->iECurso
7280: 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  r = 0;.  pNew->n
7290: 45 78 70 72 20 3d 20 69 20 3d 20 70 2d 3e 6e 45  Expr = i = p->nE
72a0: 78 70 72 3b 0a 20 20 69 66 28 20 28 66 6c 61 67  xpr;.  if( (flag
72b0: 73 20 26 20 45 58 50 52 44 55 50 5f 52 45 44 55  s & EXPRDUP_REDU
72c0: 43 45 29 3d 3d 30 20 29 20 66 6f 72 28 69 3d 31  CE)==0 ) for(i=1
72d0: 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b  ; i<p->nExpr; i+
72e0: 3d 69 29 7b 7d 0a 20 20 70 4e 65 77 2d 3e 61 20  =i){}.  pNew->a 
72f0: 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65  = pItem = sqlite
7300: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
7310: 20 20 69 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b    i*sizeof(p->a[
7320: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74  0]) );.  if( pIt
7330: 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  em==0 ){.    sql
7340: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
7350: 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  New);.    return
7360: 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49   0;.  } .  pOldI
7370: 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f  tem = p->a;.  fo
7380: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=0; i<p->nExp
7390: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c  r; i++, pItem++,
73a0: 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20   pOldItem++){.  
73b0: 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72    Expr *pOldExpr
73c0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78   = pOldItem->pEx
73d0: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  pr;.    pItem->p
73e0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
73f0: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78  prDup(db, pOldEx
7400: 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  pr, flags);.    
7410: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
7420: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
7430: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
7440: 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  me);.    pItem->
7450: 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44  zSpan = sqlite3D
7460: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
7470: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
7480: 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64    pItem->sortOrd
7490: 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73  er = pOldItem->s
74a0: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49  ortOrder;.    pI
74b0: 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20  tem->done = 0;. 
74c0: 20 20 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72     pItem->iOrder
74d0: 42 79 43 6f 6c 20 3d 20 70 4f 6c 64 49 74 65 6d  ByCol = pOldItem
74e0: 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c 3b 0a 20  ->iOrderByCol;. 
74f0: 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73     pItem->iAlias
7500: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 41 6c   = pOldItem->iAl
7510: 69 61 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ias;.  }.  retur
7520: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
7530: 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69   If cursors, tri
7540: 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64  ggers, views and
7550: 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20   subqueries are 
7560: 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  all omitted from
7570: 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74  .** the build, t
7580: 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hen none of the 
7590: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
75a0: 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a  es, except for .
75b0: 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
75c0: 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61  Dup(), can be ca
75d0: 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c  lled. sqlite3Sel
75e0: 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65  ectDup() is some
75f0: 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20  times.** called 
7600: 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75  with a NULL argu
7610: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  ment..*/.#if !de
7620: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7630: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
7640: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7650: 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21  TRIGGER) \. || !
7660: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
7670: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72  MIT_SUBQUERY).Sr
7680: 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
7690: 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  cListDup(sqlite3
76a0: 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70   *db, SrcList *p
76b0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
76c0: 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
76d0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42   int i;.  int nB
76e0: 79 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  yte;.  if( p==0 
76f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42  ) return 0;.  nB
7700: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29  yte = sizeof(*p)
7710: 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20   + (p->nSrc>0 ? 
7720: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
7730: 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20  * (p->nSrc-1) : 
7740: 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  0);.  pNew = sql
7750: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
7760: 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  db, nByte );.  i
7770: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
7780: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
7790: 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  Src = pNew->nAll
77a0: 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20  oc = p->nSrc;.  
77b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53  for(i=0; i<p->nS
77c0: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
77d0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
77e0: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
77f0: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
7800: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
7810: 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26  em *pOldItem = &
7820: 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62  p->a[i];.    Tab
7830: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e  le *pTab;.    pN
7840: 65 77 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20  ewItem->pSchema 
7850: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68  = pOldItem->pSch
7860: 65 6d 61 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ema;.    pNewIte
7870: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  m->zDatabase = s
7880: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
7890: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61  b, pOldItem->zDa
78a0: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65  tabase);.    pNe
78b0: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
78c0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
78d0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
78e0: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
78f0: 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
7900: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
7910: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pOldItem->zAlias
7920: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
7930: 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64  >jointype = pOld
7940: 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a  Item->jointype;.
7950: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43      pNewItem->iC
7960: 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d  ursor = pOldItem
7970: 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70  ->iCursor;.    p
7980: 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  NewItem->addrFil
7990: 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  lSub = pOldItem-
79a0: 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a 20 20  >addrFillSub;.  
79b0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65 67 52    pNewItem->regR
79c0: 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74 65 6d  eturn = pOldItem
79d0: 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20  ->regReturn;.   
79e0: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73 43 6f 72   pNewItem->isCor
79f0: 72 65 6c 61 74 65 64 20 3d 20 70 4f 6c 64 49 74  related = pOldIt
7a00: 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64  em->isCorrelated
7a10: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
7a20: 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  zIndex = sqlite3
7a30: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
7a40: 64 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a  dItem->zIndex);.
7a50: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6e 6f      pNewItem->no
7a60: 74 49 6e 64 65 78 65 64 20 3d 20 70 4f 6c 64 49  tIndexed = pOldI
7a70: 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3b  tem->notIndexed;
7a80: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
7a90: 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d  Index = pOldItem
7aa0: 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54  ->pIndex;.    pT
7ab0: 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70  ab = pNewItem->p
7ac0: 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  Tab = pOldItem->
7ad0: 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54  pTab;.    if( pT
7ae0: 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  ab ){.      pTab
7af0: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a  ->nRef++;.    }.
7b00: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
7b10: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
7b20: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c  electDup(db, pOl
7b30: 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  dItem->pSelect, 
7b40: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
7b50: 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69  Item->pOn = sqli
7b60: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
7b70: 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c  OldItem->pOn, fl
7b80: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ags);.    pNewIt
7b90: 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c  em->pUsing = sql
7ba0: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 64 62  ite3IdListDup(db
7bb0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69  , pOldItem->pUsi
7bc0: 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ng);.    pNewIte
7bd0: 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c  m->colUsed = pOl
7be0: 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  dItem->colUsed;.
7bf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
7c00: 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c  w;.}.IdList *sql
7c10: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 73 71  ite3IdListDup(sq
7c20: 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
7c30: 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20  t *p){.  IdList 
7c40: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
7c50: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
7c60: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
7c70: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
7c80: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
7c90: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
7ca0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
7cb0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20  ;.  pNew->nId = 
7cc0: 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e  p->nId;.  pNew->
7cd0: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  a = sqlite3DbMal
7ce0: 6c 6f 63 52 61 77 28 64 62 2c 20 70 2d 3e 6e 49  locRaw(db, p->nI
7cf0: 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  d*sizeof(p->a[0]
7d00: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  ) );.  if( pNew-
7d10: 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  >a==0 ){.    sql
7d20: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
7d30: 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  New);.    return
7d40: 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74   0;.  }.  /* Not
7d50: 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20 74  e that because t
7d60: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
7d70: 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d  llocation for p-
7d80: 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  >a[] is not.  **
7d90: 20 6e 65 63 65 73 73 61 72 69 6c 79 20 61 20 70   necessarily a p
7da0: 6f 77 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c  ower of two, sql
7db0: 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
7dc0: 28 29 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61  () may not be ca
7dd0: 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lled.  ** on the
7de0: 20 64 75 70 6c 69 63 61 74 65 20 63 72 65 61 74   duplicate creat
7df0: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
7e00: 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ion. */.  for(i=
7e10: 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b  0; i<p->nId; i++
7e20: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ){.    struct Id
7e30: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49  List_item *pNewI
7e40: 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69  tem = &pNew->a[i
7e50: 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ];.    struct Id
7e60: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49  List_item *pOldI
7e70: 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a  tem = &p->a[i];.
7e80: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
7e90: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
7ea0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
7eb0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
7ec0: 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20  pNewItem->idx = 
7ed0: 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20  pOldItem->idx;. 
7ee0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
7ef0: 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  ;.}.Select *sqli
7f00: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
7f10: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
7f20: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
7f30: 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 2c  .  Select *pNew,
7f40: 20 2a 70 50 72 69 6f 72 3b 0a 20 20 69 66 28 20   *pPrior;.  if( 
7f50: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
7f60: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
7f70: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
7f80: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
7f90: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
7fa0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
7fb0: 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
7fc0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
7fd0: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67   p->pEList, flag
7fe0: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63  s);.  pNew->pSrc
7ff0: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
8000: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63  tDup(db, p->pSrc
8010: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
8020: 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
8030: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
8040: 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73 29 3b  >pWhere, flags);
8050: 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42  .  pNew->pGroupB
8060: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
8070: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47  istDup(db, p->pG
8080: 72 6f 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a  roupBy, flags);.
8090: 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
80a0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
80b0: 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  (db, p->pHaving,
80c0: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
80d0: 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
80e0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
80f0: 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  b, p->pOrderBy, 
8100: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
8110: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e  op = p->op;.  pN
8120: 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72  ew->pPrior = pPr
8130: 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ior = sqlite3Sel
8140: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50  ectDup(db, p->pP
8150: 72 69 6f 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20  rior, flags);.  
8160: 69 66 28 20 70 50 72 69 6f 72 20 29 20 70 50 72  if( pPrior ) pPr
8170: 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65  ior->pNext = pNe
8180: 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74  w;.  pNew->pNext
8190: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c   = 0;.  pNew->pL
81a0: 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78  imit = sqlite3Ex
81b0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69  prDup(db, p->pLi
81c0: 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  mit, flags);.  p
81d0: 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73  New->pOffset = s
81e0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
81f0: 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 66 6c  , p->pOffset, fl
8200: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c  ags);.  pNew->iL
8210: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  imit = 0;.  pNew
8220: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->iOffset = 0;. 
8230: 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20   pNew->selFlags 
8240: 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  = p->selFlags & 
8250: 7e 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61  ~SF_UsesEphemera
8260: 6c 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68  l;.  pNew->pRigh
8270: 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 70 4e 65  tmost = 0;.  pNe
8280: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
8290: 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  0] = -1;.  pNew-
82a0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
82b0: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61   = -1;.  pNew->a
82c0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
82d0: 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e   -1;.  return pN
82e0: 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65  ew;.}.#else.Sele
82f0: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
8300: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
8310: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
8320: 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72   flags){.  asser
8330: 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74  t( p==0 );.  ret
8340: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
8350: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
8360: 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
8370: 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65   end of an expre
8380: 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20  ssion list.  If 
8390: 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74  pList is.** init
83a0: 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e  ially NULL, then
83b0: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78   create a new ex
83c0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
83d0: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
83e0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
83f0: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e  r occurs, the en
8400: 74 69 72 65 20 6c 69 73 74 20 69 73 20 66 72 65  tire list is fre
8410: 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69  ed and.** NULL i
8420: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20  s returned.  If 
8430: 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75  non-NULL is retu
8440: 72 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  rned, then it is
8450: 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
8460: 68 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72  hat the new entr
8470: 79 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  y was successful
8480: 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a  ly appended..*/.
8490: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
84a0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
84b0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
84c0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
84d0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
84e0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
84f0: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
8500: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
8510: 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20  ppend. Might be 
8520: 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
8530: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
8540: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
8550: 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20  to be appended. 
8560: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
8570: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
8580: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
8590: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
85a0: 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
85b0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
85c0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70  o(db, sizeof(Exp
85d0: 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  rList) );.    if
85e0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
85f0: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
8600: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
8610: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ->a = sqlite3DbM
8620: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
8630: 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
8640: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
8650: 2d 3e 61 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f  ->a==0 ) goto no
8660: 5f 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _mem;.  }else if
8670: 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ( (pList->nExpr 
8680: 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  & (pList->nExpr-
8690: 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  1))==0 ){.    st
86a0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
86b0: 65 6d 20 2a 61 3b 0a 20 20 20 20 61 73 73 65 72  em *a;.    asser
86c0: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  t( pList->nExpr>
86d0: 30 20 29 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c  0 );.    a = sql
86e0: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
86f0: 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69 73  , pList->a, pLis
8700: 74 2d 3e 6e 45 78 70 72 2a 32 2a 73 69 7a 65 6f  t->nExpr*2*sizeo
8710: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
8720: 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b  .    if( a==0 ){
8730: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  .      goto no_m
8740: 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  em;.    }.    pL
8750: 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a  ist->a = a;.  }.
8760: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
8770: 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 31  >a!=0 );.  if( 1
8780: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
8790: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
87a0: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
87b0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b  pList->nExpr++];
87c0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65  .    memset(pIte
87d0: 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49  m, 0, sizeof(*pI
87e0: 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d  tem));.    pItem
87f0: 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
8800: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c  .  }.  return pL
8810: 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20  ist;..no_mem:   
8820: 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65    .  /* Avoid le
8830: 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20  aking memory if 
8840: 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65  malloc has faile
8850: 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  d. */.  sqlite3E
8860: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
8870: 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  xpr);.  sqlite3E
8880: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
8890: 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75  , pList);.  retu
88a0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn 0;.}../*.** S
88b0: 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e  et the ExprList.
88c0: 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e  a[].zName elemen
88d0: 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  t of the most re
88e0: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65  cently added ite
88f0: 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72  m.** on the expr
8900: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
8910: 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62  ** pList might b
8920: 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67  e NULL following
8930: 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20   an OOM error.  
8940: 42 75 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64  But pName should
8950: 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c   never be.** NUL
8960: 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  L.  If a memory 
8970: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
8980: 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62  , the pParse->db
8990: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
89a0: 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a  lag.** is set..*
89b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
89c0: 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20  prListSetName(. 
89d0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
89e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
89f0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
8a00: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
8a10: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
8a20: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64   to which to add
8a30: 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20   the span. */.  
8a40: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20  Token *pName,   
8a50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
8a60: 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20  to be added */. 
8a70: 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20   int dequote    
8a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
8a90: 20 74 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61   to cause the na
8aa0: 6d 65 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65  me to be dequote
8ab0: 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  d */.){.  assert
8ac0: 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50  ( pList!=0 || pP
8ad0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
8ae0: 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69  Failed!=0 );.  i
8af0: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
8b00: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
8b10: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
8b20: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
8b30: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70  nExpr>0 );.    p
8b40: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
8b50: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d  [pList->nExpr-1]
8b60: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
8b70: 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b  tem->zName==0 );
8b80: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  .    pItem->zNam
8b90: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
8ba0: 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  NDup(pParse->db,
8bb0: 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65   pName->z, pName
8bc0: 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65  ->n);.    if( de
8bd0: 71 75 6f 74 65 20 26 26 20 70 49 74 65 6d 2d 3e  quote && pItem->
8be0: 7a 4e 61 6d 65 20 29 20 73 71 6c 69 74 65 33 44  zName ) sqlite3D
8bf0: 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e  equote(pItem->zN
8c00: 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ame);.  }.}../*.
8c10: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c  ** Set the ExprL
8c20: 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c  ist.a[].zSpan el
8c30: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73  ement of the mos
8c40: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
8c50: 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20   item.** on the 
8c60: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
8c70: 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67  .**.** pList mig
8c80: 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f  ht be NULL follo
8c90: 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  wing an OOM erro
8ca0: 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20 73 68  r.  But pSpan sh
8cb0: 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a  ould never be.**
8cc0: 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d   NULL.  If a mem
8cd0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
8ce0: 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65  ails, the pParse
8cf0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
8d00: 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65  ed flag.** is se
8d10: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
8d20: 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 70 61  e3ExprListSetSpa
8d30: 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
8d40: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
8d50: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
8d60: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
8d70: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
8d80: 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f  List to which to
8d90: 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a   add the span. *
8da0: 2f 0a 20 20 45 78 70 72 53 70 61 6e 20 2a 70 53  /.  ExprSpan *pS
8db0: 70 61 6e 20 20 20 20 20 20 20 20 20 2f 2a 20 54  pan         /* T
8dc0: 68 65 20 73 70 61 6e 20 74 6f 20 62 65 20 61 64  he span to be ad
8dd0: 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ded */.){.  sqli
8de0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
8df0: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
8e00: 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e  pList!=0 || db->
8e10: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20  mallocFailed!=0 
8e20: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
8e30: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
8e40: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
8e50: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
8e60: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  ist->nExpr-1];. 
8e70: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
8e80: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
8e90: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
8ea0: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 49 74  locFailed || pIt
8eb0: 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e  em->pExpr==pSpan
8ec0: 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 73  ->pExpr );.    s
8ed0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8ee0: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a   pItem->zSpan);.
8ef0: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e      pItem->zSpan
8f00: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
8f10: 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70  Dup(db, (char*)p
8f20: 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20  Span->zStart,.  
8f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f50: 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a    (int)(pSpan->z
8f60: 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74  End - pSpan->zSt
8f70: 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  art));.  }.}../*
8f80: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
8f90: 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73  ssion list pELis
8fa0: 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20  t contains more 
8fb0: 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d  than iLimit elem
8fc0: 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61  ents,.** leave a
8fd0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
8fe0: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f  in pParse..*/.vo
8ff0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
9000: 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20  stCheckLength(. 
9010: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a   Parse *pParse,.
9020: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
9030: 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  st,.  const char
9040: 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69   *zObject.){.  i
9050: 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e  nt mx = pParse->
9060: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
9070: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b  E_LIMIT_COLUMN];
9080: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c  .  testcase( pEL
9090: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
90a0: 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65  Expr==mx );.  te
90b0: 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20 26  stcase( pEList &
90c0: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  & pEList->nExpr=
90d0: 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70  =mx+1 );.  if( p
90e0: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
90f0: 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20  >nExpr>mx ){.   
9100: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9110: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
9120: 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73  ny columns in %s
9130: 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d  ", zObject);.  }
9140: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
9150: 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65   an entire expre
9160: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76  ssion list..*/.v
9170: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
9180: 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  istDelete(sqlite
9190: 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20  3 *db, ExprList 
91a0: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
91b0: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
91c0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
91d0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
91e0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
91f0: 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20  rt( pList->a!=0 
9200: 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  || pList->nExpr=
9210: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65  =0 );.  for(pIte
9220: 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
9230: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
9240: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
9250: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
9260: 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
9270: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  >pExpr);.    sql
9280: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
9290: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
92a0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
92b0: 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e  db, pItem->zSpan
92c0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
92d0: 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
92e0: 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ->a);.  sqlite3D
92f0: 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29  bFree(db, pList)
9300: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  ;.}../*.** These
9310: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61   routines are Wa
9320: 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e 20  lker callbacks. 
9330: 20 57 61 6c 6b 65 72 2e 75 2e 70 69 20 69 73 20   Walker.u.pi is 
9340: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
9350: 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 54 68 65  an integer.  The
9360: 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
9370: 63 68 65 63 6b 69 6e 67 20 61 6e 20 65 78 70 72  checking an expr
9380: 65 73 73 69 6f 6e 20 74 6f 20 73 65 65 0a 2a 2a  ession to see.**
9390: 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6e 73   if it is a cons
93a0: 74 61 6e 74 2e 20 20 53 65 74 20 2a 57 61 6c 6b  tant.  Set *Walk
93b0: 65 72 2e 75 2e 70 69 20 74 6f 20 30 20 69 66 20  er.u.pi to 0 if 
93c0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
93d0: 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  s.** not constan
93e0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63  t..**.** These c
93f0: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73  allback routines
9400: 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70   are used to imp
9410: 6c 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f  lement the follo
9420: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
9430: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
9440: 73 74 61 6e 74 28 29 0a 2a 2a 20 20 20 20 20 73  stant().**     s
9450: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
9460: 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 0a 2a 2a  tantNotJoin().**
9470: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
9480: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
9490: 74 69 6f 6e 28 29 0a 2a 2a 0a 2a 2f 0a 73 74 61  tion().**.*/.sta
94a0: 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65  tic int exprNode
94b0: 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65  IsConstant(Walke
94c0: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
94d0: 20 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20   *pExpr){..  /* 
94e0: 49 66 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20  If pWalker->u.i 
94f0: 69 73 20 33 20 74 68 65 6e 20 61 6e 79 20 74 65  is 3 then any te
9500: 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  rm of the expres
9510: 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20  sion that comes 
9520: 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e  from.  ** the ON
9530: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
9540: 73 20 6f 66 20 61 20 6a 6f 69 6e 20 64 69 73 71  s of a join disq
9550: 75 61 6c 69 66 69 65 73 20 74 68 65 20 65 78 70  ualifies the exp
9560: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f  ression.  ** fro
9570: 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72  m being consider
9580: 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a  ed constant. */.
9590: 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75    if( pWalker->u
95a0: 2e 69 3d 3d 33 20 26 26 20 45 78 70 72 48 61 73  .i==3 && ExprHas
95b0: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
95c0: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
95d0: 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e  ){.    pWalker->
95e0: 75 2e 69 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  u.i = 0;.    ret
95f0: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
9600: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45   }..  switch( pE
9610: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f  xpr->op ){.    /
9620: 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74  * Consider funct
9630: 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74  ions to be const
9640: 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72  ant if all their
9650: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63   arguments are c
9660: 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61  onstant.    ** a
9670: 6e 64 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d  nd pWalker->u.i=
9680: 3d 32 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  =2 */.    case T
9690: 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  K_FUNCTION:.    
96a0: 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75    if( pWalker->u
96b0: 2e 69 3d 3d 32 20 29 20 72 65 74 75 72 6e 20 30  .i==2 ) return 0
96c0: 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  ;.      /* Fall 
96d0: 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63  through */.    c
96e0: 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63  ase TK_ID:.    c
96f0: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
9700: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
9710: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73  UNCTION:.    cas
9720: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
9730: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
9740: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
9750: 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  D );.      testc
9760: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
9770: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
9780: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
9790: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
97a0: 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
97b0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
97c0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
97d0: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 70 57 61  UMN );.      pWa
97e0: 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20  lker->u.i = 0;. 
97f0: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
9800: 41 62 6f 72 74 3b 0a 20 20 20 20 64 65 66 61 75  Abort;.    defau
9810: 6c 74 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  lt:.      testca
9820: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
9830: 4b 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73  K_SELECT ); /* s
9840: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
9850: 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f  ant will disallo
9860: 77 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  w */.      testc
9870: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
9880: 54 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20  TK_EXISTS ); /* 
9890: 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73  selectNodeIsCons
98a0: 74 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c  tant will disall
98b0: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  ow */.      retu
98c0: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
98d0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e  .  }.}.static in
98e0: 74 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  t selectNodeIsCo
98f0: 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70  nstant(Walker *p
9900: 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
9910: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
9920: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
9930: 55 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72  Used);.  pWalker
9940: 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 72 65 74  ->u.i = 0;.  ret
9950: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d  urn WRC_Abort;.}
9960: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
9970: 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c  IsConst(Expr *p,
9980: 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 29 7b 0a   int initFlag){.
9990: 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
99a0: 75 2e 69 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a  u.i = initFlag;.
99b0: 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
99c0: 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  k = exprNodeIsCo
99d0: 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c  nstant;.  w.xSel
99e0: 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
99f0: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
9a00: 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  nt;.  sqlite3Wal
9a10: 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20  kExpr(&w, p);.  
9a20: 72 65 74 75 72 6e 20 77 2e 75 2e 69 3b 0a 7d 0a  return w.u.i;.}.
9a30: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
9a40: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
9a50: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
9a60: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
9a70: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30  onstant.** and 0
9a80: 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20   if it involves 
9a90: 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e  variables or fun
9aa0: 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a  ction calls..**.
9ab0: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
9ac0: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
9ad0: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
9ae0: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
9af0: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
9b00: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
9b10: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
9b20: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
9b30: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
9b40: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
9b50: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
9b60: 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20  IsConstant(Expr 
9b70: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  *p){.  return ex
9b80: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 29 3b  prIsConst(p, 1);
9b90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
9ba0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
9bb0: 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  e.  Return 1 if 
9bc0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
9bd0: 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68  s constant.** th
9be0: 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69  at does no origi
9bf0: 6e 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e  nate from the ON
9c00: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
9c10: 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20  s of a join..** 
9c20: 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69  Return 0 if it i
9c30: 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65  nvolves variable
9c40: 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  s or function ca
9c50: 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f  lls or terms fro
9c60: 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53  m.** an ON or US
9c70: 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69  ING clause..*/.i
9c80: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
9c90: 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
9ca0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
9cb0: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
9cc0: 2c 20 33 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  , 3);.}../*.** W
9cd0: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
9ce0: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
9cf0: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
9d00: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
9d10: 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  ** or a function
9d20: 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74   call with const
9d30: 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ant arguments.  
9d40: 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66 20  Return and 0 if 
9d50: 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79  there.** are any
9d60: 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a   variables..**.*
9d70: 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
9d80: 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
9d90: 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
9da0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
9db0: 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
9dc0: 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
9dd0: 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
9de0: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
9df0: 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
9e00: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
9e10: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
9e20: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
9e30: 69 6f 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ion(Expr *p){.  
9e40: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
9e50: 73 74 28 70 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a  st(p, 2);.}../*.
9e60: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
9e70: 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63  sion p codes a c
9e80: 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20  onstant integer 
9e90: 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  that is small en
9ea0: 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69  ough.** to fit i
9eb0: 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  n a 32-bit integ
9ec0: 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64  er, return 1 and
9ed0: 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f   put the value o
9ee0: 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  f the integer.**
9ef0: 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66   in *pValue.  If
9f00: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9f10: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
9f20: 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f  r or if it is to
9f30: 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20  o big.** to fit 
9f40: 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62  in a signed 32-b
9f50: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
9f60: 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a  rn 0 and leave *
9f70: 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64  pValue unchanged
9f80: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
9f90: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78  ExprIsInteger(Ex
9fa0: 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c  pr *p, int *pVal
9fb0: 75 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ue){.  int rc = 
9fc0: 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  0;..  /* If an e
9fd0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20  xpression is an 
9fe0: 69 6e 74 65 67 65 72 20 6c 69 74 65 72 61 6c 20  integer literal 
9ff0: 74 68 61 74 20 66 69 74 73 20 69 6e 20 61 20 73  that fits in a s
a000: 69 67 6e 65 64 20 33 32 2d 62 69 74 0a 20 20 2a  igned 32-bit.  *
a010: 2a 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  * integer, then 
a020: 74 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  the EP_IntValue 
a030: 66 6c 61 67 20 77 69 6c 6c 20 68 61 76 65 20 61  flag will have a
a040: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 74 20  lready been set 
a050: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
a060: 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c  op!=TK_INTEGER |
a070: 7c 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  | (p->flags & EP
a080: 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20 20  _IntValue)!=0.  
a090: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
a0a0: 74 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 75  te3GetInt32(p->u
a0b0: 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30  .zToken, &rc)==0
a0c0: 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c   );..  if( p->fl
a0d0: 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
a0e0: 65 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65  e ){.    *pValue
a0f0: 20 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a   = p->u.iValue;.
a100: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
a110: 7d 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  }.  switch( p->o
a120: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
a130: 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20  _UPLUS: {.      
a140: 72 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  rc = sqlite3Expr
a150: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65  IsInteger(p->pLe
a160: 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20  ft, pValue);.   
a170: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a180: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
a190: 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  US: {.      int 
a1a0: 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  v;.      if( sql
a1b0: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
a1c0: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20  r(p->pLeft, &v) 
a1d0: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c  ){.        *pVal
a1e0: 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20  ue = -v;.       
a1f0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d   rc = 1;.      }
a200: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a210: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
a220: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
a230: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
a240: 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69  * Return FALSE i
a250: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  f there is no ch
a260: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 65 78  ance that the ex
a270: 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20  pression can be 
a280: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  NULL..**.** If t
a290: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69  he expression mi
a2a0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69  ght be NULL or i
a2b0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
a2c0: 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a   is too complex.
a2d0: 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74 75 72  ** to tell retur
a2e0: 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20  n TRUE.  .**.** 
a2f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
a300: 75 73 65 64 20 61 73 20 61 6e 20 6f 70 74 69 6d  used as an optim
a310: 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70  ization, to skip
a320: 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64   OP_IsNull opcod
a330: 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e  es.** when we kn
a340: 6f 77 20 74 68 61 74 20 61 20 76 61 6c 75 65 20  ow that a value 
a350: 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20  cannot be NULL. 
a360: 20 48 65 6e 63 65 2c 20 61 20 66 61 6c 73 65 20   Hence, a false 
a370: 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72 65 74  positive.** (ret
a380: 75 72 6e 69 6e 67 20 54 52 55 45 20 77 68 65 6e  urning TRUE when
a390: 20 69 6e 20 66 61 63 74 20 74 68 65 20 65 78 70   in fact the exp
a3a0: 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65  ression can neve
a3b0: 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74  r be NULL) might
a3c0: 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20 70  .** be a small p
a3d0: 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 20 62  erformance hit b
a3e0: 75 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20  ut is otherwise 
a3f0: 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68  harmless.  On th
a400: 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c  e other.** hand,
a410: 20 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76   a false negativ
a420: 65 20 28 72 65 74 75 72 6e 69 6e 67 20 46 41 4c  e (returning FAL
a430: 53 45 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  SE when the resu
a440: 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c  lt could be NULL
a450: 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ).** will likely
a460: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
a470: 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e 20  correct answer. 
a480: 20 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75 62   So when in doub
a490: 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55  t, return.** TRU
a4a0: 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
a4b0: 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63  3ExprCanBeNull(c
a4c0: 6f 6e 73 74 20 45 78 70 72 20 2a 70 29 7b 0a 20  onst Expr *p){. 
a4d0: 20 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28   u8 op;.  while(
a4e0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   p->op==TK_UPLUS
a4f0: 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d   || p->op==TK_UM
a500: 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70  INUS ){ p = p->p
a510: 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70  Left; }.  op = p
a520: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
a530: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
a540: 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69   = p->op2;.  swi
a550: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
a560: 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a  ase TK_INTEGER:.
a570: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
a580: 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NG:.    case TK_
a590: 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20  FLOAT:.    case 
a5a0: 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72  TK_BLOB:.      r
a5b0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 64 65 66  eturn 0;.    def
a5c0: 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
a5d0: 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 1;.  }.}../*.
a5e0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 4f  ** Generate an O
a5f0: 50 5f 49 73 4e 75 6c 6c 20 69 6e 73 74 72 75 63  P_IsNull instruc
a600: 74 69 6f 6e 20 74 68 61 74 20 74 65 73 74 73 20  tion that tests 
a610: 72 65 67 69 73 74 65 72 20 69 52 65 67 20 61 6e  register iReg an
a620: 64 20 6a 75 6d 70 73 0a 2a 2a 20 74 6f 20 6c 6f  d jumps.** to lo
a630: 63 61 74 69 6f 6e 20 69 44 65 73 74 20 69 66 20  cation iDest if 
a640: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 69 52 65  the value in iRe
a650: 67 20 69 73 20 4e 55 4c 4c 2e 20 20 54 68 65 20  g is NULL.  The 
a660: 76 61 6c 75 65 20 69 6e 20 69 52 65 67 20 0a 2a  value in iReg .*
a670: 2a 20 77 61 73 20 63 6f 6d 70 75 74 65 64 20 62  * was computed b
a680: 79 20 70 45 78 70 72 2e 20 20 49 66 20 77 65 20  y pExpr.  If we 
a690: 63 61 6e 20 6c 6f 6f 6b 20 61 74 20 70 45 78 70  can look at pExp
a6a0: 72 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  r at compile-tim
a6b0: 65 20 61 6e 64 0a 2a 2a 20 64 65 74 65 72 6d 69  e and.** determi
a6c0: 6e 65 20 74 68 61 74 20 69 74 20 63 61 6e 20 6e  ne that it can n
a6d0: 65 76 65 72 20 67 65 6e 65 72 61 74 65 20 61 20  ever generate a 
a6e0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 4f  NULL, then the O
a6f0: 50 5f 49 73 4e 75 6c 6c 20 6f 70 65 72 61 74 69  P_IsNull operati
a700: 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69  on.** can be omi
a710: 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tted..*/.void sq
a720: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e  lite3ExprCodeIsN
a730: 75 6c 6c 4a 75 6d 70 28 0a 20 20 56 64 62 65 20  ullJump(.  Vdbe 
a740: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *v,            /
a750: 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64 65 72  * The VDBE under
a760: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
a770: 0a 20 20 63 6f 6e 73 74 20 45 78 70 72 20 2a 70  .  const Expr *p
a780: 45 78 70 72 2c 20 20 2f 2a 20 4f 6e 6c 79 20 67  Expr,  /* Only g
a790: 65 6e 65 72 61 74 65 20 4f 50 5f 49 73 4e 75 6c  enerate OP_IsNul
a7a0: 6c 20 69 66 20 74 68 69 73 20 65 78 70 72 20 63  l if this expr c
a7b0: 61 6e 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  an be NULL */.  
a7c0: 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20 20 20  int iReg,       
a7d0: 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 65 20      /* Test the 
a7e0: 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65  value in this re
a7f0: 67 69 73 74 65 72 20 66 6f 72 20 4e 55 4c 4c 20  gister for NULL 
a800: 2a 2f 0a 20 20 69 6e 74 20 69 44 65 73 74 20 20  */.  int iDest  
a810: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
a820: 20 68 65 72 65 20 69 66 20 74 68 65 20 76 61 6c   here if the val
a830: 75 65 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 29 7b  ue is null */.){
a840: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
a850: 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45 78 70  prCanBeNull(pExp
a860: 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  r) ){.    sqlite
a870: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a880: 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67 2c 20  P_IsNull, iReg, 
a890: 69 44 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  iDest);.  }.}../
a8a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
a8b0: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   if the given ex
a8c0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
a8d0: 6e 73 74 61 6e 74 20 77 68 69 63 68 20 77 6f 75  nstant which wou
a8e0: 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67  ld be.** unchang
a8f0: 65 64 20 62 79 20 4f 50 5f 41 66 66 69 6e 69 74  ed by OP_Affinit
a900: 79 20 77 69 74 68 20 74 68 65 20 61 66 66 69 6e  y with the affin
a910: 69 74 79 20 67 69 76 65 6e 20 69 6e 20 74 68 65  ity given in the
a920: 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d   second.** argum
a930: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ent..**.** This 
a940: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
a950: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
a960: 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20  the OP_Affinity 
a970: 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  operation.** can
a980: 20 62 65 20 6f 6d 69 74 74 65 64 2e 20 20 57 68   be omitted.  Wh
a990: 65 6e 20 69 6e 20 64 6f 75 62 74 20 72 65 74 75  en in doubt retu
a9a0: 72 6e 20 46 41 4c 53 45 2e 20 20 41 20 66 61 6c  rn FALSE.  A fal
a9b0: 73 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69  se negative.** i
a9c0: 73 20 68 61 72 6d 6c 65 73 73 2e 20 20 41 20 66  s harmless.  A f
a9d0: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2c 20 68  alse positive, h
a9e0: 6f 77 65 76 65 72 2c 20 63 61 6e 20 72 65 73 75  owever, can resu
a9f0: 6c 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a  lt in the wrong.
aa00: 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e  ** answer..*/.in
aa10: 74 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  t sqlite3ExprNee
aa20: 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
aa30: 67 65 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70  ge(const Expr *p
aa40: 2c 20 63 68 61 72 20 61 66 66 29 7b 0a 20 20 75  , char aff){.  u
aa50: 38 20 6f 70 3b 0a 20 20 69 66 28 20 61 66 66 3d  8 op;.  if( aff=
aa60: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
aa70: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 77   ) return 1;.  w
aa80: 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  hile( p->op==TK_
aa90: 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  UPLUS || p->op==
aaa0: 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d  TK_UMINUS ){ p =
aab0: 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f   p->pLeft; }.  o
aac0: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28  p = p->op;.  if(
aad0: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
aae0: 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a   ) op = p->op2;.
aaf0: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
ab00: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
ab10: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  GER: {.      ret
ab20: 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  urn aff==SQLITE_
ab30: 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61  AFF_INTEGER || a
ab40: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
ab50: 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20  UMERIC;.    }.  
ab60: 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
ab70: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
ab80: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
ab90: 52 45 41 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  REAL || aff==SQL
aba0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
abb0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
abc0: 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
abd0: 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53     return aff==S
abe0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
abf0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
ac00: 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  K_BLOB: {.      
ac10: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
ac20: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
ac30: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  MN: {.      asse
ac40: 72 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30  rt( p->iTable>=0
ac50: 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74   );  /* p cannot
ac60: 20 62 65 20 70 61 72 74 20 6f 66 20 61 20 43 48   be part of a CH
ac70: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  ECK constraint *
ac80: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  /.      return p
ac90: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20  ->iColumn<0.    
aca0: 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53        && (aff==S
acb0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
acc0: 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  R || aff==SQLITE
acd0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20  _AFF_NUMERIC);. 
ace0: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
acf0: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
ad00: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
ad10: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
ad20: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
ad30: 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d  string is a row-
ad40: 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a  id column name..
ad50: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73  */.int sqlite3Is
ad60: 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72  Rowid(const char
ad70: 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   *z){.  if( sqli
ad80: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f  te3StrICmp(z, "_
ad90: 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65  ROWID_")==0 ) re
ada0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
adb0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
adc0: 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65  "ROWID")==0 ) re
add0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
ade0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
adf0: 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  "OID")==0 ) retu
ae00: 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
ae10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
ae20: 6e 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65  n true if we are
ae30: 20 61 62 6c 65 20 74 6f 20 74 68 65 20 49 4e 20   able to the IN 
ae40: 6f 70 65 72 61 74 6f 72 20 6f 70 74 69 6d 69 7a  operator optimiz
ae50: 61 74 69 6f 6e 20 6f 6e 20 61 0a 2a 2a 20 71 75  ation on a.** qu
ae60: 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a  ery of the form.
ae70: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 78 20 49 4e  **.**       x IN
ae80: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a   (SELECT ...).**
ae90: 0a 2a 2a 20 57 68 65 72 65 20 74 68 65 20 53 45  .** Where the SE
aea0: 4c 45 43 54 2e 2e 2e 20 63 6c 61 75 73 65 20 69  LECT... clause i
aeb0: 73 20 61 73 20 73 70 65 63 69 66 69 65 64 20 62  s as specified b
aec0: 79 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  y the parameter 
aed0: 74 6f 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  to this.** routi
aee0: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 65  ne..**.** The Se
aef0: 6c 65 63 74 20 6f 62 6a 65 63 74 20 70 61 73 73  lect object pass
af00: 65 64 20 69 6e 20 68 61 73 20 61 6c 72 65 61 64  ed in has alread
af10: 79 20 62 65 65 6e 20 70 72 65 70 72 6f 63 65 73  y been preproces
af20: 73 65 64 20 61 6e 64 20 6e 6f 0a 2a 2a 20 65 72  sed and no.** er
af30: 72 6f 72 73 20 68 61 76 65 20 62 65 65 6e 20 66  rors have been f
af40: 6f 75 6e 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ound..*/.#ifndef
af50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
af60: 51 55 45 52 59 0a 73 74 61 74 69 63 20 69 6e 74  QUERY.static int
af70: 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
af80: 6e 4f 70 74 28 53 65 6c 65 63 74 20 2a 70 29 7b  nOpt(Select *p){
af90: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
afa0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
afb0: 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70  List;.  Table *p
afc0: 54 61 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  Tab;.  if( p==0 
afd0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
afe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aff0: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
b000: 20 6f 66 20 49 4e 20 69 73 20 53 45 4c 45 43 54   of IN is SELECT
b010: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
b020: 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ior ) return 0; 
b030: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b040: 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53  Not a compound S
b050: 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70  ELECT */.  if( p
b060: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
b070: 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
b080: 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74  regate) ){.    t
b090: 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c  estcase( (p->sel
b0a0: 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
b0b0: 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
b0c0: 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
b0d0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
b0e0: 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
b0f0: 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
b100: 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
b110: 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20  _Aggregate );.  
b120: 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e    return 0; /* N
b130: 6f 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  o DISTINCT keywo
b140: 72 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67  rd and no aggreg
b150: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
b160: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
b170: 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b  ->pGroupBy==0 );
b180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b190: 20 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59   Has no GROUP BY
b1a0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28   clause */.  if(
b1b0: 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74   p->pLimit ) ret
b1c0: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
b1d0: 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49      /* Has no LI
b1e0: 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  MIT clause */.  
b1f0: 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73  assert( p->pOffs
b200: 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20  et==0 );        
b210: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d         /* No LIM
b220: 49 54 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53  IT means no OFFS
b230: 45 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  ET */.  if( p->p
b240: 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30  Where ) return 0
b250: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
b260: 2a 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63  * Has no WHERE c
b270: 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20  lause */.  pSrc 
b280: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
b290: 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a  ert( pSrc!=0 );.
b2a0: 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
b2b0: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  !=1 ) return 0; 
b2c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67           /* Sing
b2d0: 6c 65 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20  le term in FROM 
b2e0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
b2f0: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
b300: 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ct ) return 0;  
b310: 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f     /* FROM is no
b320: 74 20 61 20 73 75 62 71 75 65 72 79 20 6f 72 20  t a subquery or 
b330: 76 69 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d  view */.  pTab =
b340: 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62   pSrc->a[0].pTab
b350: 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 54  ;.  if( NEVER(pT
b360: 61 62 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  ab==0) ) return 
b370: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  0;.  assert( pTa
b380: 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  b->pSelect==0 );
b390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
b3a0: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f  ROM clause is no
b3b0: 74 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66  t a view */.  if
b3c0: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
b3d0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  ) ) return 0;   
b3e0: 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
b3f0: 75 73 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61  use not a virtua
b400: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c  l table */.  pEL
b410: 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
b420: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e  .  if( pEList->n
b430: 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
b440: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65   0;       /* One
b450: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72   column in the r
b460: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69  esult set */.  i
b470: 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  f( pEList->a[0].
b480: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
b490: 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  LUMN ) return 0;
b4a0: 20 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61 20   /* Result is a 
b4b0: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 72 65 74 75  column */.  retu
b4c0: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
b4d0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
b4e0: 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  BQUERY */../*.**
b4f0: 20 43 6f 64 65 20 61 6e 20 4f 50 5f 4f 6e 63 65   Code an OP_Once
b500: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64   instruction and
b510: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
b520: 66 6f 72 20 69 74 73 20 66 6c 61 67 2e 20 52 65  for its flag. Re
b530: 74 75 72 6e 20 74 68 65 20 0a 2a 2a 20 61 64 64  turn the .** add
b540: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20  ress of the new 
b550: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
b560: 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65 4f  int sqlite3CodeO
b570: 6e 63 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nce(Parse *pPars
b580: 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  e){.  Vdbe *v = 
b590: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
b5a0: 50 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20  Parse);      /* 
b5b0: 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  Virtual machine 
b5c0: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
b5d0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
b5e0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
b5f0: 4f 6e 63 65 2c 20 70 50 61 72 73 65 2d 3e 6e 4f  Once, pParse->nO
b600: 6e 63 65 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nce++);.}../*.**
b610: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
b620: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6d  s used by the im
b630: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
b640: 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65  the IN (...) ope
b650: 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65 20 70 58  rator..** The pX
b660: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
b670: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20  e expression on 
b680: 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
b690: 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 68 69 63  N operator, whic
b6a0: 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 65 69  h.** might be ei
b6b0: 74 68 65 72 20 61 20 6c 69 73 74 20 6f 66 20 65  ther a list of e
b6c0: 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20  xpressions or a 
b6d0: 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  subquery..**.** 
b6e0: 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
b6f0: 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 66 69  routine is to fi
b700: 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61 20 62  nd or create a b
b710: 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61  -tree object tha
b720: 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64  t can.** be used
b730: 20 65 69 74 68 65 72 20 74 6f 20 74 65 73 74 20   either to test 
b740: 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 69  for membership i
b750: 6e 20 74 68 65 20 52 48 53 20 73 65 74 20 6f 72  n the RHS set or
b760: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
b770: 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65  ugh.** all membe
b780: 72 73 20 6f 66 20 74 68 65 20 52 48 53 20 73 65  rs of the RHS se
b790: 74 2c 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c  t, skipping dupl
b7a0: 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20  icates..**.** A 
b7b0: 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64  cursor is opened
b7c0: 20 6f 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6f   on the b-tree o
b7d0: 62 6a 65 63 74 20 74 68 61 74 20 74 68 65 20 52  bject that the R
b7e0: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
b7f0: 72 61 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d  rator.** and pX-
b800: 3e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74  >iTable is set t
b810: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
b820: 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  hat cursor..**.*
b830: 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
b840: 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
b850: 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20  ction indicates 
b860: 74 68 65 20 62 2d 74 72 65 65 20 74 79 70 65 2c  the b-tree type,
b870: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
b880: 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  **   IN_INDEX_RO
b890: 57 49 44 20 2d 20 54 68 65 20 63 75 72 73 6f 72  WID - The cursor
b8a0: 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
b8b0: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e   database table.
b8c0: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49  .**   IN_INDEX_I
b8d0: 4e 44 45 58 20 2d 20 54 68 65 20 63 75 72 73 6f  NDEX - The curso
b8e0: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
b8f0: 61 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  a database index
b900: 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  ..**   IN_INDEX_
b910: 45 50 48 20 2d 20 20 20 54 68 65 20 63 75 72 73  EPH -   The curs
b920: 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
b930: 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65   a specially cre
b940: 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ated and.**     
b950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
b960: 6f 70 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d  opulated epherem
b970: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
b980: 41 6e 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72  An existing b-tr
b990: 65 65 20 6d 69 67 68 74 20 62 65 20 75 73 65 64  ee might be used
b9a0: 20 69 66 20 74 68 65 20 52 48 53 20 65 78 70 72   if the RHS expr
b9b0: 65 73 73 69 6f 6e 20 70 58 20 69 73 20 61 20 73  ession pX is a s
b9c0: 69 6d 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72  imple.** subquer
b9d0: 79 20 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a  y such as:.**.**
b9e0: 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c       SELECT <col
b9f0: 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65  umn> FROM <table
ba00: 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52  >.**.** If the R
ba10: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
ba20: 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20  rator is a list 
ba30: 6f 72 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  or a more comple
ba40: 78 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e  x subquery, then
ba50: 0a 2a 2a 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  .** an ephemeral
ba60: 20 74 61 62 6c 65 20 6d 69 67 68 74 20 6e 65 65   table might nee
ba70: 64 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65  d to be generate
ba80: 64 20 66 72 6f 6d 20 74 68 65 20 52 48 53 20 61  d from the RHS a
ba90: 6e 64 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69  nd then.** pX->i
baa0: 54 61 62 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f  Table made to po
bab0: 69 6e 74 20 74 6f 20 74 68 65 20 65 70 68 65 72  int to the epher
bac0: 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 6e 73 74  meral table inst
bad0: 65 61 64 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69  ead of an.** exi
bae0: 73 74 69 6e 67 20 74 61 62 6c 65 2e 20 20 0a 2a  sting table.  .*
baf0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 72 4e 6f  *.** If the prNo
bb00: 74 46 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72  tFound parameter
bb10: 20 69 73 20 30 2c 20 74 68 65 6e 20 74 68 65 20   is 0, then the 
bb20: 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75  b-tree will be u
bb30: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 0a 2a  sed to iterate.*
bb40: 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20 73 65  * through the se
bb50: 74 20 6d 65 6d 62 65 72 73 2c 20 73 6b 69 70 70  t members, skipp
bb60: 69 6e 67 20 61 6e 79 20 64 75 70 6c 69 63 61 74  ing any duplicat
bb70: 65 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  es. In this case
bb80: 20 61 6e 0a 2a 2a 20 65 70 68 65 72 65 6d 61 6c   an.** epheremal
bb90: 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 75   table must be u
bba0: 73 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73  sed unless the s
bbb0: 65 6c 65 63 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e  elected <column>
bbc0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a   is guaranteed.*
bbd0: 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d  * to be unique -
bbe0: 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
bbf0: 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52  it is an INTEGER
bc00: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
bc10: 69 74 0a 2a 2a 20 68 61 73 20 61 20 55 4e 49 51  it.** has a UNIQ
bc20: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72  UE constraint or
bc30: 20 55 4e 49 51 55 45 20 69 6e 64 65 78 2e 0a 2a   UNIQUE index..*
bc40: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 72 4e 6f  *.** If the prNo
bc50: 74 46 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72  tFound parameter
bc60: 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20   is not 0, then 
bc70: 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20  the b-tree will 
bc80: 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20  be used .** for 
bc90: 66 61 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73  fast set members
bca0: 68 69 70 20 74 65 73 74 73 2e 20 49 6e 20 74 68  hip tests. In th
bcb0: 69 73 20 63 61 73 65 20 61 6e 20 65 70 68 65 72  is case an epher
bcc0: 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20  emal table must 
bcd0: 0a 2a 2a 20 62 65 20 75 73 65 64 20 75 6e 6c 65  .** be used unle
bce0: 73 73 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 61  ss <column> is a
bcf0: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
bd00: 59 20 4b 45 59 20 6f 72 20 61 6e 20 69 6e 64 65  Y KEY or an inde
bd10: 78 20 63 61 6e 20 0a 2a 2a 20 62 65 20 66 6f 75  x can .** be fou
bd20: 6e 64 20 77 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e  nd with <column>
bd30: 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73   as its left-mos
bd40: 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20  t column..**.** 
bd50: 57 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20  When the b-tree 
bd60: 69 73 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f  is being used fo
bd70: 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  r membership tes
bd80: 74 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  ts, the calling 
bd90: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6e 65 65 64  function.** need
bda0: 73 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65  s to know whethe
bdb0: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 73 74 72  r or not the str
bdc0: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
bdd0: 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 0a 2a 2a 20  an SQL NULL .** 
bde0: 76 61 6c 75 65 20 69 6e 20 6f 72 64 65 72 20 74  value in order t
bdf0: 6f 20 63 6f 72 72 65 63 74 6c 79 20 65 76 61 6c  o correctly eval
be00: 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  uate expressions
be10: 20 6c 69 6b 65 20 22 58 20 49 4e 20 28 59 2c 20   like "X IN (Y, 
be20: 5a 29 22 2e 0a 2a 2a 20 49 66 20 74 68 65 72 65  Z)"..** If there
be30: 20 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20 74   is any chance t
be40: 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69  hat the (...) mi
be50: 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55  ght contain a NU
be60: 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72  LL value at.** r
be70: 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72  untime, then a r
be80: 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63  egister is alloc
be90: 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65 67  ated and the reg
bea0: 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69  ister number wri
beb0: 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 4e 6f  tten.** to *prNo
bec0: 74 46 6f 75 6e 64 2e 20 49 66 20 74 68 65 72 65  tFound. If there
bed0: 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
bee0: 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e  at the (...) con
bef0: 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20  tains a.** NULL 
bf00: 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72 4e  value, then *prN
bf10: 6f 74 46 6f 75 6e 64 20 69 73 20 6c 65 66 74 20  otFound is left 
bf20: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
bf30: 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20 69   If a register i
bf40: 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
bf50: 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f  its location sto
bf60: 72 65 64 20 69 6e 20 2a 70 72 4e 6f 74 46 6f 75  red in *prNotFou
bf70: 6e 64 2c 20 74 68 65 6e 0a 2a 2a 20 69 74 73 20  nd, then.** its 
bf80: 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 69 73  initial value is
bf90: 20 4e 55 4c 4c 2e 20 20 49 66 20 74 68 65 20 28   NULL.  If the (
bfa0: 2e 2e 2e 29 20 64 6f 65 73 20 6e 6f 74 20 72 65  ...) does not re
bfb0: 6d 61 69 6e 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  main constant.**
bfc0: 20 66 6f 72 20 74 68 65 20 64 75 72 61 74 69 6f   for the duratio
bfd0: 6e 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 28  n of the query (
bfe0: 69 2e 65 2e 20 74 68 65 20 53 45 4c 45 43 54 20  i.e. the SELECT 
bff0: 77 69 74 68 69 6e 20 74 68 65 20 28 2e 2e 2e 29  within the (...)
c000: 0a 2a 2a 20 69 73 20 61 20 63 6f 72 72 65 6c 61  .** is a correla
c010: 74 65 64 20 73 75 62 71 75 65 72 79 29 20 74 68  ted subquery) th
c020: 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  en the value of 
c030: 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 72 65  the allocated re
c040: 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 72 65 73  gister is.** res
c050: 65 74 20 74 6f 20 4e 55 4c 4c 20 65 61 63 68 20  et to NULL each 
c060: 74 69 6d 65 20 74 68 65 20 73 75 62 71 75 65 72  time the subquer
c070: 79 20 69 73 20 72 65 72 75 6e 2e 20 54 68 69 73  y is rerun. This
c080: 20 61 6c 6c 6f 77 73 20 74 68 65 0a 2a 2a 20 63   allows the.** c
c090: 61 6c 6c 65 72 20 74 6f 20 75 73 65 20 76 64 62  aller to use vdb
c0a0: 65 20 63 6f 64 65 20 65 71 75 69 76 61 6c 65 6e  e code equivalen
c0b0: 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t to the followi
c0c0: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20  ng:.**.**   if( 
c0d0: 72 65 67 69 73 74 65 72 3d 3d 4e 55 4c 4c 20 29  register==NULL )
c0e0: 7b 0a 2a 2a 20 20 20 20 20 68 61 73 5f 6e 75 6c  {.**     has_nul
c0f0: 6c 20 3d 20 3c 74 65 73 74 20 69 66 20 64 61 74  l = <test if dat
c100: 61 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  a structure cont
c110: 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 20 20  ains null>.**   
c120: 20 20 72 65 67 69 73 74 65 72 20 3d 20 31 0a 2a    register = 1.*
c130: 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 69 6e 20 6f  *   }.**.** in o
c140: 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 72 75  rder to avoid ru
c150: 6e 6e 69 6e 67 20 74 68 65 20 3c 74 65 73 74 20  nning the <test 
c160: 69 66 20 64 61 74 61 20 73 74 72 75 63 74 75 72  if data structur
c170: 65 20 63 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e  e contains null>
c180: 0a 2a 2a 20 74 65 73 74 20 6d 6f 72 65 20 6f 66  .** test more of
c190: 74 65 6e 20 74 68 61 6e 20 69 73 20 6e 65 63 65  ten than is nece
c1a0: 73 73 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ssary..*/.#ifnde
c1b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
c1c0: 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74  BQUERY.int sqlit
c1d0: 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 50 61  e3FindInIndex(Pa
c1e0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
c1f0: 72 20 2a 70 58 2c 20 69 6e 74 20 2a 70 72 4e 6f  r *pX, int *prNo
c200: 74 46 6f 75 6e 64 29 7b 0a 20 20 53 65 6c 65 63  tFound){.  Selec
c210: 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  t *p;           
c220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c230: 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20 74 68   /* SELECT to th
c240: 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20 6f 70  e right of IN op
c250: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
c260: 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20  eType = 0;      
c270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c280: 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52 48 53    /* Type of RHS
c290: 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45 58   table. IN_INDEX
c2a0: 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  _* */.  int iTab
c2b0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
c2c0: 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  +;            /*
c2d0: 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65 20 52   Cursor of the R
c2e0: 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  HS table */.  in
c2f0: 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 3d  t mustBeUnique =
c300: 20 28 70 72 4e 6f 74 46 6f 75 6e 64 3d 3d 30 29   (prNotFound==0)
c310: 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 52  ;   /* True if R
c320: 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75  HS must be uniqu
c330: 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  e */.  Vdbe *v =
c340: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
c350: 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20  pParse);     /* 
c360: 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  Virtual machine 
c370: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 0a  being coded */..
c380: 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70    assert( pX->op
c390: 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 0a 20 20 2f 2a  ==TK_IN );..  /*
c3a0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
c3b0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62   an existing tab
c3c0: 6c 65 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20  le or index can 
c3d0: 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20  be used to.  ** 
c3e0: 73 61 74 69 73 66 79 20 74 68 65 20 71 75 65 72  satisfy the quer
c3f0: 79 2e 20 20 54 68 69 73 20 69 73 20 70 72 65 66  y.  This is pref
c400: 65 72 61 62 6c 65 20 74 6f 20 67 65 6e 65 72 61  erable to genera
c410: 74 69 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a 2a  ting a new .  **
c420: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
c430: 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 28 45 78  ..  */.  p = (Ex
c440: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
c450: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
c460: 3f 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 20  ? pX->x.pSelect 
c470: 3a 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  : 0);.  if( ALWA
c480: 59 53 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  YS(pParse->nErr=
c490: 3d 30 29 20 26 26 20 69 73 43 61 6e 64 69 64 61  =0) && isCandida
c4a0: 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 29 7b  teForInOpt(p) ){
c4b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
c4c0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
c4d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
c4e0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
c4f0: 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20  on */.    Table 
c500: 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
c510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c520: 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c 65   /* Table <table
c530: 3e 2e 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  >. */.    Expr *
c540: 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  pExpr;          
c550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c560: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 3c   /* Expression <
c570: 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69  column> */.    i
c580: 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt iCol;        
c590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5a0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
c5b0: 66 20 63 6f 6c 75 6d 6e 20 3c 63 6f 6c 75 6d 6e  f column <column
c5c0: 3e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62  > */.    int iDb
c5d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5f0: 2f 2a 20 44 61 74 61 62 61 73 65 20 69 64 78 20  /* Database idx 
c600: 66 6f 72 20 70 54 61 62 20 2a 2f 0a 0a 20 20 20  for pTab */..   
c610: 20 61 73 73 65 72 74 28 20 70 20 29 3b 20 20 20   assert( p );   
c620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c630: 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
c640: 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
c650: 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
c660: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
c670: 73 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20  st!=0 );        
c680: 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
c690: 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
c6a0: 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
c6b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
c6c0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d  st->a[0].pExpr!=
c6d0: 30 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  0 ); /* Because 
c6e0: 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
c6f0: 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
c700: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63   assert( p->pSrc
c710: 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  !=0 );          
c720: 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
c730: 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
c740: 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
c750: 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pTab = p->pSrc-
c760: 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[0].pTab;.    
c770: 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  pExpr = p->pELis
c780: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
c790: 20 20 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d     iCol = pExpr-
c7a0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 0a 20 20  >iColumn;.   .  
c7b0: 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f    /* Code an OP_
c7c0: 56 65 72 69 66 79 43 6f 6f 6b 69 65 20 61 6e 64  VerifyCookie and
c7d0: 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f   OP_TableLock fo
c7e0: 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20  r <table>. */.  
c7f0: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
c800: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
c810: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
c820: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
c830: 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
c840: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  rse, iDb);.    s
c850: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
c860: 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
c870: 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
c880: 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f  ->zName);..    /
c890: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
c8a0: 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  is only called f
c8b0: 72 6f 6d 20 74 77 6f 20 70 6c 61 63 65 73 2e 20  rom two places. 
c8c0: 49 6e 20 62 6f 74 68 20 63 61 73 65 73 20 74 68  In both cases th
c8d0: 65 20 76 64 62 65 0a 20 20 20 20 2a 2a 20 68 61  e vdbe.    ** ha
c8e0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
c8f0: 6c 6c 6f 63 61 74 65 64 2e 20 53 6f 20 61 73 73  llocated. So ass
c900: 75 6d 65 20 73 71 6c 69 74 65 33 47 65 74 56 64  ume sqlite3GetVd
c910: 62 65 28 29 20 69 73 20 61 6c 77 61 79 73 0a 20  be() is always. 
c920: 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c     ** successful
c930: 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   here..    */.  
c940: 20 20 61 73 73 65 72 74 28 76 29 3b 0a 20 20 20    assert(v);.   
c950: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
c960: 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a       int iAddr;.
c970: 0a 20 20 20 20 20 20 69 41 64 64 72 20 3d 20 73  .      iAddr = s
c980: 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70  qlite3CodeOnce(p
c990: 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 73  Parse);..      s
c9a0: 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
c9b0: 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44  pParse, iTab, iD
c9c0: 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
c9d0: 52 65 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79  Read);.      eTy
c9e0: 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  pe = IN_INDEX_RO
c9f0: 57 49 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  WID;..      sqli
ca00: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
ca10: 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d  v, iAddr);.    }
ca20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
ca30: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
ca40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca50: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
ca60: 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20  iable */..      
ca70: 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  /* The collation
ca80: 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 62   sequence used b
ca90: 79 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  y the comparison
caa0: 2e 20 49 66 20 61 6e 20 69 6e 64 65 78 20 69 73  . If an index is
cab0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65 20   to.      ** be 
cac0: 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  used in place of
cad0: 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 2c 20 69   a temp-table, i
cae0: 74 20 6d 75 73 74 20 62 65 20 6f 72 64 65 72 65  t must be ordere
caf0: 64 20 61 63 63 6f 72 64 69 6e 67 0a 20 20 20 20  d according.    
cb00: 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 63 6f 6c    ** to this col
cb10: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e  lation sequence.
cb20: 20 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53    */.      CollS
cb30: 65 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74  eq *pReq = sqlit
cb40: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
cb50: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
cb60: 58 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 29  X->pLeft, pExpr)
cb70: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  ;..      /* Chec
cb80: 6b 20 74 68 61 74 20 74 68 65 20 61 66 66 69 6e  k that the affin
cb90: 69 74 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ity that will be
cba0: 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d   used to perform
cbb0: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63   the .      ** c
cbc0: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65  omparison is the
cbd0: 20 73 61 6d 65 20 61 73 20 74 68 65 20 61 66 66   same as the aff
cbe0: 69 6e 69 74 79 20 6f 66 20 74 68 65 20 63 6f 6c  inity of the col
cbf0: 75 6d 6e 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a  umn. If.      **
cc00: 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 69   it is not, it i
cc10: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
cc20: 6f 20 75 73 65 20 61 6e 79 20 69 6e 64 65 78 2e  o use any index.
cc30: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
cc40: 69 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20  int affinity_ok 
cc50: 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66  = sqlite3IndexAf
cc60: 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 70 54 61  finityOk(pX, pTa
cc70: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66  b->aCol[iCol].af
cc80: 66 69 6e 69 74 79 29 3b 0a 0a 20 20 20 20 20 20  finity);..      
cc90: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
cca0: 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20 65  Index; pIdx && e
ccb0: 54 79 70 65 3d 3d 30 20 26 26 20 61 66 66 69 6e  Type==0 && affin
ccc0: 69 74 79 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64  ity_ok; pIdx=pId
ccd0: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
cce0: 20 20 20 69 66 28 20 28 70 49 64 78 2d 3e 61 69     if( (pIdx->ai
ccf0: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29  Column[0]==iCol)
cd00: 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c  .         && sql
cd10: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
cd20: 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 70 49 64  db, ENC(db), pId
cd30: 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 30 29  x->azColl[0], 0)
cd40: 3d 3d 70 52 65 71 0a 20 20 20 20 20 20 20 20 20  ==pReq.         
cd50: 26 26 20 28 21 6d 75 73 74 42 65 55 6e 69 71 75  && (!mustBeUniqu
cd60: 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e 43 6f 6c  e || (pIdx->nCol
cd70: 75 6d 6e 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e  umn==1 && pIdx->
cd80: 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
cd90: 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  )).        ){.  
cda0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64 64          int iAdd
cdb0: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  r;.          cha
cdc0: 72 20 2a 70 4b 65 79 3b 0a 20 20 0a 20 20 20 20  r *pKey;.  .    
cdd0: 20 20 20 20 20 20 70 4b 65 79 20 3d 20 28 63 68        pKey = (ch
cde0: 61 72 20 2a 29 73 71 6c 69 74 65 33 49 6e 64 65  ar *)sqlite3Inde
cdf0: 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
ce00: 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
ce10: 20 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65    iAddr = sqlite
ce20: 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65  3CodeOnce(pParse
ce30: 29 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20  );.  .          
ce40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ce50: 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  4(v, OP_OpenRead
ce60: 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e  , iTab, pIdx->tn
ce70: 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20  um, iDb,.       
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce90: 20 20 20 20 20 20 20 20 70 4b 65 79 2c 50 34 5f          pKey,P4_
cea0: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
ceb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
cec0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
ced0: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  , pIdx->zName));
cee0: 0a 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65  .          eType
cef0: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45   = IN_INDEX_INDE
cf00: 58 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 73 71  X;..          sq
cf10: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
cf20: 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20  e(v, iAddr);.   
cf30: 20 20 20 20 20 20 20 69 66 28 20 70 72 4e 6f 74         if( prNot
cf40: 46 6f 75 6e 64 20 26 26 20 21 70 54 61 62 2d 3e  Found && !pTab->
cf50: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75  aCol[iCol].notNu
cf60: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
cf70: 20 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20    *prNotFound = 
cf80: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
cf90: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
cfa0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
cfb0: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 2a 70 72   OP_Null, 0, *pr
cfc0: 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20 20 20 20 20  NotFound);.     
cfd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
cfe0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
cff0: 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d   }..  if( eType=
d000: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75  =0 ){.    /* Cou
d010: 6c 64 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 20  ld not found an 
d020: 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f  existing table o
d030: 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 61  r index to use a
d040: 73 20 74 68 65 20 52 48 53 20 62 2d 74 72 65 65  s the RHS b-tree
d050: 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c  ..    ** We will
d060: 20 68 61 76 65 20 74 6f 20 67 65 6e 65 72 61 74   have to generat
d070: 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  e an ephemeral t
d080: 61 62 6c 65 20 74 6f 20 64 6f 20 74 68 65 20 6a  able to do the j
d090: 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ob..    */.    d
d0a0: 6f 75 62 6c 65 20 73 61 76 65 64 4e 51 75 65 72  ouble savedNQuer
d0b0: 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e  yLoop = pParse->
d0c0: 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20  nQueryLoop;.    
d0d0: 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  int rMayHaveNull
d0e0: 20 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65 20   = 0;.    eType 
d0f0: 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a  = IN_INDEX_EPH;.
d100: 20 20 20 20 69 66 28 20 70 72 4e 6f 74 46 6f 75      if( prNotFou
d110: 6e 64 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 4e  nd ){.      *prN
d120: 6f 74 46 6f 75 6e 64 20 3d 20 72 4d 61 79 48 61  otFound = rMayHa
d130: 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73  veNull = ++pPars
d140: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
d150: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d160: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
d170: 2a 70 72 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20 20  *prNotFound);.  
d180: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 74    }else{.      t
d190: 65 73 74 63 61 73 65 28 20 70 50 61 72 73 65 2d  estcase( pParse-
d1a0: 3e 6e 51 75 65 72 79 4c 6f 6f 70 3e 28 64 6f 75  >nQueryLoop>(dou
d1b0: 62 6c 65 29 31 20 29 3b 0a 20 20 20 20 20 20 70  ble)1 );.      p
d1c0: 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
d1d0: 70 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20  p = (double)1;. 
d1e0: 20 20 20 20 20 69 66 28 20 70 58 2d 3e 70 4c 65       if( pX->pLe
d1f0: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26  ft->iColumn<0 &&
d200: 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70   !ExprHasAnyProp
d210: 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53  erty(pX, EP_xIsS
d220: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
d230: 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
d240: 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20  EX_ROWID;.      
d250: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
d260: 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
d270: 28 70 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61  (pParse, pX, rMa
d280: 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65  yHaveNull, eType
d290: 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
d2a0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
d2b0: 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65  QueryLoop = save
d2c0: 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d  dNQueryLoop;.  }
d2d0: 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54  else{.    pX->iT
d2e0: 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d  able = iTab;.  }
d2f0: 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b  .  return eType;
d300: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
d310: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
d320: 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71 75 65  or scalar subque
d330: 72 69 65 73 20 75 73 65 64 20 61 73 20 61 20 73  ries used as a s
d340: 75 62 71 75 65 72 79 20 65 78 70 72 65 73 73 69  ubquery expressi
d350: 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a 2a 20 6f  on, EXISTS,.** o
d360: 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20  r IN operators. 
d370: 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a   Examples:.**.**
d380: 20 20 20 20 20 28 53 45 4c 45 43 54 20 61 20 46       (SELECT a F
d390: 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20 20  ROM b)          
d3a0: 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20  -- subquery.**  
d3b0: 20 20 20 45 58 49 53 54 53 20 28 53 45 4c 45 43     EXISTS (SELEC
d3c0: 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d  T a FROM b)   --
d3d0: 20 45 58 49 53 54 53 20 73 75 62 71 75 65 72 79   EXISTS subquery
d3e0: 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c  .**     x IN (4,
d3f0: 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20 20  5,11)           
d400: 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
d410: 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72  r with list on r
d420: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a  ight-hand side.*
d430: 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45  *     x IN (SELE
d440: 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
d450: 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
d460: 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e  with subquery on
d470: 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a   the right.**.**
d480: 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d   The pExpr param
d490: 65 74 65 72 20 64 65 73 63 72 69 62 65 73 20 74  eter describes t
d4a0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
d4b0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
d4c0: 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f  IN.** operator o
d4d0: 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  r subquery..**.*
d4e0: 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69  * If parameter i
d4f0: 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65  sRowid is non-ze
d500: 72 6f 2c 20 74 68 65 6e 20 65 78 70 72 65 73 73  ro, then express
d510: 69 6f 6e 20 70 45 78 70 72 20 69 73 20 67 75 61  ion pExpr is gua
d520: 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
d530: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 72   of the form "<r
d540: 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20  owid> IN (?, ?, 
d550: 3f 29 22 2c 20 77 68 65 72 65 20 3c 72 6f 77 69  ?)", where <rowi
d560: 64 3e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  d> is a referenc
d570: 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74  e.** to some int
d580: 65 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20  eger key column 
d590: 6f 66 20 61 20 74 61 62 6c 65 20 42 2d 54 72 65  of a table B-Tre
d5a0: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  e. In this case,
d5b0: 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65   use an.** intke
d5c0: 79 20 42 2d 54 72 65 65 20 74 6f 20 73 74 6f 72  y B-Tree to stor
d5d0: 65 20 74 68 65 20 73 65 74 20 6f 66 20 49 4e 28  e the set of IN(
d5e0: 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e 73 74  ...) values inst
d5f0: 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c  ead of the usual
d600: 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76 61 72  .** (slower) var
d610: 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79  iable length key
d620: 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  s B-Tree..**.** 
d630: 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  If rMayHaveNull 
d640: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61  is non-zero, tha
d650: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
d660: 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e   operation is an
d670: 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45   IN.** (not a SE
d680: 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 29 20  LECT or EXISTS) 
d690: 61 6e 64 20 74 68 61 74 20 74 68 65 20 52 48 53  and that the RHS
d6a0: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 73 20   might contains 
d6b0: 4e 55 4c 4c 73 2e 0a 2a 2a 20 46 75 72 74 68 65  NULLs..** Furthe
d6c0: 72 6d 6f 72 65 2c 20 74 68 65 20 49 4e 20 69 73  rmore, the IN is
d6d0: 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75   in a WHERE clau
d6e0: 73 65 20 61 6e 64 20 74 68 61 74 20 77 65 20 72  se and that we r
d6f0: 65 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20 74 6f  eally want.** to
d700: 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 74 68   iterate over th
d710: 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
d720: 6f 70 65 72 61 74 6f 72 20 69 6e 20 6f 72 64 65  operator in orde
d730: 72 20 74 6f 20 71 75 69 63 6b 6c 79 20 6c 6f 63  r to quickly loc
d740: 61 74 65 0a 2a 2a 20 61 6c 6c 20 63 6f 72 72 65  ate.** all corre
d750: 73 70 6f 6e 64 69 6e 67 20 4c 48 53 20 65 6c 65  sponding LHS ele
d760: 6d 65 6e 74 73 2e 20 20 41 6c 6c 20 74 68 69 73  ments.  All this
d770: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 69 73   routine does is
d780: 20 69 6e 69 74 69 61 6c 69 7a 65 0a 2a 2a 20 74   initialize.** t
d790: 68 65 20 72 65 67 69 73 74 65 72 20 67 69 76 65  he register give
d7a0: 6e 20 62 79 20 72 4d 61 79 48 61 76 65 4e 75 6c  n by rMayHaveNul
d7b0: 6c 20 74 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c  l to NULL.  Call
d7c0: 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  ing routines wil
d7d0: 6c 20 74 61 6b 65 0a 2a 2a 20 63 61 72 65 20 6f  l take.** care o
d7e0: 66 20 63 68 61 6e 67 69 6e 67 20 74 68 69 73 20  f changing this 
d7f0: 72 65 67 69 73 74 65 72 20 76 61 6c 75 65 20 74  register value t
d800: 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68  o non-NULL if th
d810: 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72  e RHS is NULL-fr
d820: 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61  ee..**.** If rMa
d830: 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 7a 65 72  yHaveNull is zer
d840: 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  o, that means th
d850: 61 74 20 74 68 65 20 73 75 62 71 75 65 72 79 20  at the subquery 
d860: 69 73 20 62 65 69 6e 67 20 75 73 65 64 0a 2a 2a  is being used.**
d870: 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20   for membership 
d880: 74 65 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 54  testing only.  T
d890: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
d8a0: 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6e  to initialize an
d8b0: 79 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 74  y.** registers t
d8c0: 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 70  o indicate the p
d8d0: 72 65 73 65 6e 73 65 20 6f 72 20 61 62 73 65 6e  resense or absen
d8e0: 63 65 20 6f 66 20 4e 55 4c 4c 73 20 6f 6e 20 74  ce of NULLs on t
d8f0: 68 65 20 52 48 53 2e 0a 2a 2a 0a 2a 2a 20 46 6f  he RHS..**.** Fo
d900: 72 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58  r a SELECT or EX
d910: 49 53 54 53 20 6f 70 65 72 61 74 6f 72 2c 20 72  ISTS operator, r
d920: 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
d930: 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  er that holds th
d940: 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f  e.** result.  Fo
d950: 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f  r IN operators o
d960: 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  r if an error oc
d970: 63 75 72 73 2c 20 74 68 65 20 72 65 74 75 72 6e  curs, the return
d980: 20 76 61 6c 75 65 20 69 73 20 30 2e 0a 2a 2f 0a   value is 0..*/.
d990: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d9a0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74  MIT_SUBQUERY.int
d9b0: 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
d9c0: 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
d9d0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
d9e0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
d9f0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
da00: 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20  Expr,           
da10: 20 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c 45   /* The IN, SELE
da20: 43 54 2c 20 6f 72 20 45 58 49 53 54 53 20 6f 70  CT, or EXISTS op
da30: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
da40: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 20 20  rMayHaveNull,   
da50: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
da60: 74 68 61 74 20 72 65 63 6f 72 64 73 20 77 68 65  that records whe
da70: 74 68 65 72 20 4e 55 4c 4c 73 20 65 78 69 73 74  ther NULLs exist
da80: 20 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74   in RHS */.  int
da90: 20 69 73 52 6f 77 69 64 20 20 20 20 20 20 20 20   isRowid        
daa0: 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
dab0: 20 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65 72 61   LHS of IN opera
dac0: 74 6f 72 20 69 73 20 61 20 72 6f 77 69 64 20 2a  tor is a rowid *
dad0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 74 65 73 74 41  /.){.  int testA
dae0: 64 64 72 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  ddr = -1;       
daf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
db00: 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20  * One-time test 
db10: 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74  address */.  int
db20: 20 72 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20   rReg = 0;      
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db40: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
db50: 20 73 74 6f 72 69 6e 67 20 72 65 73 75 6c 74 69   storing resulti
db60: 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  ng */.  Vdbe *v 
db70: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
db80: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
db90: 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65  NEVER(v==0) ) re
dba0: 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65  turn 0;.  sqlite
dbb0: 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
dbc0: 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  Parse);..  /* Th
dbd0: 69 73 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20  is code must be 
dbe0: 72 75 6e 20 69 6e 20 69 74 73 20 65 6e 74 69 72  run in its entir
dbf0: 65 74 79 20 65 76 65 72 79 20 74 69 6d 65 20 69  ety every time i
dc00: 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  t is encountered
dc10: 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20  .  ** if any of 
dc20: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
dc30: 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   true:.  **.  **
dc40: 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74      *  The right
dc50: 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 20  -hand side is a 
dc60: 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75  correlated subqu
dc70: 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54  ery.  **    *  T
dc80: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
dc90: 64 65 20 69 73 20 61 6e 20 65 78 70 72 65 73 73  de is an express
dca0: 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  ion list contain
dcb0: 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20  ing variables.  
dcc0: 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65 20  **    *  We are 
dcd0: 69 6e 73 69 64 65 20 61 20 74 72 69 67 67 65 72  inside a trigger
dce0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c  .  **.  ** If al
dcf0: 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61  l of the above a
dd00: 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77  re false, then w
dd10: 65 20 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63  e can run this c
dd20: 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20  ode just once.  
dd30: 2a 2a 20 73 61 76 65 20 74 68 65 20 72 65 73 75  ** save the resu
dd40: 6c 74 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74  lts, and reuse t
dd50: 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f  he same result o
dd60: 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76  n subsequent inv
dd70: 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ocations..  */. 
dd80: 20 69 66 28 20 21 45 78 70 72 48 61 73 41 6e 79   if( !ExprHasAny
dd90: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
dda0: 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 29 7b  EP_VarSelect) ){
ddb0: 0a 20 20 20 20 74 65 73 74 41 64 64 72 20 3d 20  .    testAddr = 
ddc0: 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
ddd0: 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 23 69  pParse);.  }..#i
dde0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ddf0: 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66 28 20  T_EXPLAIN.  if( 
de00: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
de10: 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =2 ){.    char *
de20: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
de30: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70  rintf(.        p
de40: 50 61 72 73 65 2d 3e 64 62 2c 20 22 45 58 45 43  Parse->db, "EXEC
de50: 55 54 45 20 25 73 25 73 20 53 55 42 51 55 45 52  UTE %s%s SUBQUER
de60: 59 20 25 64 22 2c 20 74 65 73 74 41 64 64 72 3e  Y %d", testAddr>
de70: 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45  =0?"":"CORRELATE
de80: 44 20 22 2c 0a 20 20 20 20 20 20 20 20 70 45 78  D ",.        pEx
de90: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c  pr->op==TK_IN?"L
dea0: 49 53 54 22 3a 22 53 43 41 4c 41 52 22 2c 20 70  IST":"SCALAR", p
deb0: 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
dec0: 63 74 49 64 0a 20 20 20 20 29 3b 0a 20 20 20 20  ctId.    );.    
ded0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dee0: 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
def0: 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
df00: 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20  Id, 0, 0, zMsg, 
df10: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
df20: 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77 69 74 63  .#endif..  switc
df30: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
df40: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
df50: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66  {.      char aff
df60: 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20 20  inity;          
df70: 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
df80: 6f 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  of the LHS of th
df90: 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 4b 65  e IN */.      Ke
dfa0: 79 49 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b 20 20  yInfo keyInfo;  
dfb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79            /* Key
dfc0: 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 67 65 6e  info for the gen
dfd0: 65 72 61 74 65 64 20 74 61 62 6c 65 20 2a 2f 0a  erated table */.
dfe0: 20 20 20 20 20 20 73 74 61 74 69 63 20 75 38 20        static u8 
dff0: 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 20 20  sortOrder = 0;  
e000: 20 20 2f 2a 20 46 61 6b 65 20 61 53 6f 72 74 4f    /* Fake aSortO
e010: 72 64 65 72 20 66 6f 72 20 6b 65 79 49 6e 66 6f  rder for keyInfo
e020: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
e030: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
e040: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
e050: 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d   of OP_OpenEphem
e060: 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
e070: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
e080: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
e090: 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c 48 53  Left; /* the LHS
e0a0: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
e0b0: 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66  tor */..      if
e0c0: 28 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 29  ( rMayHaveNull )
e0d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
e0e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e0f0: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 4d 61 79 48  P_Null, 0, rMayH
e100: 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  aveNull);.      
e110: 7d 0a 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74  }..      affinit
e120: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  y = sqlite3ExprA
e130: 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a  ffinity(pLeft);.
e140: 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65  .      /* Whethe
e150: 72 20 74 68 69 73 20 69 73 20 61 6e 20 27 78 20  r this is an 'x 
e160: 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f  IN(SELECT...)' o
e170: 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72  r an 'x IN(<expr
e180: 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a  list>)'.      **
e190: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69   expression it i
e1a0: 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61  s handled the sa
e1b0: 6d 65 20 77 61 79 2e 20 20 41 6e 20 65 70 68 65  me way.  An ephe
e1c0: 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20 0a  meral table is .
e1d0: 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20        ** filled 
e1e0: 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65 6c  with single-fiel
e1f0: 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70  d index keys rep
e200: 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65  resenting the re
e210: 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 66  sults.      ** f
e220: 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20 6f  rom the SELECT o
e230: 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e  r the <exprlist>
e240: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
e250: 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20 65   ** If the 'x' e
e260: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
e270: 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20  olumn value, or 
e280: 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20  the SELECT....  
e290: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
e2a0: 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d   returns a colum
e2b0: 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68  n value, then th
e2c0: 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68  e affinity of th
e2d0: 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75  at.      ** colu
e2e0: 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62 75  mn is used to bu
e2f0: 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65  ild the index ke
e300: 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20  ys. If both 'x' 
e310: 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  and the.      **
e320: 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65   SELECT... state
e330: 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ment are columns
e340: 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61  , then numeric a
e350: 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a  ffinity is used.
e360: 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68        ** if eith
e370: 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55  er column has NU
e380: 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52  MERIC or INTEGER
e390: 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65   affinity. If ne
e3a0: 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27  ither.      ** '
e3b0: 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43  x' nor the SELEC
e3c0: 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
e3d0: 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
e3e0: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
e3f0: 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73  y.      ** is us
e400: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
e410: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
e420: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
e430: 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  +;.      addr = 
e440: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e450: 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
e460: 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69 54  meral, pExpr->iT
e470: 61 62 6c 65 2c 20 21 69 73 52 6f 77 69 64 29 3b  able, !isRowid);
e480: 0a 20 20 20 20 20 20 69 66 28 20 72 4d 61 79 48  .      if( rMayH
e490: 61 76 65 4e 75 6c 6c 3d 3d 30 20 29 20 73 71 6c  aveNull==0 ) sql
e4a0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
e4b0: 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  (v, BTREE_UNORDE
e4c0: 52 45 44 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73  RED);.      mems
e4d0: 65 74 28 26 6b 65 79 49 6e 66 6f 2c 20 30 2c 20  et(&keyInfo, 0, 
e4e0: 73 69 7a 65 6f 66 28 6b 65 79 49 6e 66 6f 29 29  sizeof(keyInfo))
e4f0: 3b 0a 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e  ;.      keyInfo.
e500: 6e 46 69 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nField = 1;.    
e510: 20 20 6b 65 79 49 6e 66 6f 2e 61 53 6f 72 74 4f    keyInfo.aSortO
e520: 72 64 65 72 20 3d 20 26 73 6f 72 74 4f 72 64 65  rder = &sortOrde
e530: 72 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 45 78  r;..      if( Ex
e540: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
e550: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
e560: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  t) ){.        /*
e570: 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78 70   Case 1:     exp
e580: 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
e590: 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ).        **.   
e5a0: 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65       ** Generate
e5b0: 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74   code to write t
e5c0: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
e5d0: 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68  e select into th
e5e0: 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  e temporary.    
e5f0: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c      ** table all
e600: 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65  ocated and opene
e610: 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20  d above..       
e620: 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65   */.        Sele
e630: 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
e640: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
e650: 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20 20 20  EList;..        
e660: 61 73 73 65 72 74 28 20 21 69 73 52 6f 77 69 64  assert( !isRowid
e670: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
e680: 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
e690: 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53 65 74  t(&dest, SRT_Set
e6a0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29  , pExpr->iTable)
e6b0: 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 61  ;.        dest.a
e6c0: 66 66 53 64 73 74 20 3d 20 28 75 38 29 61 66 66  ffSdst = (u8)aff
e6d0: 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 61  inity;.        a
e6e0: 73 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69  ssert( (pExpr->i
e6f0: 54 61 62 6c 65 26 30 78 30 30 30 30 46 46 46 46  Table&0x0000FFFF
e700: 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  )==pExpr->iTable
e710: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70   );.        pExp
e720: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 69 4c  r->x.pSelect->iL
e730: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
e740: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
e750: 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
e760: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 64  r->x.pSelect, &d
e770: 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  est) ){.        
e780: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
e790: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 45      }.        pE
e7a0: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
e7b0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
e7c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 41 4c 57  .        if( ALW
e7d0: 41 59 53 28 70 45 4c 69 73 74 21 3d 30 20 26 26  AYS(pEList!=0 &&
e7e0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30   pEList->nExpr>0
e7f0: 29 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  ) ){ .          
e800: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d  keyInfo.aColl[0]
e810: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
e820: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
e830: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
e840: 65 66 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eft,.           
e850: 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e     pEList->a[0].
e860: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
e870: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
e880: 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e  ( ALWAYS(pExpr->
e890: 78 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20  x.pList!=0) ){. 
e8a0: 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32         /* Case 2
e8b0: 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65  :     expr IN (e
e8c0: 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20  xprlist).       
e8d0: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46   **.        ** F
e8e0: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
e8f0: 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e 64  on, build an ind
e900: 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20  ex key from the 
e910: 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20  evaluation and. 
e920: 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20         ** store 
e930: 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  it in the tempor
e940: 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c 65  ary table. If <e
e950: 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  xpr> is a column
e960: 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20 20  , then use.     
e970: 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d     ** that colum
e980: 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68 65 6e  ns affinity when
e990: 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78 20   building index 
e9a0: 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e 20  keys. If <expr> 
e9b0: 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a  is not.        *
e9c0: 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20  * a column, use 
e9d0: 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
e9e0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
e9f0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
ea00: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
ea10: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
ea20: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73 74  List;.        st
ea30: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
ea40: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
ea50: 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72     int r1, r2, r
ea60: 33 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  3;..        if( 
ea70: 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20  !affinity ){.   
ea80: 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20         affinity 
ea90: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
eaa0: 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
eab0: 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f       keyInfo.aCo
eac0: 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45  ll[0] = sqlite3E
ead0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
eae0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
eaf0: 3b 0a 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66  ;.        keyInf
eb00: 6f 2e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 26  o.aSortOrder = &
eb10: 73 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20 20 20  sortOrder;..    
eb20: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
eb30: 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73  ugh each express
eb40: 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74  ion in <exprlist
eb50: 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 31  >. */.        r1
eb60: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
eb70: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
eb80: 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
eb90: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
eba0: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
ebb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ebc0: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
ebd0: 32 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  2);.        for(
ebe0: 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  i=pList->nExpr, 
ebf0: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
ec00: 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b  i>0; i--, pItem+
ec10: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78  +){.          Ex
ec20: 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d  pr *pE2 = pItem-
ec30: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
ec40: 20 20 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b    int iValToIns;
ec50: 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ..          /* I
ec60: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
ec70: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74   is not constant
ec80: 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65   then we will ne
ec90: 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ed to.          
eca0: 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20 74  ** disable the t
ecb0: 65 73 74 20 74 68 61 74 20 77 61 73 20 67 65 6e  est that was gen
ecc0: 65 72 61 74 65 64 20 61 62 6f 76 65 20 74 68 61  erated above tha
ecd0: 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20  t makes sure.   
ece0: 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
ecf0: 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65  ode only execute
ed00: 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65  s once.  Because
ed10: 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74   for a non-const
ed20: 61 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ant.          **
ed30: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e   expression we n
ed40: 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69  eed to rerun thi
ed50: 73 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65  s code each time
ed60: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
ed70: 20 20 20 20 20 20 20 20 20 69 66 28 20 74 65 73           if( tes
ed80: 74 41 64 64 72 3e 3d 30 20 26 26 20 21 73 71 6c  tAddr>=0 && !sql
ed90: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
eda0: 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20  nt(pE2) ){.     
edb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
edc0: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
edd0: 2c 20 74 65 73 74 41 64 64 72 29 3b 0a 20 20 20  , testAddr);.   
ede0: 20 20 20 20 20 20 20 20 20 74 65 73 74 41 64 64           testAdd
edf0: 72 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  r = -1;.        
ee00: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
ee10: 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
ee20: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e  xpression and in
ee30: 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65  sert it into the
ee40: 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
ee50: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52           if( isR
ee60: 6f 77 69 64 20 26 26 20 73 71 6c 69 74 65 33 45  owid && sqlite3E
ee70: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 32  xprIsInteger(pE2
ee80: 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29 20 29 7b  , &iValToIns) ){
ee90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
eea0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
eeb0: 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20  , OP_InsertInt, 
eec0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72  pExpr->iTable, r
eed0: 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20  2, iValToIns);. 
eee0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
eef0: 20 20 20 20 20 20 20 20 20 20 20 20 72 33 20 3d              r3 =
ef00: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
ef10: 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
ef20: 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  E2, r1);.       
ef30: 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64       if( isRowid
ef40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
ef50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ef60: 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op2(v, OP_MustBe
ef70: 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20 20 20 20  Int, r3,.       
ef80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef90: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
efa0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
efb0: 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20  v)+2);.         
efc0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
efd0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
efe0: 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ert, pExpr->iTab
eff0: 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20 20  le, r2, r3);.   
f000: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
f010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
f020: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
f030: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
f040: 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20 26 61 66  , r3, 1, r2, &af
f050: 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20  finity, 1);.    
f060: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f070: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
f080: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
f090: 20 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20   r3, 1);.       
f0a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
f0b0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
f0c0: 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d  dxInsert, pExpr-
f0d0: 3e 69 54 61 62 6c 65 2c 20 72 32 29 3b 0a 20 20  >iTable, r2);.  
f0e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
f0f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f100: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
f110: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
f120: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
f130: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
f140: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
f150: 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a  e, r2);.      }.
f160: 20 20 20 20 20 20 69 66 28 20 21 69 73 52 6f 77        if( !isRow
f170: 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  id ){.        sq
f180: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
f190: 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64  4(v, addr, (void
f1a0: 20 2a 29 26 6b 65 79 49 6e 66 6f 2c 20 50 34 5f   *)&keyInfo, P4_
f1b0: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
f1c0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
f1d0: 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
f1e0: 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61  K_EXISTS:.    ca
f1f0: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20  se TK_SELECT:.  
f200: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
f210: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 68 61     /* If this ha
f220: 73 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72  s to be a scalar
f230: 20 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61   SELECT.  Genera
f240: 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74  te code to put t
f250: 68 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75  he.      ** valu
f260: 65 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74  e of this select
f270: 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c   in a memory cel
f280: 6c 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65  l and record the
f290: 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a   number.      **
f2a0: 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63   of the memory c
f2b0: 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 20  ell in iColumn. 
f2c0: 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45   If this is an E
f2d0: 58 49 53 54 53 2c 20 77 72 69 74 65 0a 20 20 20  XISTS, write.   
f2e0: 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72     ** an integer
f2f0: 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29 20   0 (not exists) 
f300: 6f 72 20 31 20 28 65 78 69 73 74 73 29 20 69 6e  or 1 (exists) in
f310: 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  to a memory cell
f320: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
f330: 63 6f 72 64 20 74 68 61 74 20 6d 65 6d 6f 72 79  cord that memory
f340: 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e   cell in iColumn
f350: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
f360: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20   Select *pSel;  
f370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f380: 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
f390: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e   statement to en
f3a0: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 53 65  code */.      Se
f3b0: 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20  lectDest dest;  
f3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3d0: 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65      /* How to de
f3e0: 61 6c 20 77 69 74 68 20 53 45 4c 45 43 74 20 72  al with SELECt r
f3f0: 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 20 20  esult */..      
f400: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
f410: 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29  >op==TK_EXISTS )
f420: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
f430: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
f440: 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20  SELECT );.      
f450: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
f460: 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20  p==TK_EXISTS || 
f470: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
f480: 4c 45 43 54 20 29 3b 0a 0a 20 20 20 20 20 20 61  LECT );..      a
f490: 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72  ssert( ExprHasPr
f4a0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
f4b0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
f4c0: 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45 78 70       pSel = pExp
f4d0: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->x.pSelect;.  
f4e0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
f4f0: 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
f500: 20 30 2c 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d   0, ++pParse->nM
f510: 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  em);.      if( p
f520: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
f530: 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 64  ECT ){.        d
f540: 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
f550: 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Mem;.        sql
f560: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f570: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65  , OP_Null, 0, de
f580: 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  st.iSDParm);.   
f590: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
f5a0: 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75  ((v, "Init subqu
f5b0: 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  ery result"));. 
f5c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f5d0: 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
f5e0: 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20   SRT_Exists;.   
f5f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f600: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
f610: 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 53  eger, 0, dest.iS
f620: 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  DParm);.        
f630: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
f640: 22 49 6e 69 74 20 45 58 49 53 54 53 20 72 65 73  "Init EXISTS res
f650: 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  ult"));.      }.
f660: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f670: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
f680: 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74  db, pSel->pLimit
f690: 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 70  );.      pSel->p
f6a0: 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50  Limit = sqlite3P
f6b0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
f6c0: 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 0a 20  INTEGER, 0, 0,. 
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6f0: 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65   &sqlite3IntToke
f700: 6e 73 5b 31 5d 29 3b 0a 20 20 20 20 20 20 70 53  ns[1]);.      pS
f710: 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  el->iLimit = 0;.
f720: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
f730: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
f740: 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a  pSel, &dest) ){.
f750: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
f760: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f770: 72 52 65 67 20 3d 20 64 65 73 74 2e 69 53 44 50  rReg = dest.iSDP
f780: 61 72 6d 3b 0a 20 20 20 20 20 20 45 78 70 72 53  arm;.      ExprS
f790: 65 74 49 72 72 65 64 75 63 69 62 6c 65 28 70 45  etIrreducible(pE
f7a0: 78 70 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  xpr);.      brea
f7b0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
f7c0: 69 66 28 20 74 65 73 74 41 64 64 72 3e 3d 30 20  if( testAddr>=0 
f7d0: 29 7b 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 74 65  beJumpHere(v, te
f7f0: 73 74 41 64 64 72 29 3b 0a 20 20 7d 0a 20 20 73  stAddr);.  }.  s
f800: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
f810: 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 0a  op(pParse, 1);..
f820: 20 20 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d    return rReg;.}
f830: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
f840: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
f850: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
f860: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
f870: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
f880: 63 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e 20 65  code for an IN e
f890: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
f8a0: 20 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45        x IN (SELE
f8b0: 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20 20  CT ...).**      
f8c0: 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c  x IN (value, val
f8d0: 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54  ue, ...).**.** T
f8e0: 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64  he left-hand sid
f8f0: 65 20 28 4c 48 53 29 20 69 73 20 61 20 73 63 61  e (LHS) is a sca
f900: 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  lar expression. 
f910: 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
f920: 73 69 64 65 20 28 52 48 53 29 0a 2a 2a 20 69 73  side (RHS).** is
f930: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72   an array of zer
f940: 6f 20 6f 72 20 6d 6f 72 65 20 76 61 6c 75 65 73  o or more values
f950: 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  .  The expressio
f960: 6e 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  n is true if the
f970: 20 4c 48 53 20 69 73 0a 2a 2a 20 63 6f 6e 74 61   LHS is.** conta
f980: 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ined within the 
f990: 52 48 53 2e 20 20 54 68 65 20 76 61 6c 75 65 20  RHS.  The value 
f9a0: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
f9b0: 6e 20 69 73 20 75 6e 6b 6e 6f 77 6e 20 28 4e 55  n is unknown (NU
f9c0: 4c 4c 29 0a 2a 2a 20 69 66 20 74 68 65 20 4c 48  LL).** if the LH
f9d0: 53 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20  S is NULL or if 
f9e0: 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 63  the LHS is not c
f9f0: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
fa00: 74 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 0a  the RHS and the.
fa10: 2a 2a 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20  ** RHS contains 
fa20: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c  one or more NULL
fa30: 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54   values..**.** T
fa40: 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
fa50: 72 61 74 65 73 20 63 6f 64 65 20 77 69 6c 6c 20  rates code will 
fa60: 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66 46 61  jump to destIfFa
fa70: 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  lse if the LHS i
fa80: 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69  s not .** contai
fa90: 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52  ned within the R
faa0: 48 53 2e 20 20 49 66 20 64 75 65 20 74 6f 20 4e  HS.  If due to N
fab0: 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20 64  ULLs we cannot d
fac0: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
fad0: 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69  LHS.** is contai
fae0: 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 74  ned in the RHS t
faf0: 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73 74  hen jump to dest
fb00: 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 20  IfNull.  If the 
fb10: 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  LHS is contained
fb20: 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 52  .** within the R
fb30: 48 53 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72  HS then fall thr
fb40: 6f 75 67 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ough..*/.static 
fb50: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
fb60: 43 6f 64 65 49 4e 28 0a 20 20 50 61 72 73 65 20  CodeIN(.  Parse 
fb70: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
fb80: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
fb90: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
fba0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
fbb0: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
fbc0: 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78 70 72    /* The IN expr
fbd0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
fbe0: 64 65 73 74 49 66 46 61 6c 73 65 2c 20 20 20 20  destIfFalse,    
fbf0: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
fc00: 66 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e  f LHS is not con
fc10: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48  tained in the RH
fc20: 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49  S */.  int destI
fc30: 66 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20  fNull        /* 
fc40: 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65  Jump here if the
fc50: 20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 6b   results are unk
fc60: 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c  nown due to NULL
fc70: 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52  s */.){.  int rR
fc80: 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20  hsHasNull = 0;  
fc90: 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74  /* Register that
fca0: 20 69 73 20 74 72 75 65 20 69 66 20 52 48 53 20   is true if RHS 
fcb0: 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61  contains NULL va
fcc0: 6c 75 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 61  lues */.  char a
fcd0: 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20  ffinity;        
fce0: 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 61 66  /* Comparison af
fcf0: 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20 2a 2f  finity to use */
fd00: 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20  .  int eType;   
fd10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65           /* Type
fd20: 20 6f 66 20 74 68 65 20 52 48 53 20 2a 2f 0a 20   of the RHS */. 
fd30: 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20   int r1;        
fd40: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
fd50: 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72  ary use register
fd60: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
fd70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
fd80: 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
fd90: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a  onstruction */..
fda0: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
fdb0: 20 52 48 53 2e 20 20 20 41 66 74 65 72 20 74 68   RHS.   After th
fdc0: 69 73 20 73 74 65 70 2c 20 74 68 65 20 74 61 62  is step, the tab
fdd0: 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 0a 20  le with cursor. 
fde0: 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   ** pExpr->iTabl
fdf0: 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20  e will contains 
fe00: 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20  the values that 
fe10: 6d 61 6b 65 20 75 70 20 74 68 65 20 52 48 53 2e  make up the RHS.
fe20: 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72  .  */.  v = pPar
fe30: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
fe40: 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20  ert( v!=0 );    
fe50: 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74     /* OOM detect
fe60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73  ed prior to this
fe70: 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64   routine */.  Vd
fe80: 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
fe90: 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78 70 72  , "begin IN expr
fea0: 22 29 29 3b 0a 20 20 65 54 79 70 65 20 3d 20 73  "));.  eType = s
feb0: 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
fec0: 78 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  x(pParse, pExpr,
fed0: 20 26 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a   &rRhsHasNull);.
fee0: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
fef0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f   the affinity to
ff00: 20 75 73 65 20 74 6f 20 63 72 65 61 74 65 20 61   use to create a
ff10: 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65   key from the re
ff20: 73 75 6c 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68  sults.  ** of th
ff30: 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 61 66  e expression. af
ff40: 66 69 6e 69 74 79 53 74 72 20 73 74 6f 72 65 73  finityStr stores
ff50: 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67   a static string
ff60: 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0a 20 20   suitable for.  
ff70: 2a 2a 20 50 34 20 6f 66 20 4f 50 5f 4d 61 6b 65  ** P4 of OP_Make
ff80: 52 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 61  Record..  */.  a
ff90: 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72  ffinity = compar
ffa0: 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78  isonAffinity(pEx
ffb0: 70 72 29 3b 0a 0a 20 20 2f 2a 20 43 6f 64 65 20  pr);..  /* Code 
ffc0: 74 68 65 20 4c 48 53 2c 20 74 68 65 20 3c 65 78  the LHS, the <ex
ffd0: 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e  pr> from "<expr>
ffe0: 20 49 4e 20 28 2e 2e 2e 29 22 2e 0a 20 20 2a 2f   IN (...)"..  */
fff0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
10000 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
10010 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  .  r1 = sqlite3G
10020 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
10030 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
10040 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
10050 70 72 2d 3e 70 4c 65 66 74 2c 20 72 31 29 3b 0a  pr->pLeft, r1);.
10060 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 48 53  .  /* If the LHS
10070 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
10080 68 65 20 72 65 73 75 6c 74 20 69 73 20 65 69 74  he result is eit
10090 68 65 72 20 66 61 6c 73 65 20 6f 72 20 4e 55 4c  her false or NUL
100a0 4c 20 64 65 70 65 6e 64 69 6e 67 0a 20 20 2a 2a  L depending.  **
100b0 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68 65 20   on whether the 
100c0 52 48 53 20 69 73 20 65 6d 70 74 79 20 6f 72 20  RHS is empty or 
100d0 6e 6f 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c  not, respectivel
100e0 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  y..  */.  if( de
100f0 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66  stIfNull==destIf
10100 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 2f 2a 20  False ){.    /* 
10110 53 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65  Shortcut for the
10120 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
10130 72 65 20 74 68 65 20 66 61 6c 73 65 20 61 6e 64  re the false and
10140 20 4e 55 4c 4c 20 6f 75 74 63 6f 6d 65 73 20 61   NULL outcomes a
10150 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61  re.    ** the sa
10160 6d 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  me. */.    sqlit
10170 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10180 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 64  OP_IsNull, r1, d
10190 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65  estIfNull);.  }e
101a0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  lse{.    int add
101b0 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
101c0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp1(v, OP_Not
101d0 4e 75 6c 6c 2c 20 72 31 29 3b 0a 20 20 20 20 73  Null, r1);.    s
101e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
101f0 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70  (v, OP_Rewind, p
10200 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
10210 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
10220 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10230 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
10240 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
10250 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
10260 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
10270 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70  .  }..  if( eTyp
10280 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49  e==IN_INDEX_ROWI
10290 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  D ){.    /* In t
102a0 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48  his case, the RH
102b0 53 20 69 73 20 74 68 65 20 52 4f 57 49 44 20 6f  S is the ROWID o
102c0 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65 0a 20  f table b-tree. 
102d0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
102e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
102f0 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 31 2c  P_MustBeInt, r1,
10300 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
10310 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10320 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78  dOp3(v, OP_NotEx
10330 69 73 74 73 2c 20 70 45 78 70 72 2d 3e 69 54 61  ists, pExpr->iTa
10340 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65  ble, destIfFalse
10350 2c 20 72 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  , r1);.  }else{.
10360 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
10370 61 73 65 2c 20 74 68 65 20 52 48 53 20 69 73 20  ase, the RHS is 
10380 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e  an index b-tree.
10390 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
103a0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
103b0 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 72 31   OP_Affinity, r1
103c0 2c 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74  , 1, 0, &affinit
103d0 79 2c 20 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  y, 1);..    /* I
103e0 66 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72  f the set member
103f0 73 68 69 70 20 74 65 73 74 20 66 61 69 6c 73 2c  ship test fails,
10400 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
10410 20 6f 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   of the .    ** 
10420 22 78 20 49 4e 20 28 2e 2e 2e 29 22 20 65 78 70  "x IN (...)" exp
10430 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20  ression must be 
10440 65 69 74 68 65 72 20 30 20 6f 72 20 4e 55 4c 4c  either 0 or NULL
10450 2e 20 49 66 20 74 68 65 20 73 65 74 0a 20 20 20  . If the set.   
10460 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   ** contains no 
10470 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65  NULL values, the
10480 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  n the result is 
10490 30 2e 20 49 66 20 74 68 65 20 73 65 74 20 0a 20  0. If the set . 
104a0 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6f     ** contains o
104b0 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20  ne or more NULL 
104c0 76 61 6c 75 65 73 2c 20 74 68 65 6e 20 74 68 65  values, then the
104d0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20   result of the. 
104e0 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
104f0 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 20   is also NULL.. 
10500 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 52     */.    if( rR
10510 68 73 48 61 73 4e 75 6c 6c 3d 3d 30 20 7c 7c 20  hsHasNull==0 || 
10520 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73  destIfFalse==des
10530 74 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  tIfNull ){.     
10540 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
10550 72 75 6e 73 20 69 66 20 69 74 20 69 73 20 6b 6e  runs if it is kn
10560 6f 77 6e 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  own at compile t
10570 69 6d 65 20 74 68 61 74 20 74 68 65 20 52 48 53  ime that the RHS
10580 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74  .      ** cannot
10590 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 20 76 61   contain NULL va
105a0 6c 75 65 73 2e 20 54 68 69 73 20 68 61 70 70 65  lues. This happe
105b0 6e 73 20 61 73 20 74 68 65 20 72 65 73 75 6c 74  ns as the result
105c0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 22  .      ** of a "
105d0 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72  NOT NULL" constr
105e0 61 69 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61  aint in the data
105f0 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20  base schema..   
10600 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41     **.      ** A
10610 6c 73 6f 20 72 75 6e 20 74 68 69 73 20 62 72 61  lso run this bra
10620 6e 63 68 20 69 66 20 4e 55 4c 4c 20 69 73 20 65  nch if NULL is e
10630 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 46 41 4c  quivalent to FAL
10640 53 45 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  SE.      ** for 
10650 74 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20  this particular 
10660 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20  IN operator..   
10670 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
10680 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
10690 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
106a0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
106b0 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31 2c  destIfFalse, r1,
106c0 20 31 29 3b 0a 0a 20 20 20 20 7d 65 6c 73 65 7b   1);..    }else{
106d0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  .      /* In thi
106e0 73 20 62 72 61 6e 63 68 2c 20 74 68 65 20 52 48  s branch, the RH
106f0 53 20 6f 66 20 74 68 65 20 49 4e 20 6d 69 67 68  S of the IN migh
10700 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c  t contain a NULL
10710 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68   and.      ** th
10720 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 61 20  e presence of a 
10730 4e 55 4c 4c 20 6f 6e 20 74 68 65 20 52 48 53 20  NULL on the RHS 
10740 6d 61 6b 65 73 20 61 20 64 69 66 66 65 72 65 6e  makes a differen
10750 63 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ce in the.      
10760 2a 2a 20 6f 75 74 63 6f 6d 65 2e 0a 20 20 20 20  ** outcome..    
10770 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a    */.      int j
10780 31 2c 20 6a 32 2c 20 6a 33 3b 0a 0a 20 20 20 20  1, j2, j3;..    
10790 20 20 2f 2a 20 46 69 72 73 74 20 63 68 65 63 6b    /* First check
107a0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c   to see if the L
107b0 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  HS is contained 
107c0 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20  in the RHS.  If 
107d0 73 6f 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  so,.      ** the
107e0 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  n the presence o
107f0 66 20 4e 55 4c 4c 73 20 69 6e 20 74 68 65 20 52  f NULLs in the R
10800 48 53 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74  HS does not matt
10810 65 72 2c 20 73 6f 20 6a 75 6d 70 0a 20 20 20 20  er, so jump.    
10820 20 20 2a 2a 20 6f 76 65 72 20 61 6c 6c 20 6f 66    ** over all of
10830 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 66   the code that f
10840 6f 6c 6c 6f 77 73 2e 0a 20 20 20 20 20 20 2a 2f  ollows..      */
10850 0a 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69  .      j1 = sqli
10860 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
10870 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45  (v, OP_Found, pE
10880 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20  xpr->iTable, 0, 
10890 72 31 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 2f  r1, 1);..      /
108a0 2a 20 48 65 72 65 20 77 65 20 62 65 67 69 6e 20  * Here we begin 
108b0 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20  generating code 
108c0 74 68 61 74 20 72 75 6e 73 20 69 66 20 74 68 65  that runs if the
108d0 20 4c 48 53 20 69 73 20 6e 6f 74 0a 20 20 20 20   LHS is not.    
108e0 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77    ** contained w
108f0 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20  ithin the RHS.  
10900 47 65 6e 65 72 61 74 65 20 61 64 64 69 74 69 6f  Generate additio
10910 6e 61 6c 20 63 6f 64 65 20 74 68 61 74 0a 20 20  nal code that.  
10920 20 20 20 20 2a 2a 20 74 65 73 74 73 20 74 68 65      ** tests the
10930 20 52 48 53 20 66 6f 72 20 4e 55 4c 4c 73 2e 20   RHS for NULLs. 
10940 20 49 66 20 74 68 65 20 52 48 53 20 63 6f 6e 74   If the RHS cont
10950 61 69 6e 73 20 61 20 4e 55 4c 4c 20 74 68 65 6e  ains a NULL then
10960 0a 20 20 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74  .      ** jump t
10970 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49  o destIfNull.  I
10980 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 4e  f there are no N
10990 55 4c 4c 73 20 69 6e 20 74 68 65 20 52 48 53 20  ULLs in the RHS 
109a0 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6a 75  then.      ** ju
109b0 6d 70 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73  mp to destIfFals
109c0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
109d0 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64    j2 = sqlite3Vd
109e0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
109f0 6f 74 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e  otNull, rRhsHasN
10a00 75 6c 6c 29 3b 0a 20 20 20 20 20 20 6a 33 20 3d  ull);.      j3 =
10a10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10a20 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
10a30 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
10a40 2c 20 30 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c  , 0, rRhsHasNull
10a50 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
10a60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10a70 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c   OP_Integer, -1,
10a80 20 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20   rRhsHasNull);. 
10a90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10aa0 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 33 29 3b  JumpHere(v, j3);
10ab0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10ac0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
10ad0 64 64 49 6d 6d 2c 20 72 52 68 73 48 61 73 4e 75  ddImm, rRhsHasNu
10ae0 6c 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  ll, 1);.      sq
10af0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
10b00 65 28 76 2c 20 6a 32 29 3b 0a 0a 20 20 20 20 20  e(v, j2);..     
10b10 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
10b20 61 70 70 72 6f 70 72 69 61 74 65 20 74 61 72 67  appropriate targ
10b30 65 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  et depending on 
10b40 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20  whether or not. 
10b50 20 20 20 20 20 2a 2a 20 74 68 65 20 52 48 53 20       ** the RHS 
10b60 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 0a  contains a NULL.
10b70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
10b80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10b90 28 76 2c 20 4f 50 5f 49 66 2c 20 72 52 68 73 48  (v, OP_If, rRhsH
10ba0 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75  asNull, destIfNu
10bb0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
10bc0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10bd0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74  OP_Goto, 0, dest
10be0 49 66 46 61 6c 73 65 29 3b 0a 0a 20 20 20 20 20  IfFalse);..     
10bf0 20 2f 2a 20 54 68 65 20 4f 50 5f 46 6f 75 6e 64   /* The OP_Found
10c00 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
10c10 68 69 73 20 62 72 61 6e 63 68 20 6a 75 6d 70 73  his branch jumps
10c20 20 68 65 72 65 20 77 68 65 6e 20 74 72 75 65 2c   here when true,
10c30 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 75 73 69   .      ** causi
10c40 6e 67 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 49  ng the overall I
10c50 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  N expression eva
10c60 6c 75 61 74 69 6f 6e 20 74 6f 20 66 61 6c 6c 20  luation to fall 
10c70 74 68 72 6f 75 67 68 2e 0a 20 20 20 20 20 20 2a  through..      *
10c80 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
10c90 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
10ca0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
10cb0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
10cc0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
10cd0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
10ce0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c  CachePop(pParse,
10cf0 20 31 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65   1);.  VdbeComme
10d00 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65  nt((v, "end IN e
10d10 78 70 72 22 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  xpr"));.}.#endif
10d20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
10d30 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a  SUBQUERY */../*.
10d40 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 61 6e 20  ** Duplicate an 
10d50 38 2d 62 79 74 65 20 76 61 6c 75 65 0a 2a 2f 0a  8-byte value.*/.
10d60 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 75 70  static char *dup
10d70 38 62 79 74 65 73 28 56 64 62 65 20 2a 76 2c 20  8bytes(Vdbe *v, 
10d80 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e 29 7b  const char *in){
10d90 0a 20 20 63 68 61 72 20 2a 6f 75 74 20 3d 20 73  .  char *out = s
10da0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
10db0 77 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  w(sqlite3VdbeDb(
10dc0 76 29 2c 20 38 29 3b 0a 20 20 69 66 28 20 6f 75  v), 8);.  if( ou
10dd0 74 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  t ){.    memcpy(
10de0 6f 75 74 2c 20 69 6e 2c 20 38 29 3b 0a 20 20 7d  out, in, 8);.  }
10df0 0a 20 20 72 65 74 75 72 6e 20 6f 75 74 3b 0a 7d  .  return out;.}
10e00 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10e10 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
10e20 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  OINT./*.** Gener
10e30 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69  ate an instructi
10e40 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74  on that will put
10e50 20 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f   the floating po
10e60 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73  int.** value des
10e70 63 72 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e  cribed by z[0..n
10e80 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65  -1] into registe
10e90 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  r iMem..**.** Th
10ea0 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c  e z[] string wil
10eb0 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62  l probably not b
10ec0 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  e zero-terminate
10ed0 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20  d.  But the .** 
10ee0 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69  z[n] character i
10ef0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
10f00 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61  be something tha
10f10 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a  t does not look.
10f20 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74  ** like the cont
10f30 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  inuation of the 
10f40 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  number..*/.stati
10f50 63 20 76 6f 69 64 20 63 6f 64 65 52 65 61 6c 28  c void codeReal(
10f60 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63  Vdbe *v, const c
10f70 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61  har *z, int nega
10f80 74 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d  teFlag, int iMem
10f90 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ){.  if( ALWAYS(
10fa0 7a 21 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f 75  z!=0) ){.    dou
10fb0 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 63  ble value;.    c
10fc0 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20 73 71 6c  har *zV;.    sql
10fd0 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c  ite3AtoF(z, &val
10fe0 75 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  ue, sqlite3Strle
10ff0 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55  n30(z), SQLITE_U
11000 54 46 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74  TF8);.    assert
11010 28 20 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28  ( !sqlite3IsNaN(
11020 76 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68 65  value) ); /* The
11030 20 6e 65 77 20 41 74 6f 46 20 6e 65 76 65 72 20   new AtoF never 
11040 72 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20  returns NaN */. 
11050 20 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61     if( negateFla
11060 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c  g ) value = -val
11070 75 65 3b 0a 20 20 20 20 7a 56 20 3d 20 64 75 70  ue;.    zV = dup
11080 38 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a  8bytes(v, (char*
11090 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 73 71  )&value);.    sq
110a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
110b0 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69  v, OP_Real, 0, i
110c0 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 52  Mem, 0, zV, P4_R
110d0 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  EAL);.  }.}.#end
110e0 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  if.../*.** Gener
110f0 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69  ate an instructi
11100 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74  on that will put
11110 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73   the integer des
11120 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74  cribe by.** text
11130 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20   z[0..n-1] into 
11140 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a  register iMem..*
11150 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b  *.** Expr.u.zTok
11160 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55 54 46  en is always UTF
11170 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69  8 and zero-termi
11180 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  nated..*/.static
11190 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65   void codeIntege
111a0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
111b0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
111c0 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69  t negFlag, int i
111d0 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  Mem){.  Vdbe *v 
111e0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
111f0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
11200 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
11210 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  e ){.    int i =
11220 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65   pExpr->u.iValue
11230 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e  ;.    assert( i>
11240 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  =0 );.    if( ne
11250 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a  gFlag ) i = -i;.
11260 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11270 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
11280 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20  ger, i, iMem);. 
11290 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
112a0 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c 75 65  c;.    i64 value
112b0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
112c0 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a   *z = pExpr->u.z
112d0 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65 72  Token;.    asser
112e0 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63  t( z!=0 );.    c
112f0 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34   = sqlite3Atoi64
11300 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69  (z, &value, sqli
11310 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20  te3Strlen30(z), 
11320 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
11330 20 20 69 66 28 20 63 3d 3d 30 20 7c 7c 20 28 63    if( c==0 || (c
11340 3d 3d 32 20 26 26 20 6e 65 67 46 6c 61 67 29 20  ==2 && negFlag) 
11350 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
11360 56 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67  V;.      if( neg
11370 46 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20  Flag ){ value = 
11380 63 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45 53 54 5f  c==2 ? SMALLEST_
11390 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20  INT64 : -value; 
113a0 7d 0a 20 20 20 20 20 20 7a 56 20 3d 20 64 75 70  }.      zV = dup
113b0 38 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a  8bytes(v, (char*
113c0 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  )&value);.      
113d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
113e0 34 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30  4(v, OP_Int64, 0
113f0 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50  , iMem, 0, zV, P
11400 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65  4_INT64);.    }e
11410 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  lse{.#ifdef SQLI
11420 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
11430 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c  _POINT.      sql
11440 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11450 72 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20  rse, "oversized 
11460 69 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20  integer: %s%s", 
11470 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20  negFlag ? "-" : 
11480 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 20 20  "", z);.#else.  
11490 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
114a0 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d  z, negFlag, iMem
114b0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
114c0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65    }.}../*.** Cle
114d0 61 72 20 61 20 63 61 63 68 65 20 65 6e 74 72 79  ar a cache entry
114e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
114f0 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
11500 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
11510 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
11520 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74   *p){.  if( p->t
11530 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66  empReg ){.    if
11540 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  ( pParse->nTempR
11550 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61  eg<ArraySize(pPa
11560 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29  rse->aTempReg) )
11570 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
11580 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d  aTempReg[pParse-
11590 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70  >nTempReg++] = p
115a0 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20  ->iReg;.    }.  
115b0 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
115c0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
115d0 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 63 6f  Record in the co
115e0 6c 75 6d 6e 20 63 61 63 68 65 20 74 68 61 74 20  lumn cache that 
115f0 61 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6c  a particular col
11600 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61  umn from a.** pa
11610 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 20 69  rticular table i
11620 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 70 61  s stored in a pa
11630 72 74 69 63 75 6c 61 72 20 72 65 67 69 73 74 65  rticular registe
11640 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
11650 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
11660 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
11670 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 69 43  int iTab, int iC
11680 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  ol, int iReg){. 
11690 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69   int i;.  int mi
116a0 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c  nLru;.  int idxL
116b0 72 75 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f  ru;.  struct yCo
116c0 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 61 73  lCache *p;..  as
116d0 73 65 72 74 28 20 69 52 65 67 3e 30 20 29 3b 20  sert( iReg>0 ); 
116e0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 6e 75 6d   /* Register num
116f0 62 65 72 73 20 61 72 65 20 61 6c 77 61 79 73 20  bers are always 
11700 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 61 73  positive */.  as
11710 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26  sert( iCol>=-1 &
11720 26 20 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20  & iCol<32768 ); 
11730 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d   /* Finite colum
11740 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20  n numbers */..  
11750 2f 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 43 6f  /* The SQLITE_Co
11760 6c 75 6d 6e 43 61 63 68 65 20 66 6c 61 67 20 64  lumnCache flag d
11770 69 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 75  isables the colu
11780 6d 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  mn cache.  This 
11790 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72  is used.  ** for
117a0 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20   testing only - 
117b0 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 53  to verify that S
117c0 51 4c 69 74 65 20 61 6c 77 61 79 73 20 67 65 74  QLite always get
117d0 73 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  s the same answe
117e0 72 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 64 20  r.  ** with and 
117f0 77 69 74 68 6f 75 74 20 74 68 65 20 63 6f 6c 75  without the colu
11800 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20  mn cache..  */. 
11810 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
11820 6e 44 69 73 61 62 6c 65 64 28 70 50 61 72 73 65  nDisabled(pParse
11830 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c  ->db, SQLITE_Col
11840 75 6d 6e 43 61 63 68 65 29 20 29 20 72 65 74 75  umnCache) ) retu
11850 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20  rn;..  /* First 
11860 72 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73  replace any exis
11870 74 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a  ting entry..  **
11880 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20  .  ** Actually, 
11890 74 68 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75  the way the colu
118a0 6d 6e 20 63 61 63 68 65 20 69 73 20 63 75 72 72  mn cache is curr
118b0 65 6e 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61  ently used, we a
118c0 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20  re guaranteed.  
118d0 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65  ** that the obje
118e0 63 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c  ct will never al
118f0 72 65 61 64 79 20 62 65 20 69 6e 20 63 61 63 68  ready be in cach
11900 65 2e 20 20 56 65 72 69 66 79 20 74 68 69 73 20  e.  Verify this 
11910 67 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a  guarantee..  */.
11920 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
11930 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
11940 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
11950 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
11960 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
11970 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 52     assert( p->iR
11980 65 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61 62  eg==0 || p->iTab
11990 6c 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69  le!=iTab || p->i
119a0 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a  Column!=iCol );.
119b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
119c0 20 46 69 6e 64 20 61 6e 20 65 6d 70 74 79 20 73   Find an empty s
119d0 6c 6f 74 20 61 6e 64 20 72 65 70 6c 61 63 65 20  lot and replace 
119e0 69 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  it */.  for(i=0,
119f0 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
11a00 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
11a10 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
11a20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
11a30 3e 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  >iReg==0 ){.    
11a40 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50    p->iLevel = pP
11a50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
11a60 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 54 61 62  l;.      p->iTab
11a70 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20  le = iTab;.     
11a80 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43   p->iColumn = iC
11a90 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65  ol;.      p->iRe
11aa0 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 20 20  g = iReg;.      
11ab0 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a  p->tempReg = 0;.
11ac0 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70        p->lru = p
11ad0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74  Parse->iCacheCnt
11ae0 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
11af0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
11b00 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 6c 61  * Replace the la
11b10 73 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64  st recently used
11b20 20 2a 2f 0a 20 20 6d 69 6e 4c 72 75 20 3d 20 30   */.  minLru = 0
11b30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 69 64 78  x7fffffff;.  idx
11b40 4c 72 75 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28  Lru = -1;.  for(
11b50 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
11b60 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
11b70 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
11b80 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
11b90 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20  ( p->lru<minLru 
11ba0 29 7b 0a 20 20 20 20 20 20 69 64 78 4c 72 75 20  ){.      idxLru 
11bb0 3d 20 69 3b 0a 20 20 20 20 20 20 6d 69 6e 4c 72  = i;.      minLr
11bc0 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20  u = p->lru;.    
11bd0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 41 4c 57 41  }.  }.  if( ALWA
11be0 59 53 28 69 64 78 4c 72 75 3e 3d 30 29 20 29 7b  YS(idxLru>=0) ){
11bf0 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72 73 65  .    p = &pParse
11c00 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c  ->aColCache[idxL
11c10 72 75 5d 3b 0a 20 20 20 20 70 2d 3e 69 4c 65 76  ru];.    p->iLev
11c20 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  el = pParse->iCa
11c30 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 70 2d  cheLevel;.    p-
11c40 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a  >iTable = iTab;.
11c50 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d      p->iColumn =
11c60 20 69 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 52   iCol;.    p->iR
11c70 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 70  eg = iReg;.    p
11c80 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  ->tempReg = 0;. 
11c90 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72     p->lru = pPar
11ca0 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b  se->iCacheCnt++;
11cb0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
11cc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  .}../*.** Indica
11cd0 74 65 20 74 68 61 74 20 72 65 67 69 73 74 65 72  te that register
11ce0 73 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e 2e  s between iReg..
11cf0 69 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65 20  iReg+nReg-1 are 
11d00 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65  being overwritte
11d10 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20  n..** Purge the 
11d20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65  range of registe
11d30 72 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75  rs from the colu
11d40 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69  mn cache..*/.voi
11d50 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
11d60 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20 2a  heRemove(Parse *
11d70 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
11d80 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
11d90 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 4c 61 73  nt i;.  int iLas
11da0 74 20 3d 20 69 52 65 67 20 2b 20 6e 52 65 67 20  t = iReg + nReg 
11db0 2d 20 31 3b 0a 20 20 73 74 72 75 63 74 20 79 43  - 1;.  struct yC
11dc0 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f  olCache *p;.  fo
11dd0 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
11de0 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
11df0 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
11e00 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
11e10 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b  int r = p->iReg;
11e20 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 52 65 67  .    if( r>=iReg
11e30 20 26 26 20 72 3c 3d 69 4c 61 73 74 20 29 7b 0a   && r<=iLast ){.
11e40 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79        cacheEntry
11e50 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29  Clear(pParse, p)
11e60 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  ;.      p->iReg 
11e70 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
11e80 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72  ../*.** Remember
11e90 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c   the current col
11ea0 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65 78  umn cache contex
11eb0 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74 72  t.  Any new entr
11ec0 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64 64  ies added.** add
11ed0 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  ed to the column
11ee0 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
11ef0 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76  s call are remov
11f00 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63  ed when the.** c
11f10 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70  orresponding pop
11f20 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64   occurs..*/.void
11f30 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
11f40 65 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61  ePush(Parse *pPa
11f50 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e  rse){.  pParse->
11f60 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 7d  iCacheLevel++;.}
11f70 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66  ../*.** Remove f
11f80 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  rom the column c
11f90 61 63 68 65 20 61 6e 79 20 65 6e 74 72 69 65 73  ache any entries
11fa0 20 74 68 61 74 20 77 65 72 65 20 61 64 64 65 64   that were added
11fb0 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68   since the.** th
11fc0 65 20 70 72 65 76 69 6f 75 73 20 4e 20 50 75 73  e previous N Pus
11fd0 68 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 49  h operations.  I
11fe0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
11ff0 65 73 74 6f 72 65 20 74 68 65 20 63 61 63 68 65  estore the cache
12000 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 74 65  .** to the state
12010 20 69 74 20 77 61 73 20 69 6e 20 4e 20 50 75 73   it was in N Pus
12020 68 65 73 20 61 67 6f 2e 0a 2a 2f 0a 76 6f 69 64  hes ago..*/.void
12030 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
12040 65 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72  ePop(Parse *pPar
12050 73 65 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e  se, int N){.  in
12060 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
12070 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 61 73  olCache *p;.  as
12080 73 65 72 74 28 20 4e 3e 30 20 29 3b 0a 20 20 61  sert( N>0 );.  a
12090 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69  ssert( pParse->i
120a0 43 61 63 68 65 4c 65 76 65 6c 3e 3d 4e 20 29 3b  CacheLevel>=N );
120b0 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  .  pParse->iCach
120c0 65 4c 65 76 65 6c 20 2d 3d 20 4e 3b 0a 20 20 66  eLevel -= N;.  f
120d0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
120e0 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
120f0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
12100 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
12110 20 69 66 28 20 70 2d 3e 69 52 65 67 20 26 26 20   if( p->iReg && 
12120 70 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65  p->iLevel>pParse
12130 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b  ->iCacheLevel ){
12140 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72  .      cacheEntr
12150 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70  yClear(pParse, p
12160 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67  );.      p->iReg
12170 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
12180 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20  }../*.** When a 
12190 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73  cached column is
121a0 20 72 65 75 73 65 64 2c 20 6d 61 6b 65 20 73 75   reused, make su
121b0 72 65 20 74 68 61 74 20 69 74 73 20 72 65 67 69  re that its regi
121c0 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f  ster is.** no lo
121d0 6e 67 65 72 20 61 76 61 69 6c 61 62 6c 65 20 61  nger available a
121e0 73 20 61 20 74 65 6d 70 20 72 65 67 69 73 74 65  s a temp registe
121f0 72 2e 20 20 74 69 63 6b 65 74 20 23 33 38 37 39  r.  ticket #3879
12200 3a 20 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20  :  that same.** 
12210 72 65 67 69 73 74 65 72 20 6d 69 67 68 74 20 62  register might b
12220 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 69  e in the cache i
12230 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65  n multiple place
12240 73 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f  s, so be sure to
12250 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20 61 6c 6c  .** get them all
12260 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12270 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
12280 65 50 69 6e 52 65 67 69 73 74 65 72 28 50 61 72  ePinRegister(Par
12290 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
122a0 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iReg){.  int i;.
122b0 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
122c0 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30  he *p;.  for(i=0
122d0 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
122e0 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
122f0 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
12300 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
12310 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a  ->iReg==iReg ){.
12320 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67        p->tempReg
12330 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
12340 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
12350 65 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61 63  e code to extrac
12360 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
12370 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d  he iCol-th colum
12380 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2f  n of a table..*/
12390 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
123a0 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66  rCodeGetColumnOf
123b0 54 61 62 6c 65 28 0a 20 20 56 64 62 65 20 2a 76  Table(.  Vdbe *v
123c0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
123d0 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74  VDBE under const
123e0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62  ruction */.  Tab
123f0 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20  le *pTab,    /* 
12400 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  The table contai
12410 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 2a  ning the value *
12420 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c  /.  int iTabCur,
12430 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
12440 72 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65  r for this table
12450 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20   */.  int iCol, 
12460 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
12470 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20  f the column to 
12480 65 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74  extract */.  int
12490 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20   regOut      /* 
124a0 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  Extract the valu
124b0 64 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69  d into this regi
124c0 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ster */.){.  if(
124d0 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d   iCol<0 || iCol=
124e0 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a  =pTab->iPKey ){.
124f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12500 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
12510 64 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f  d, iTabCur, regO
12520 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ut);.  }else{.  
12530 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72    int op = IsVir
12540 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f  tual(pTab) ? OP_
12550 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c  VColumn : OP_Col
12560 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  umn;.    sqlite3
12570 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
12580 2c 20 69 54 61 62 43 75 72 2c 20 69 43 6f 6c 2c  , iTabCur, iCol,
12590 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20   regOut);.  }.  
125a0 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20  if( iCol>=0 ){. 
125b0 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
125c0 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c  Default(v, pTab,
125d0 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a   iCol, regOut);.
125e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
125f0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
12600 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65  will extract the
12610 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75   iColumn-th colu
12620 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65  mn from.** table
12630 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20   pTab and store 
12640 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
12650 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e 20   in a register. 
12660 20 41 6e 20 65 66 66 6f 72 74 0a 2a 2a 20 69 73   An effort.** is
12670 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20 74   made to store t
12680 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  he column value 
12690 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67  in register iReg
126a0 2c 20 62 75 74 20 74 68 69 73 20 69 73 0a 2a 2a  , but this is.**
126b0 20 6e 6f 74 20 67 75 61 72 61 6e 74 65 65 64 2e   not guaranteed.
126c0 20 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f    The location o
126d0 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  f the column val
126e0 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ue is returned..
126f0 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  **.** There must
12700 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73   be an open curs
12710 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69 54  or to pTab in iT
12720 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  able when this r
12730 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
12740 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e  led.  If iColumn
12750 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20  <0 then code is 
12760 67 65 6e 65 72 61 74 65 64 20 74 68 61 74 20 65  generated that e
12770 78 74 72 61 63 74 73 20 74 68 65 20 72 6f 77 69  xtracts the rowi
12780 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
12790 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
127a0 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  mn(.  Parse *pPa
127b0 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e  rse,   /* Parsin
127c0 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
127d0 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
127e0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
127f0 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69      /* Descripti
12800 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  on of the table 
12810 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 66  we are reading f
12820 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  rom */.  int iCo
12830 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64  lumn,     /* Ind
12840 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ex of the table 
12850 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20  column */.  int 
12860 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20  iTable,      /* 
12870 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  The cursor point
12880 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ing to the table
12890 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20   */.  int iReg, 
128a0 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
128b0 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
128c0 20 20 75 38 20 70 35 20 20 20 20 20 20 20 20 20    u8 p5         
128d0 20 20 20 2f 2a 20 50 35 20 76 61 6c 75 65 20 66     /* P5 value f
128e0 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2a 2f 0a  or OP_Column */.
128f0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
12900 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
12910 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
12920 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20  yColCache *p;.. 
12930 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
12940 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
12950 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
12960 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
12970 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3e 30     if( p->iReg>0
12980 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69   && p->iTable==i
12990 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c  Table && p->iCol
129a0 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a  umn==iColumn ){.
129b0 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70        p->lru = p
129c0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74  Parse->iCacheCnt
129d0 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
129e0 33 45 78 70 72 43 61 63 68 65 50 69 6e 52 65 67  3ExprCachePinReg
129f0 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 2d  ister(pParse, p-
12a00 3e 69 52 65 67 29 3b 0a 20 20 20 20 20 20 72 65  >iReg);.      re
12a10 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20  turn p->iReg;.  
12a20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73 65    }.  }  .  asse
12a30 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71  rt( v!=0 );.  sq
12a40 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
12a50 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c  ColumnOfTable(v,
12a60 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20 69   pTab, iTable, i
12a70 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20  Column, iReg);. 
12a80 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20 20 73   if( p5 ){.    s
12a90 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
12aa0 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d 65 6c  P5(v, p5);.  }el
12ab0 73 65 7b 20 20 20 0a 20 20 20 20 73 71 6c 69 74  se{   .    sqlit
12ac0 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
12ad0 28 70 50 61 72 73 65 2c 20 69 54 61 62 6c 65 2c  (pParse, iTable,
12ae0 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b   iColumn, iReg);
12af0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52  .  }.  return iR
12b00 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  eg;.}../*.** Cle
12b10 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61  ar all column ca
12b20 63 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a  che entries..*/.
12b30 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
12b40 43 61 63 68 65 43 6c 65 61 72 28 50 61 72 73 65  CacheClear(Parse
12b50 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74   *pParse){.  int
12b60 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
12b70 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f  lCache *p;..  fo
12b80 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
12b90 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
12ba0 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
12bb0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
12bc0 69 66 28 20 70 2d 3e 69 52 65 67 20 29 7b 0a 20  if( p->iReg ){. 
12bd0 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43       cacheEntryC
12be0 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b  lear(pParse, p);
12bf0 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d  .      p->iReg =
12c00 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
12c10 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68  ./*.** Record th
12c20 65 20 66 61 63 74 20 74 68 61 74 20 61 6e 20 61  e fact that an a
12c30 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68  ffinity change h
12c40 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 69  as occurred on i
12c50 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65  Count.** registe
12c60 72 73 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  rs starting with
12c70 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64   iStart..*/.void
12c80 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
12c90 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
12ca0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
12cb0 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69  nt iStart, int i
12cc0 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65  Count){.  sqlite
12cd0 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
12ce0 28 70 50 61 72 73 65 2c 20 69 53 74 61 72 74 2c  (pParse, iStart,
12cf0 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a   iCount);.}../*.
12d00 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
12d10 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74   to move content
12d20 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20   from registers 
12d30 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52  iFrom...iFrom+nR
12d40 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20  eg-1.** over to 
12d50 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e  iTo..iTo+nReg-1.
12d60 20 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e   Keep the column
12d70 20 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74   cache up-to-dat
12d80 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
12d90 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50  e3ExprCodeMove(P
12da0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
12db0 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
12dc0 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
12dd0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
12de0 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 61  ColCache *p;.  a
12df0 73 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54  ssert( iFrom>=iT
12e00 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b  o+nReg || iFrom+
12e10 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73  nReg<=iTo );.  s
12e20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
12e30 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
12e40 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20  OP_Move, iFrom, 
12e50 69 54 6f 2c 20 6e 52 65 67 2d 31 29 3b 0a 20 20  iTo, nReg-1);.  
12e60 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
12e70 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
12e80 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
12e90 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
12ea0 20 20 69 6e 74 20 78 20 3d 20 70 2d 3e 69 52 65    int x = p->iRe
12eb0 67 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 69 46  g;.    if( x>=iF
12ec0 72 6f 6d 20 26 26 20 78 3c 69 46 72 6f 6d 2b 6e  rom && x<iFrom+n
12ed0 52 65 67 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Reg ){.      p->
12ee0 69 52 65 67 20 2b 3d 20 69 54 6f 2d 69 46 72 6f  iReg += iTo-iFro
12ef0 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  m;.    }.  }.}..
12f00 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
12f10 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
12f20 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45  ined(SQLITE_COVE
12f30 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  RAGE_TEST)./*.**
12f40 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
12f50 61 6e 79 20 72 65 67 69 73 74 65 72 20 69 6e 20  any register in 
12f60 74 68 65 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e  the range iFrom.
12f70 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69 76 65 29  .iTo (inclusive)
12f80 0a 2a 2a 20 69 73 20 75 73 65 64 20 61 73 20 70  .** is used as p
12f90 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  art of the colum
12fa0 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54  n cache..**.** T
12fb0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
12fc0 73 65 64 20 77 69 74 68 69 6e 20 61 73 73 65 72  sed within asser
12fd0 74 28 29 20 61 6e 64 20 74 65 73 74 63 61 73 65  t() and testcase
12fe0 28 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a  () macros only.*
12ff0 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61  * and does not a
13000 70 70 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61  ppear in a norma
13010 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74  l build..*/.stat
13020 69 63 20 69 6e 74 20 75 73 65 64 41 73 43 6f 6c  ic int usedAsCol
13030 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a  umnCache(Parse *
13040 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f  pParse, int iFro
13050 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69  m, int iTo){.  i
13060 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
13070 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66  ColCache *p;.  f
13080 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
13090 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
130a0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
130b0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
130c0 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67   int r = p->iReg
130d0 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 46 72  ;.    if( r>=iFr
130e0 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29 20 72  om && r<=iTo ) r
130f0 65 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f  eturn 1;    /*NO
13100 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65  _TEST*/.  }.  re
13110 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
13120 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
13130 20 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45 52   || SQLITE_COVER
13140 41 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a  AGE_TEST */../*.
13150 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
13160 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e   into the curren
13170 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61  t Vdbe to evalua
13180 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  te the given.** 
13190 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74 74  expression.  Att
131a0 65 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74 68  empt to store th
131b0 65 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67  e results in reg
131c0 69 73 74 65 72 20 22 74 61 72 67 65 74 22 2e 0a  ister "target"..
131d0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  ** Return the re
131e0 67 69 73 74 65 72 20 77 68 65 72 65 20 72 65 73  gister where res
131f0 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 2e  ults are stored.
13200 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69 73  .**.** With this
13210 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65 20   routine, there 
13220 69 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 20  is no guarantee 
13230 74 68 61 74 20 72 65 73 75 6c 74 73 20 77 69 6c  that results wil
13240 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69  l.** be stored i
13250 6e 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  n target.  The r
13260 65 73 75 6c 74 20 6d 69 67 68 74 20 62 65 20 73  esult might be s
13270 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74  tored in some ot
13280 68 65 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  her.** register 
13290 69 66 20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69  if it is conveni
132a0 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54  ent to do so.  T
132b0 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
132c0 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63  ion.** must chec
132d0 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  k the return cod
132e0 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72  e and move the r
132f0 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20 64 65  esults to the de
13300 73 69 72 65 64 0a 2a 2a 20 72 65 67 69 73 74 65  sired.** registe
13310 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
13320 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
13330 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
13340 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
13350 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20  target){.  Vdbe 
13360 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
13370 62 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75  be;  /* The VM u
13380 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
13390 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  n */.  int op;  
133a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133b0 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62   /* The opcode b
133c0 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
133d0 69 6e 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67  int inReg = targ
133e0 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  et;       /* Res
133f0 75 6c 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72  ults stored in r
13400 65 67 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f  egister inReg */
13410 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
13420 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
13430 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65  If non-zero free
13440 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
13450 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
13460 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20  t regFree2 = 0; 
13470 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
13480 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73  n-zero free this
13490 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
134a0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c  ter */.  int r1,
134b0 20 72 32 2c 20 72 33 2c 20 72 34 3b 20 20 20 20   r2, r3, r4;    
134c0 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65     /* Various re
134d0 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a  gister numbers *
134e0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
134f0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a  = pParse->db; /*
13500 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
13510 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61  nnection */..  a
13520 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
13530 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73  && target<=pPars
13540 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28  e->nMem );.  if(
13550 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73   v==0 ){.    ass
13560 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
13570 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
13580 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
13590 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d   }..  if( pExpr=
135a0 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54  =0 ){.    op = T
135b0 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  K_NULL;.  }else{
135c0 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  .    op = pExpr-
135d0 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  >op;.  }.  switc
135e0 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
135f0 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
13600 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f   {.      AggInfo
13610 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78   *pAggInfo = pEx
13620 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20  pr->pAggInfo;.  
13630 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
13640 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26  fo_col *pCol = &
13650 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70  pAggInfo->aCol[p
13660 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20  Expr->iAgg];.   
13670 20 20 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f     if( !pAggInfo
13680 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a  ->directMode ){.
13690 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
136a0 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a  pCol->iMem>0 );.
136b0 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
136c0 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20  pCol->iMem;.    
136d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
136e0 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67 49   }else if( pAggI
136f0 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49  nfo->useSortingI
13700 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  dx ){.        sq
13710 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
13720 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41  v, OP_Column, pA
13730 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49  ggInfo->sortingI
13740 64 78 50 54 61 62 2c 0a 20 20 20 20 20 20 20 20  dxPTab,.        
13750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13760 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
13770 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65  terColumn, targe
13780 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
13790 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
137a0 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66   /* Otherwise, f
137b0 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68  all thru into th
137c0 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65  e TK_COLUMN case
137d0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   */.    }.    ca
137e0 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
137f0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
13800 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20  >iTable<0 ){.   
13810 20 20 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c       /* This onl
13820 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63  y happens when c
13830 6f 64 69 6e 67 20 63 68 65 63 6b 20 63 6f 6e 73  oding check cons
13840 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20  traints */.     
13850 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
13860 65 2d 3e 63 6b 42 61 73 65 3e 30 20 29 3b 0a 20  e->ckBase>0 );. 
13870 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70         inReg = p
13880 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20  Expr->iColumn + 
13890 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3b 0a  pParse->ckBase;.
138a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
138b0 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
138c0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
138d0 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45  olumn(pParse, pE
138e0 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20  xpr->pTab,.     
138f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13900 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
13910 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 45 78 70  r->iColumn, pExp
13920 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65  r->iTable, targe
13930 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
13940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13950 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 29 3b      pExpr->op2);
13960 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
13970 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
13980 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
13990 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74   {.      codeInt
139a0 65 67 65 72 28 70 50 61 72 73 65 2c 20 70 45 78  eger(pParse, pEx
139b0 70 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  pr, 0, target);.
139c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
139d0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
139e0 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
139f0 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54  POINT.    case T
13a00 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  K_FLOAT: {.     
13a10 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
13a20 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
13a30 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
13a40 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28  .      codeReal(
13a50 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  v, pExpr->u.zTok
13a60 65 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  en, 0, target);.
13a70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13a80 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
13a90 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
13aa0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
13ab0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
13ac0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
13ad0 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e) );.      sqli
13ae0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
13af0 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
13b00 74 61 72 67 65 74 2c 20 30 2c 20 70 45 78 70 72  target, 0, pExpr
13b10 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a  ->u.zToken, 0);.
13b20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13b30 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
13b40 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ULL: {.      sql
13b50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13b60 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
13b70 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65  rget);.      bre
13b80 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
13b90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c  f SQLITE_OMIT_BL
13ba0 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63  OB_LITERAL.    c
13bb0 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
13bc0 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
13bd0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
13be0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c  .      char *zBl
13bf0 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ob;.      assert
13c00 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
13c10 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
13c20 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
13c30 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
13c40 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20  .zToken[0]=='x' 
13c50 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  || pExpr->u.zTok
13c60 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20  en[0]=='X' );.  
13c70 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
13c80 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d  r->u.zToken[1]==
13c90 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20  '\'' );.      z 
13ca0 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  = &pExpr->u.zTok
13cb0 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d  en[2];.      n =
13cc0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
13cd0 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61  (z) - 1;.      a
13ce0 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27  ssert( z[n]=='\'
13cf0 27 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62  ' );.      zBlob
13d00 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42   = sqlite3HexToB
13d10 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65 44  lob(sqlite3VdbeD
13d20 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  b(v), z, n);.   
13d30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13d40 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c  dOp4(v, OP_Blob,
13d50 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c   n/2, target, 0,
13d60 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d   zBlob, P4_DYNAM
13d70 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  IC);.      break
13d80 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
13d90 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
13da0 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  BLE: {.      ass
13db0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
13dc0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
13dd0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
13de0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
13df0 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b  ->u.zToken!=0 );
13e00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13e10 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
13e20 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  ]!=0 );.      sq
13e30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13e40 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20  v, OP_Variable, 
13e50 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
13e60 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69  target);.      i
13e70 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  f( pExpr->u.zTok
13e80 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20  en[1]!=0 ){.    
13e90 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
13ea0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  r->u.zToken[0]==
13eb0 27 3f 27 20 0a 20 20 20 20 20 20 20 20 20 20 20  '?' .           
13ec0 20 20 7c 7c 20 73 74 72 63 6d 70 28 70 45 78 70    || strcmp(pExp
13ed0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61  r->u.zToken, pPa
13ee0 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72  rse->azVar[pExpr
13ef0 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30  ->iColumn-1])==0
13f00 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
13f10 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
13f20 76 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 61  v, -1, pParse->a
13f30 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  zVar[pExpr->iCol
13f40 75 6d 6e 2d 31 5d 2c 20 50 34 5f 53 54 41 54 49  umn-1], P4_STATI
13f50 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  C);.      }.    
13f60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
13f70 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
13f80 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52  TER: {.      inR
13f90 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  eg = pExpr->iTab
13fa0 6c 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  le;.      break;
13fb0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
13fc0 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 69  TK_AS: {.      i
13fd0 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
13fe0 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
13ff0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
14000 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
14010 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
14020 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14030 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65  IT_CAST.    case
14040 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20   TK_CAST: {.    
14050 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
14060 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20   of the form:   
14070 43 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f  CAST(pLeft AS to
14080 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ken) */.      in
14090 74 20 61 66 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20  t aff, to_op;.  
140a0 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
140b0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
140c0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
140d0 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
140e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
140f0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
14100 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
14110 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 66 66  ue) );.      aff
14120 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69   = sqlite3Affini
14130 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e  tyType(pExpr->u.
14140 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 74  zToken);.      t
14150 6f 5f 6f 70 20 3d 20 61 66 66 20 2d 20 53 51 4c  o_op = aff - SQL
14160 49 54 45 5f 41 46 46 5f 54 45 58 54 20 2b 20 4f  ITE_AFF_TEXT + O
14170 50 5f 54 6f 54 65 78 74 3b 0a 20 20 20 20 20 20  P_ToText;.      
14180 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
14190 50 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c 20 61  P_ToText    || a
141a0 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ff!=SQLITE_AFF_T
141b0 45 58 54 20 20 20 20 29 3b 0a 20 20 20 20 20 20  EXT    );.      
141c0 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
141d0 50 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20 61  P_ToBlob    || a
141e0 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff!=SQLITE_AFF_N
141f0 4f 4e 45 20 20 20 20 29 3b 0a 20 20 20 20 20 20  ONE    );.      
14200 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
14210 50 5f 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20 61  P_ToNumeric || a
14220 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff!=SQLITE_AFF_N
14230 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 20 20  UMERIC );.      
14240 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
14250 50 5f 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20 61  P_ToInt     || a
14260 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff!=SQLITE_AFF_I
14270 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20  NTEGER );.      
14280 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
14290 50 5f 54 6f 52 65 61 6c 20 20 20 20 7c 7c 20 61  P_ToReal    || a
142a0 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ff!=SQLITE_AFF_R
142b0 45 41 4c 20 20 20 20 29 3b 0a 20 20 20 20 20 20  EAL    );.      
142c0 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d  testcase( to_op=
142d0 3d 4f 50 5f 54 6f 54 65 78 74 20 29 3b 0a 20 20  =OP_ToText );.  
142e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f      testcase( to
142f0 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 29  _op==OP_ToBlob )
14300 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14310 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75  ( to_op==OP_ToNu
14320 6d 65 72 69 63 20 29 3b 0a 20 20 20 20 20 20 74  meric );.      t
14330 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d  estcase( to_op==
14340 4f 50 5f 54 6f 49 6e 74 20 29 3b 0a 20 20 20 20  OP_ToInt );.    
14350 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f    testcase( to_o
14360 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 29 3b 0a  p==OP_ToReal );.
14370 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21        if( inReg!
14380 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20  =target ){.     
14390 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
143a0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
143b0 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29  , inReg, target)
143c0 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  ;.        inReg 
143d0 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  = target;.      
143e0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
143f0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 74 6f 5f  dbeAddOp1(v, to_
14400 6f 70 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20  op, inReg);.    
14410 20 20 74 65 73 74 63 61 73 65 28 20 75 73 65 64    testcase( used
14420 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50  AsColumnCache(pP
14430 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52  arse, inReg, inR
14440 65 67 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  eg) );.      sql
14450 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
14460 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
14470 73 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20  se, inReg, 1);. 
14480 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14490 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
144a0 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a  TE_OMIT_CAST */.
144b0 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
144c0 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
144d0 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
144e0 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
144f0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
14500 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
14510 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
14520 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a  TK_LT==OP_Lt );.
14530 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14540 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20  _LE==OP_Le );.  
14550 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
14560 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20  T==OP_Gt );.    
14570 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d    assert( TK_GE=
14580 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Ge );.      
14590 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f  assert( TK_EQ==O
145a0 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Eq );.      as
145b0 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f  sert( TK_NE==OP_
145c0 4e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Ne );.      test
145d0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20  case( op==TK_LT 
145e0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
145f0 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a  e( op==TK_LE );.
14600 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14610 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20  op==TK_GT );.   
14620 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14630 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20  =TK_GE );.      
14640 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
14650 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _EQ );.      tes
14660 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45  tcase( op==TK_NE
14670 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
14680 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
14690 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
146a0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
146b0 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
146c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
146d0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
146e0 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
146f0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
14700 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
14710 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
14720 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
14730 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14740 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65      r1, r2, inRe
14750 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50  g, SQLITE_STOREP
14760 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  2);.      testca
14770 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
14780 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14790 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
147a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
147b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
147c0 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
147d0 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  _ISNOT: {.      
147e0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
147f0 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IS );.      tes
14800 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
14810 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  NOT );.      r1 
14820 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
14830 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
14840 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
14850 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
14860 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
14870 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
14880 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
14890 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
148a0 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29  op = (op==TK_IS)
148b0 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45   ? TK_EQ : TK_NE
148c0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
148d0 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
148e0 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
148f0 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
14900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
14910 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51  1, r2, inReg, SQ
14920 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 53  LITE_STOREP2 | S
14930 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
14940 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
14950 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
14960 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
14970 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
14980 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14990 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
149a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
149b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55  .    case TK_PLU
149c0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
149d0 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TAR:.    case TK
149e0 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65  _MINUS:.    case
149f0 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73   TK_REM:.    cas
14a00 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20  e TK_BITAND:.   
14a10 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a   case TK_BITOR:.
14a20 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53      case TK_SLAS
14a30 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  H:.    case TK_L
14a40 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20  SHIFT:.    case 
14a50 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20  TK_RSHIFT: .    
14a60 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20  case TK_CONCAT: 
14a70 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
14a80 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29  TK_AND==OP_And )
14a90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14aa0 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a  TK_OR==OP_Or );.
14ab0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14ac0 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b  _PLUS==OP_Add );
14ad0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
14ae0 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74  K_MINUS==OP_Subt
14af0 72 61 63 74 20 29 3b 0a 20 20 20 20 20 20 61 73  ract );.      as
14b00 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50  sert( TK_REM==OP
14b10 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20  _Remainder );.  
14b20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
14b30 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64  ITAND==OP_BitAnd
14b40 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14b50 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42  ( TK_BITOR==OP_B
14b60 69 74 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73  itOr );.      as
14b70 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d  sert( TK_SLASH==
14b80 4f 50 5f 44 69 76 69 64 65 20 29 3b 0a 20 20 20  OP_Divide );.   
14b90 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53     assert( TK_LS
14ba0 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65  HIFT==OP_ShiftLe
14bb0 66 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ft );.      asse
14bc0 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f  rt( TK_RSHIFT==O
14bd0 50 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b 0a  P_ShiftRight );.
14be0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14bf0 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63  _CONCAT==OP_Conc
14c00 61 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  at );.      test
14c10 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44  case( op==TK_AND
14c20 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14c30 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b  se( op==TK_OR );
14c40 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14c50 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a   op==TK_PLUS );.
14c60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14c70 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a  op==TK_MINUS );.
14c80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14c90 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20  op==TK_REM );.  
14ca0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
14cb0 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20  ==TK_BITAND );. 
14cc0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
14cd0 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20  p==TK_BITOR );. 
14ce0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
14cf0 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20  p==TK_SLASH );. 
14d00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
14d10 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a  p==TK_LSHIFT );.
14d20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14d30 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b  op==TK_RSHIFT );
14d40 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14d50 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29   op==TK_CONCAT )
14d60 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
14d70 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
14d80 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
14d90 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
14da0 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
14db0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
14dc0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
14dd0 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
14de0 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e2);.      sqlit
14df0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
14e00 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67  op, r2, r1, targ
14e10 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  et);.      testc
14e20 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
14e30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14e40 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
14e50 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
14e60 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
14e70 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20  K_UMINUS: {.    
14e80 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
14e90 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
14ea0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66      assert( pLef
14eb0 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
14ec0 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  Left->op==TK_INT
14ed0 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
14ee0 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72  codeInteger(pPar
14ef0 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61  se, pLeft, 1, ta
14f00 72 67 65 74 29 3b 0a 23 69 66 6e 64 65 66 20 53  rget);.#ifndef S
14f10 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
14f20 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20  ING_POINT.      
14f30 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d  }else if( pLeft-
14f40 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b  >op==TK_FLOAT ){
14f50 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14f60 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
14f70 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
14f80 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
14f90 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c 65   codeReal(v, pLe
14fa0 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c  ft->u.zToken, 1,
14fb0 20 74 61 72 67 65 74 29 3b 0a 23 65 6e 64 69 66   target);.#endif
14fc0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14fd0 20 20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d        regFree1 =
14fe0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
14ff0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
15000 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15010 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15020 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 31 29  _Integer, 0, r1)
15030 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
15040 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
15050 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
15060 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
15070 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e2);.        sql
15080 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
15090 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72  , OP_Subtract, r
150a0 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a  2, r1, target);.
150b0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
150c0 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
150d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
150e0 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20  nReg = target;. 
150f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15100 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  }.    case TK_BI
15110 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  TNOT:.    case T
15120 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61  K_NOT: {.      a
15130 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54  ssert( TK_BITNOT
15140 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20  ==OP_BitNot );. 
15150 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
15160 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20  NOT==OP_Not );. 
15170 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
15180 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a  p==TK_BITNOT );.
15190 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
151a0 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20  op==TK_NOT );.  
151b0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
151c0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
151d0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
151e0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
151f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
15200 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
15210 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67      inReg = targ
15220 65 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  et;.      sqlite
15230 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
15240 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20  p, r1, inReg);. 
15250 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15260 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
15270 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
15280 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
15290 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
152a0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53     assert( TK_IS
152b0 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  NULL==OP_IsNull 
152c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
152d0 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f   TK_NOTNULL==OP_
152e0 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20  NotNull );.     
152f0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
15300 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  K_ISNULL );.    
15310 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
15320 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
15330 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15340 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
15350 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ger, 1, target);
15360 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
15370 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
15380 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
15390 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
153a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
153b0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
153c0 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
153d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
153e0 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20  v, op, r1);.    
153f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15400 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
15410 2c 20 74 61 72 67 65 74 2c 20 2d 31 29 3b 0a 20  , target, -1);. 
15420 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15430 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
15440 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15450 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
15460 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20  K_AGG_FUNCTION: 
15470 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
15480 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  *pInfo = pExpr->
15490 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
154a0 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a  if( pInfo==0 ){.
154b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
154c0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
154d0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
154e0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
154f0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15500 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20  pParse, "misuse 
15510 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25 73  of aggregate: %s
15520 28 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ()", pExpr->u.zT
15530 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  oken);.      }el
15540 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65  se{.        inRe
15550 67 20 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  g = pInfo->aFunc
15560 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d  [pExpr->iAgg].iM
15570 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  em;.      }.    
15580 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
15590 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54     case TK_CONST
155a0 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61 73 65 20  _FUNC:.    case 
155b0 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  TK_FUNCTION: {. 
155c0 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
155d0 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c  Farg;       /* L
155e0 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ist of function 
155f0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
15600 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20     int nFarg;   
15610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
15620 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ber of function 
15630 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
15640 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
15650 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
15660 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69   function defini
15670 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  tion object */. 
15680 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20       int nId;   
15690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
156a0 65 6e 67 74 68 20 6f 66 20 74 68 65 20 66 75 6e  ength of the fun
156b0 63 74 69 6f 6e 20 6e 61 6d 65 20 69 6e 20 62 79  ction name in by
156c0 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  tes */.      con
156d0 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20  st char *zId;   
156e0 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74      /* The funct
156f0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ion name */.    
15700 20 20 69 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20    int constMask 
15710 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b  = 0;     /* Mask
15720 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
15730 75 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65 20  uments that are 
15740 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20  constant */.    
15750 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
15760 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
15770 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
15780 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64    u8 enc = ENC(d
15790 62 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  b);      /* The 
157a0 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73  text encoding us
157b0 65 64 20 62 79 20 74 68 69 73 20 64 61 74 61 62  ed by this datab
157c0 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c  ase */.      Col
157d0 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
157e0 20 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69      /* A collati
157f0 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a  ng sequence */..
15800 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
15810 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
15820 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
15830 63 74 29 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ct) );.      tes
15840 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f  tcase( op==TK_CO
15850 4e 53 54 5f 46 55 4e 43 20 29 3b 0a 20 20 20 20  NST_FUNC );.    
15860 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
15870 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  TK_FUNCTION );. 
15880 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
15890 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
158a0 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  r, EP_TokenOnly)
158b0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72   ){.        pFar
158c0 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  g = 0;.      }el
158d0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72  se{.        pFar
158e0 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  g = pExpr->x.pLi
158f0 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
15900 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20    nFarg = pFarg 
15910 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a  ? pFarg->nExpr :
15920 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
15930 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
15940 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
15950 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
15960 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a  zId = pExpr->u.z
15970 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 49 64  Token;.      nId
15980 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
15990 33 30 28 7a 49 64 29 3b 0a 20 20 20 20 20 20 70  30(zId);.      p
159a0 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
159b0 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49  dFunction(db, zI
159c0 64 2c 20 6e 49 64 2c 20 6e 46 61 72 67 2c 20 65  d, nId, nFarg, e
159d0 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  nc, 0);.      if
159e0 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pDef==0 ){.   
159f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
15a00 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
15a10 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20  known function: 
15a20 25 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 20 7a 49  %.*s()", nId, zI
15a30 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  d);.        brea
15a40 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
15a50 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 61 20 64    /* Attempt a d
15a60 69 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61  irect implementa
15a70 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c  tion of the buil
15a80 74 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28 29 20  t-in COALESCE() 
15a90 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e  and.      ** IFN
15aa0 55 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e  ULL() functions.
15ab0 20 20 54 68 69 73 20 61 76 6f 69 64 73 20 75 6e    This avoids un
15ac0 6e 65 63 65 73 73 61 72 79 20 65 76 61 6c 61 74  necessary evalat
15ad0 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ion of.      ** 
15ae0 61 72 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74  arguments past t
15af0 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c  he first non-NUL
15b00 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20  L argument..    
15b10 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
15b20 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  Def->flags & SQL
15b30 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43  ITE_FUNC_COALESC
15b40 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  E ){.        int
15b50 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20 73   endCoalesce = s
15b60 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
15b70 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
15b80 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 32  assert( nFarg>=2
15b90 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
15ba0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
15bb0 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  se, pFarg->a[0].
15bc0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
15bd0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
15be0 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a   i<nFarg; i++){.
15bf0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15c00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15c10 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65  P_NotNull, targe
15c20 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b  t, endCoalesce);
15c30 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
15c40 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
15c50 65 28 70 50 61 72 73 65 2c 20 74 61 72 67 65 74  e(pParse, target
15c60 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
15c70 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
15c80 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
15c90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
15ca0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
15cb0 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70  pFarg->a[i].pExp
15cc0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
15cd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
15ce0 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
15cf0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 1);.        }.
15d00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15d10 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
15d20 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b  v, endCoalesce);
15d30 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
15d40 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20        }...      
15d50 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20  if( pFarg ){.   
15d60 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
15d70 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
15d80 61 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 0a 20  arse, nFarg);.. 
15d90 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65         /* For le
15da0 6e 67 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f  ngth() and typeo
15db0 66 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 77 69  f() functions wi
15dc0 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75  th a column argu
15dd0 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a  ment,.        **
15de0 20 73 65 74 20 74 68 65 20 50 35 20 70 61 72 61   set the P5 para
15df0 6d 65 74 65 72 20 74 6f 20 74 68 65 20 4f 50 5f  meter to the OP_
15e00 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f  Column opcode to
15e10 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52   OPFLAG_LENGTHAR
15e20 47 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20  G.        ** or 
15e30 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
15e40 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 74   respectively, t
15e50 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73  o avoid unnecess
15e60 61 72 79 20 64 61 74 61 0a 20 20 20 20 20 20 20  ary data.       
15e70 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20   ** loading..   
15e80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
15e90 69 66 28 20 28 70 44 65 66 2d 3e 66 6c 61 67 73  if( (pDef->flags
15ea0 20 26 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f   & (SQLITE_FUNC_
15eb0 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46 55  LENGTH|SQLITE_FU
15ec0 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d 30 20 29  NC_TYPEOF))!=0 )
15ed0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65  {.          u8 e
15ee0 78 70 72 4f 70 3b 0a 20 20 20 20 20 20 20 20 20  xprOp;.         
15ef0 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d   assert( nFarg==
15f00 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  1 );.          a
15f10 73 73 65 72 74 28 20 70 46 61 72 67 2d 3e 61 5b  ssert( pFarg->a[
15f20 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  0].pExpr!=0 );. 
15f30 20 20 20 20 20 20 20 20 20 65 78 70 72 4f 70 20           exprOp 
15f40 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  = pFarg->a[0].pE
15f50 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20  xpr->op;.       
15f60 20 20 20 69 66 28 20 65 78 70 72 4f 70 3d 3d 54     if( exprOp==T
15f70 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72  K_COLUMN || expr
15f80 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  Op==TK_AGG_COLUM
15f90 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
15fa0 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
15fb0 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46  FUNC_LENGTH==OPF
15fc0 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b  LAG_LENGTHARG );
15fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
15fe0 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43  ert( SQLITE_FUNC
15ff0 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f  _TYPEOF==OPFLAG_
16000 54 59 50 45 4f 46 41 52 47 20 29 3b 0a 20 20 20  TYPEOFARG );.   
16010 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
16020 65 28 20 70 44 65 66 2d 3e 66 6c 61 67 73 3d 3d  e( pDef->flags==
16030 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47  SQLITE_FUNC_LENG
16040 54 48 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  TH );.          
16050 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45    pFarg->a[0].pE
16060 78 70 72 2d 3e 6f 70 32 20 3d 20 70 44 65 66 2d  xpr->op2 = pDef-
16070 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20  >flags;.        
16080 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20    }.        }.. 
16090 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
160a0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
160b0 73 65 29 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b  se);     /* Tick
160c0 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65 20  et 2ea2425d34be 
160d0 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
160e0 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
160f0 73 74 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  st(pParse, pFarg
16100 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r1, 1);.      
16110 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
16120 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
16130 3b 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65  ;   /* Ticket 2e
16140 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20  a2425d34be */.  
16150 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16160 20 20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20     r1 = 0;.     
16170 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
16180 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
16190 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73  BLE.      /* Pos
161a0 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74  sibly overload t
161b0 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74  he function if t
161c0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
161d0 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  t is.      ** a 
161e0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f  virtual table co
161f0 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  lumn..      **. 
16200 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69       ** For infi
16210 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b  x functions (LIK
16220 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c  E, GLOB, REGEXP,
16230 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20   and MATCH) use 
16240 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63  the.      ** sec
16250 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f  ond argument, no
16260 74 20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20  t the first, as 
16270 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
16280 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a  test to.      **
16290 20 73 65 65 20 69 66 20 69 74 20 69 73 20 61 20   see if it is a 
162a0 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74  column in a virt
162b0 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ual table.  This
162c0 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65   is done because
162d0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65  .      ** the le
162e0 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e  ft operand of in
162f0 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74  fix functions (t
16300 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61  he operand we wa
16310 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63  nt to.      ** c
16320 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69  ontrol overloadi
16330 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73 20 74  ng) ends up as t
16340 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
16350 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  nt to the.      
16360 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  ** function.  Th
16370 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20  e expression "A 
16380 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69 76  glob B" is equiv
16390 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20  alent to .      
163a0 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20  ** "glob(B,A).  
163b0 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74  We want to use t
163c0 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20  he A in "A glob 
163d0 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20  B" to test.     
163e0 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e   ** for function
163f0 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42   overloading.  B
16400 75 74 20 77 65 20 75 73 65 20 74 68 65 20 42 20  ut we use the B 
16410 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c  term in "glob(B,
16420 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  A)"..      */.  
16430 20 20 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32      if( nFarg>=2
16440 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67   && (pExpr->flag
16450 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63  s & EP_InfixFunc
16460 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  ) ){.        pDe
16470 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
16480 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
16490 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c  db, pDef, nFarg,
164a0 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78   pFarg->a[1].pEx
164b0 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  pr);.      }else
164c0 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a   if( nFarg>0 ){.
164d0 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
164e0 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f  qlite3VtabOverlo
164f0 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  adFunction(db, p
16500 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72  Def, nFarg, pFar
16510 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  g->a[0].pExpr);.
16520 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
16530 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
16540 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFarg; i++){.   
16550 20 20 20 20 20 69 66 28 20 69 3c 33 32 20 26 26       if( i<32 &&
16560 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
16570 6e 73 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b  nstant(pFarg->a[
16580 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
16590 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b         constMask
165a0 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20   |= (1<<i);.    
165b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
165c0 28 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26  ( (pDef->flags &
165d0 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
165e0 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70 43  DCOLL)!=0 && !pC
165f0 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oll ){.         
16600 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
16610 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
16620 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  se, pFarg->a[i].
16630 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
16640 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
16650 69 66 28 20 70 44 65 66 2d 3e 66 6c 61 67 73 20  if( pDef->flags 
16660 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
16670 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20  EDCOLL ){.      
16680 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
16690 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
166a0 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73  Coll; .        s
166b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
166c0 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
166d0 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a  0, 0, 0, (char *
166e0 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
166f0 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  EQ);.      }.   
16700 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16710 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74  dOp4(v, OP_Funct
16720 69 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20  ion, constMask, 
16730 72 31 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  r1, target,.    
16740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16750 20 20 20 20 28 63 68 61 72 2a 29 70 44 65 66 2c      (char*)pDef,
16760 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
16770 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
16780 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e  hangeP5(v, (u8)n
16790 46 61 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28  Farg);.      if(
167a0 20 6e 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20   nFarg ){.      
167b0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
167c0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
167d0 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20  , r1, nFarg);.  
167e0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
167f0 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
16800 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
16810 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
16820 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61  K_EXISTS:.    ca
16830 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
16840 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16850 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b  op==TK_EXISTS );
16860 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16870 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29   op==TK_SELECT )
16880 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  ;.      inReg = 
16890 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
168a0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
168b0 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  pr, 0, 0);.     
168c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
168d0 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
168e0 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
168f0 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56  False = sqlite3V
16900 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
16910 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49  .      int destI
16920 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56  fNull = sqlite3V
16930 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
16940 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16950 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
16960 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
16970 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
16980 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
16990 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61   pExpr, destIfFa
169a0 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  lse, destIfNull)
169b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
169c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
169d0 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67  Integer, 1, targ
169e0 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
169f0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
16a00 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  el(v, destIfFals
16a10 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
16a20 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16a30 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74  P_AddImm, target
16a40 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
16a50 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
16a60 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c  bel(v, destIfNul
16a70 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
16a80 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
16a90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
16aa0 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f  QUERY */...    /
16ab0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45  *.    **    x BE
16ac0 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20  TWEEN y AND z.  
16ad0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
16ae0 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
16af0 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  o.    **.    ** 
16b00 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a     x>=y AND x<=z
16b10 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58  .    **.    ** X
16b20 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
16b30 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20  xpr->pLeft..    
16b40 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69  ** Y is stored i
16b50 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
16b60 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20  a[0].pExpr..    
16b70 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69  ** Z is stored i
16b80 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
16b90 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20  a[1].pExpr..    
16ba0 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  */.    case TK_B
16bb0 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
16bc0 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
16bd0 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
16be0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
16bf0 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d  t_item *pLItem =
16c00 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
16c10 3e 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  >a;.      Expr *
16c20 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d  pRight = pLItem-
16c30 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 72  >pExpr;..      r
16c40 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
16c50 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
16c60 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
16c70 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
16c80 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
16c90 70 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  p(pParse, pRight
16ca0 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
16cb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
16cc0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
16cd0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
16ce0 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
16cf0 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65    r3 = sqlite3Ge
16d00 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
16d10 3b 0a 20 20 20 20 20 20 72 34 20 3d 20 73 71 6c  ;.      r4 = sql
16d20 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
16d30 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 63 6f  Parse);.      co
16d40 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
16d50 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
16d60 20 4f 50 5f 47 65 2c 0a 20 20 20 20 20 20 20 20   OP_Ge,.        
16d70 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
16d80 2c 20 72 33 2c 20 53 51 4c 49 54 45 5f 53 54 4f  , r3, SQLITE_STO
16d90 52 45 50 32 29 3b 0a 20 20 20 20 20 20 70 4c 49  REP2);.      pLI
16da0 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69  tem++;.      pRi
16db0 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45  ght = pLItem->pE
16dc0 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
16dd0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
16de0 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
16df0 32 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  2);.      r2 = s
16e00 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
16e10 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  mp(pParse, pRigh
16e20 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
16e30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
16e40 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
16e50 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
16e60 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
16e70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 72 31  Right, OP_Le, r1
16e80 2c 20 72 32 2c 20 72 34 2c 20 53 51 4c 49 54 45  , r2, r4, SQLITE
16e90 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20  _STOREP2);.     
16ea0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16eb0 70 33 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 72 33  p3(v, OP_And, r3
16ec0 2c 20 72 34 2c 20 74 61 72 67 65 74 29 3b 0a 20  , r4, target);. 
16ed0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
16ee0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
16ef0 65 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 73 71  e, r3);.      sq
16f00 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
16f10 52 65 67 28 70 50 61 72 73 65 2c 20 72 34 29 3b  Reg(pParse, r4);
16f20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16f30 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
16f40 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 69  UPLUS: {.      i
16f50 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
16f60 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
16f70 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
16f80 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
16f90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
16fa0 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47      case TK_TRIG
16fb0 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  GER: {.      /* 
16fc0 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73  If the opcode is
16fd0 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65   TK_TRIGGER, the
16fe0 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
16ff0 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a   is a reference.
17000 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f        ** to a co
17010 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e  lumn in the new.
17020 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64  * or old.* pseud
17030 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62  o-tables availab
17040 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  le to.      ** t
17050 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e  rigger programs.
17060 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 45 78   In this case Ex
17070 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74  pr.iTable is set
17080 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20   to 1 for the.  
17090 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65      ** new.* pse
170a0 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20  udo-table, or 0 
170b0 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73  for the old.* ps
170c0 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72  eudo-table. Expr
170d0 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a  .iColumn.      *
170e0 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
170f0 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73  column of the ps
17100 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65  eudo-table to re
17110 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a  ad, or to -1 to.
17120 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68        ** read th
17130 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20  e rowid field.. 
17140 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
17150 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
17160 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  is implemented u
17170 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d  sing an OP_Param
17180 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a   opcode. The p1.
17190 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74        ** paramet
171a0 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 66  er is set to 0 f
171b0 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20  or an old.rowid 
171c0 72 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f  reference, or to
171d0 20 28 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20   (i+1).      ** 
171e0 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f  to reference ano
171f0 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  ther column of t
17200 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  he old.* pseudo-
17210 74 61 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20  table, where .  
17220 20 20 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20      ** i is the 
17230 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  index of the col
17240 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72  umn. For a new.r
17250 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20  owid reference, 
17260 70 31 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73  p1 is.      ** s
17270 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65  et to (n+1), whe
17280 72 65 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  re n is the numb
17290 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
172a0 20 65 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62   each pseudo-tab
172b0 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72  le..      ** For
172c0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
172d0 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e  any other column
172e0 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73   in the new.* ps
172f0 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20  eudo-table, p1. 
17300 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74       ** is set t
17310 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65  o (n+2+i), where
17320 20 6e 20 61 6e 64 20 69 20 61 72 65 20 61 73 20   n and i are as 
17330 64 65 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73  defined previous
17340 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a  ly. For.      **
17350 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
17360 20 74 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20   table on which 
17370 74 72 69 67 67 65 72 73 20 61 72 65 20 62 65 69  triggers are bei
17380 6e 67 20 66 69 72 65 64 20 69 73 0a 20 20 20 20  ng fired is.    
17390 20 20 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73    ** declared as
173a0 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
173b0 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
173c0 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
173d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
173e0 68 65 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70  hen p1 is interp
173f0 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  reted as follows
17400 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
17410 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e   **   p1==0   ->
17420 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20      old.rowid   
17430 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20    p1==3   ->    
17440 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20  new.rowid.      
17450 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20  **   p1==1   -> 
17460 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20     old.a        
17470 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e   p1==4   ->    n
17480 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20  ew.a.      **   
17490 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==2   ->    ol
174a0 64 2e 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d  d.b         p1==
174b0 35 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20  5   ->    new.b 
174c0 20 20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a        .      */.
174d0 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
174e0 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b  b = pExpr->pTab;
174f0 0a 20 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20  .      int p1 = 
17500 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20  pExpr->iTable * 
17510 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b  (pTab->nCol+1) +
17520 20 31 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c   1 + pExpr->iCol
17530 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  umn;..      asse
17540 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt( pExpr->iTabl
17550 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69  e==0 || pExpr->i
17560 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20  Table==1 );.    
17570 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
17580 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20  >iColumn>=-1 && 
17590 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
175a0 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
175b0 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d     assert( pTab-
175c0 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70  >iPKey<0 || pExp
175d0 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62  r->iColumn!=pTab
175e0 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20 20 20  ->iPKey );.     
175f0 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26   assert( p1>=0 &
17600 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c  & p1<(pTab->nCol
17610 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20 20  *2+2) );..      
17620 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17630 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70  2(v, OP_Param, p
17640 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
17650 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
17660 2c 20 22 25 73 2e 25 73 20 2d 3e 20 24 25 64 22  , "%s.%s -> $%d"
17670 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72  ,.        (pExpr
17680 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e 65 77 22  ->iTable ? "new"
17690 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20   : "old"),.     
176a0 20 20 20 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75     (pExpr->iColu
176b0 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64 22 20 3a  mn<0 ? "rowid" :
176c0 20 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43   pExpr->pTab->aC
176d0 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ol[pExpr->iColum
176e0 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20  n].zName),.     
176f0 20 20 20 74 61 72 67 65 74 0a 20 20 20 20 20 20     target.      
17700 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ));..#ifndef SQL
17710 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
17720 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a  G_POINT.      /*
17730 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68   If the column h
17740 61 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79  as REAL affinity
17750 2c 20 69 74 20 6d 61 79 20 63 75 72 72 65 6e 74  , it may current
17760 6c 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ly be stored as 
17770 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  an.      ** inte
17780 67 65 72 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c  ger. Use OP_Real
17790 41 66 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65  Affinity to make
177a0 20 73 75 72 65 20 69 74 20 69 73 20 72 65 61 6c   sure it is real
177b0 6c 79 20 72 65 61 6c 2e 20 20 2a 2f 0a 20 20 20  ly real.  */.   
177c0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
177d0 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20  olumn>=0 .      
177e0 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70   && pTab->aCol[p
177f0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61  Expr->iColumn].a
17800 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
17810 41 46 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 29  AFF_REAL.      )
17820 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
17830 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
17840 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20  P_RealAffinity, 
17850 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
17860 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72  .#endif.      br
17870 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20  eak;.    }...   
17880 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20   /*.    ** Form 
17890 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45  A:.    **   CASE
178a0 20 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20   x WHEN e1 THEN 
178b0 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
178c0 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
178d0 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
178e0 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
178f0 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20  Form B:.    **  
17900 20 43 41 53 45 20 57 48 45 4e 20 65 31 20 54 48   CASE WHEN e1 TH
17910 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48  EN r1 WHEN e2 TH
17920 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65  EN r2 ... WHEN e
17930 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
17940 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
17950 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e  ** Form A is can
17960 20 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20   be transformed 
17970 69 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c  into the equival
17980 65 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f  ent form B as fo
17990 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20  llows:.    **   
179a0 43 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54  CASE WHEN x=e1 T
179b0 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32  HEN r1 WHEN x=e2
179c0 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20   THEN r2 ....   
179d0 20 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20   **        WHEN 
179e0 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  x=eN THEN rN ELS
179f0 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
17a00 20 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65     ** X (if it e
17a10 78 69 73 74 73 29 20 69 73 20 69 6e 20 70 45 78  xists) is in pEx
17a20 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
17a30 2a 20 59 20 69 73 20 69 6e 20 70 45 78 70 72 2d  * Y is in pExpr-
17a40 3e 70 52 69 67 68 74 2e 20 20 54 68 65 20 59 20  >pRight.  The Y 
17a50 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c  is also optional
17a60 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
17a70 6f 0a 20 20 20 20 2a 2a 20 45 4c 53 45 20 63 6c  o.    ** ELSE cl
17a80 61 75 73 65 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ause and no othe
17a90 72 20 74 65 72 6d 20 6d 61 74 63 68 65 73 2c 20  r term matches, 
17aa0 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
17ab0 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 78  of the.    ** ex
17ac0 70 72 73 73 69 6f 6e 20 69 73 20 4e 55 4c 4c 2e  prssion is NULL.
17ad0 0a 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e  .    ** Ei is in
17ae0 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
17af0 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20  [i*2] and Ri is 
17b00 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
17b10 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20  i*2+1]..    **. 
17b20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74     ** The result
17b30 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
17b40 6f 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f 72  on is the Ri for
17b50 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
17b60 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f  ing Ei,.    ** o
17b70 72 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  r if there is no
17b80 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68   matching Ei, th
17b90 65 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f  e ELSE term Y, o
17ba0 72 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  r if there is.  
17bb0 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72    ** no ELSE ter
17bc0 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a  m, NULL..    */.
17bd0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
17be0 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45  ert( op==TK_CASE
17bf0 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20   ); {.      int 
17c00 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20  endLabel;       
17c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17c20 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20   GOTO label for 
17c30 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74  end of CASE stmt
17c40 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65   */.      int ne
17c50 78 74 43 61 73 65 3b 20 20 20 20 20 20 20 20 20  xtCase;         
17c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
17c70 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65  OTO label for ne
17c80 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a  xt WHEN clause *
17c90 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70  /.      int nExp
17ca0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
17cb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20            /* 2x 
17cc0 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74  number of WHEN t
17cd0 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  erms */.      in
17ce0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
17cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d00 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
17d10 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
17d20 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
17d30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
17d40 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73  st of WHEN terms
17d50 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
17d60 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
17d70 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41  aListelem;  /* A
17d80 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72  rray of WHEN ter
17d90 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ms */.      Expr
17da0 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20   opCompare;     
17db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17dc0 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65   The X==Ei expre
17dd0 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ssion */.      E
17de0 78 70 72 20 63 61 63 68 65 58 3b 20 20 20 20 20  xpr cacheX;     
17df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e00 20 2f 2a 20 43 61 63 68 65 64 20 65 78 70 72 65   /* Cached expre
17e10 73 73 69 6f 6e 20 58 20 2a 2f 0a 20 20 20 20 20  ssion X */.     
17e20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20   Expr *pX;      
17e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e40 20 20 20 2f 2a 20 54 68 65 20 58 20 65 78 70 72     /* The X expr
17e50 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
17e60 45 78 70 72 20 2a 70 54 65 73 74 20 3d 20 30 3b  Expr *pTest = 0;
17e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e80 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d    /* X==Ei (form
17e90 20 41 29 20 6f 72 20 6a 75 73 74 20 45 69 20 28   A) or just Ei (
17ea0 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20  form B) */.     
17eb0 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69   VVA_ONLY( int i
17ec0 43 61 63 68 65 4c 65 76 65 6c 20 3d 20 70 50 61  CacheLevel = pPa
17ed0 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
17ee0 3b 20 29 0a 0a 20 20 20 20 20 20 61 73 73 65 72  ; )..      asser
17ef0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
17f00 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
17f10 73 53 65 6c 65 63 74 29 20 26 26 20 70 45 78 70  sSelect) && pExp
17f20 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20  r->x.pList );.  
17f30 20 20 20 20 61 73 73 65 72 74 28 28 70 45 78 70      assert((pExp
17f40 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
17f50 72 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20  r % 2) == 0);.  
17f60 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72      assert(pExpr
17f70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
17f80 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c   > 0);.      pEL
17f90 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
17fa0 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73  List;.      aLis
17fb0 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e  telem = pEList->
17fc0 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d  a;.      nExpr =
17fd0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
17fe0 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d        endLabel =
17ff0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
18000 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
18010 69 66 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d  if( (pX = pExpr-
18020 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20  >pLeft)!=0 ){.  
18030 20 20 20 20 20 20 63 61 63 68 65 58 20 3d 20 2a        cacheX = *
18040 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  pX;.        test
18050 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  case( pX->op==TK
18060 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
18070 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
18080 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
18090 20 29 3b 0a 20 20 20 20 20 20 20 20 63 61 63 68   );.        cach
180a0 65 58 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69  eX.iTable = sqli
180b0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
180c0 70 50 61 72 73 65 2c 20 70 58 2c 20 26 72 65 67  pParse, pX, &reg
180d0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
180e0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
180f0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e1==0 );.       
18100 20 63 61 63 68 65 58 2e 6f 70 20 3d 20 54 4b 5f   cacheX.op = TK_
18110 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20 20 20  REGISTER;.      
18120 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d    opCompare.op =
18130 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20   TK_EQ;.        
18140 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20  opCompare.pLeft 
18150 3d 20 26 63 61 63 68 65 58 3b 0a 20 20 20 20 20  = &cacheX;.     
18160 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f     pTest = &opCo
18170 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20 20 2f  mpare;.        /
18180 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64 39 35  * Ticket b351d95
18190 66 39 63 64 35 65 66 31 37 65 39 64 39 64 62 61  f9cd5ef17e9d9dba
181a0 65 31 38 66 35 63 61 38 36 31 31 31 39 30 30 30  e18f5ca861119000
181b0 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  1:.        ** Th
181c0 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 46 72  e value in regFr
181d0 65 65 31 20 6d 69 67 68 74 20 67 65 74 20 53 43  ee1 might get SC
181e0 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68 65 20  opy-ed into the 
181f0 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20 20  file result..   
18200 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20       ** So make 
18210 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65  sure that the re
18220 67 46 72 65 65 31 20 72 65 67 69 73 74 65 72 20  gFree1 register 
18230 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20 66 6f  is not reused fo
18240 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20  r other.        
18250 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e 64 20  ** purposes and 
18260 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77 72 69  possibly overwri
18270 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20  tten.  */.      
18280 20 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a    regFree1 = 0;.
18290 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
182a0 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20  r(i=0; i<nExpr; 
182b0 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20  i=i+2){.        
182c0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
182d0 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
182e0 20 20 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a        if( pX ){.
182f0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
18300 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20  ( pTest!=0 );.  
18310 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72          opCompar
18320 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74  e.pRight = aList
18330 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  elem[i].pExpr;. 
18340 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
18350 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20          pTest = 
18360 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78  aListelem[i].pEx
18370 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pr;.        }.  
18380 20 20 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d        nextCase =
18390 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
183a0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
183b0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 73    testcase( pTes
183c0 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
183d0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
183e0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
183f0 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65  Parse, pTest, ne
18400 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a  xtCase, SQLITE_J
18410 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
18420 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c      testcase( aL
18430 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78  istelem[i+1].pEx
18440 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
18450 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  N );.        tes
18460 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d  tcase( aListelem
18470 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d  [i+1].pExpr->op=
18480 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a  =TK_REGISTER );.
18490 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
184a0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
184b0 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
184c0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
184d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
184e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
184f0 6f 74 6f 2c 20 30 2c 20 65 6e 64 4c 61 62 65 6c  oto, 0, endLabel
18500 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
18510 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
18520 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20  Parse, 1);.     
18530 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
18540 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65  solveLabel(v, ne
18550 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d  xtCase);.      }
18560 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
18570 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ->pRight ){.    
18580 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
18590 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
185a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
185b0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
185c0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
185d0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
185e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
185f0 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
18600 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
18610 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18620 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
18630 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
18640 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
18650 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
18660 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
18670 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20 20  e->nErr>0 .     
18680 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d        || pParse-
18690 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43  >iCacheLevel==iC
186a0 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20  acheLevel );.   
186b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
186c0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
186d0 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62  dLabel);.      b
186e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
186f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18700 54 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65  TRIGGER.    case
18710 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20   TK_RAISE: {.   
18720 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
18730 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52  ->affinity==OE_R
18740 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20 20  ollback .       
18750 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66      || pExpr->af
18760 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74  finity==OE_Abort
18770 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
18780 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
18790 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20 20  OE_Fail.        
187a0 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
187b0 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65  inity==OE_Ignore
187c0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
187d0 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70 54 72  if( !pParse->pTr
187e0 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20  iggerTab ){.    
187f0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
18800 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
18810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18820 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20     "RAISE() may 
18830 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  only be used wit
18840 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72  hin a trigger-pr
18850 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20  ogram");.       
18860 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
18870 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   }.      if( pEx
18880 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
18890 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  _Abort ){.      
188a0 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
188b0 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  t(pParse);.     
188c0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
188d0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
188e0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
188f0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 69  alue) );.      i
18900 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  f( pExpr->affini
18910 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b  ty==OE_Ignore ){
18920 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18930 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20  VdbeAddOp4(.    
18940 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 48 61          v, OP_Ha
18950 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f  lt, SQLITE_OK, O
18960 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78  E_Ignore, 0, pEx
18970 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b  pr->u.zToken,0);
18980 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
18990 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c        sqlite3Hal
189a0 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  tConstraint(pPar
189b0 73 65 2c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  se, pExpr->affin
189c0 69 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ity, pExpr->u.zT
189d0 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  oken, 0);.      
189e0 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  }..      break;.
189f0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
18a00 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
18a10 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
18a20 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
18a30 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
18a40 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
18a50 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  ree2);.  return 
18a60 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  inReg;.}../*.** 
18a70 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
18a80 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70   evaluate an exp
18a90 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72  ression and stor
18aa0 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
18ab0 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72   into a register
18ac0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
18ad0 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68  gister number wh
18ae0 65 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ere the results.
18af0 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a  ** are stored..*
18b00 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69  *.** If the regi
18b10 73 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72  ster is a tempor
18b20 61 72 79 20 72 65 67 69 73 74 65 72 20 74 68 61  ary register tha
18b30 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63  t can be dealloc
18b40 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72  ated,.** then wr
18b50 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69  ite its number i
18b60 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74  nto *pReg.  If t
18b70 68 65 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  he result regist
18b80 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74  er is not.** a t
18b90 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73  emporary, then s
18ba0 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f  et *pReg to zero
18bb0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18bc0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72  ExprCodeTemp(Par
18bd0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
18be0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52   *pExpr, int *pR
18bf0 65 67 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20  eg){.  int r1 = 
18c00 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
18c10 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  g(pParse);.  int
18c20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
18c30 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
18c40 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a  se, pExpr, r1);.
18c50 20 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a    if( r2==r1 ){.
18c60 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a      *pReg = r1;.
18c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
18c80 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
18c90 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
18ca0 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20      *pReg = 0;. 
18cb0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32 3b 0a   }.  return r2;.
18cc0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
18cd0 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
18ce0 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73   evaluate expres
18cf0 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73  sion pExpr and s
18d00 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75  tore the.** resu
18d10 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
18d20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73  target.  The res
18d30 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74  ults are guarant
18d40 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a  eed to appear.**
18d50 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
18d60 67 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  get..*/.int sqli
18d70 74 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73  te3ExprCode(Pars
18d80 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
18d90 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
18da0 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67  et){.  int inReg
18db0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  ;..  assert( tar
18dc0 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c  get>0 && target<
18dd0 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b  =pParse->nMem );
18de0 0a 20 20 69 66 28 20 70 45 78 70 72 20 26 26 20  .  if( pExpr && 
18df0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45  pExpr->op==TK_RE
18e00 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20 73 71  GISTER ){.    sq
18e10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18e20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
18e30 50 5f 43 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69  P_Copy, pExpr->i
18e40 54 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a  Table, target);.
18e50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52    }else{.    inR
18e60 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
18e70 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
18e80 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
18e90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
18ea0 50 61 72 73 65 2d 3e 70 56 64 62 65 20 7c 7c 20  Parse->pVdbe || 
18eb0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
18ec0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
18ed0 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65  if( inReg!=targe
18ee0 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64  t && pParse->pVd
18ef0 62 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  be ){.      sqli
18f00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
18f10 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
18f20 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61  SCopy, inReg, ta
18f30 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rget);.    }.  }
18f40 0a 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74  .  return target
18f50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
18f60 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 65 76  ate code that ev
18f70 61 6c 75 74 65 73 20 74 68 65 20 67 69 76 65 6e  alutes the given
18f80 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
18f90 70 75 74 73 20 74 68 65 20 72 65 73 75 6c 74 0a  puts the result.
18fa0 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
18fb0 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  arget..**.** Als
18fc0 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  o make a copy of
18fd0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
18fe0 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f  results into ano
18ff0 74 68 65 72 20 22 63 61 63 68 65 22 20 72 65 67  ther "cache" reg
19000 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64  ister.** and mod
19010 69 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69  ify the expressi
19020 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  on so that the n
19030 65 78 74 20 74 69 6d 65 20 69 74 20 69 73 20 65  ext time it is e
19040 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65  valuated,.** the
19050 20 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f 70   result is a cop
19060 79 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 72  y of the cache r
19070 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  egister..**.** T
19080 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
19090 73 65 64 20 66 6f 72 20 65 78 70 72 65 73 73 69  sed for expressi
190a0 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75 73 65  ons that are use
190b0 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74  d multiple .** t
190c0 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72 65 20  imes.  They are 
190d0 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61  evaluated once a
190e0 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  nd the results o
190f0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
19100 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64 2e 0a  .** are reused..
19110 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
19120 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50  prCodeAndCache(P
19130 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
19140 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
19150 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a  arget){.  Vdbe *
19160 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
19170 65 3b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a  e;.  int inReg;.
19180 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
19190 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
191a0 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
191b0 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ;.  assert( targ
191c0 65 74 3e 30 20 29 3b 0a 20 20 2f 2a 20 54 68 69  et>0 );.  /* Thi
191d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
191e0 6c 65 64 20 66 6f 72 20 74 65 72 6d 73 20 74 6f  led for terms to
191f0 20 49 4e 53 45 52 54 20 6f 72 20 55 50 44 41 54   INSERT or UPDAT
19200 45 2e 20 20 41 6e 64 20 74 68 65 20 6f 6e 6c 79  E.  And the only
19210 0a 20 20 2a 2a 20 6f 74 68 65 72 20 70 6c 61 63  .  ** other plac
19220 65 20 77 68 65 72 65 20 65 78 70 72 65 73 73 69  e where expressi
19230 6f 6e 73 20 63 61 6e 20 62 65 20 63 6f 6e 76 65  ons can be conve
19240 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f 52 45 47  rted into TK_REG
19250 49 53 54 45 52 20 69 73 0a 20 20 2a 2a 20 69 6e  ISTER is.  ** in
19260 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
19270 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f 20 61 73  ocessing.  So as
19280 20 63 75 72 72 65 6e 74 6c 79 20 69 6d 70 6c 65   currently imple
19290 6d 65 6e 74 65 64 2c 20 74 68 65 72 65 20 69 73  mented, there is
192a0 0a 20 20 2a 2a 20 6e 6f 20 77 61 79 20 66 6f 72  .  ** no way for
192b0 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 20 74   a TK_REGISTER t
192c0 6f 20 65 78 69 73 74 20 68 65 72 65 2e 20 20 42  o exist here.  B
192d0 75 74 20 69 74 20 73 65 65 6d 73 20 70 72 75 64  ut it seems prud
192e0 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70  ent to.  ** keep
192f0 20 74 68 65 20 41 4c 57 41 59 53 28 29 20 69 6e   the ALWAYS() in
19300 20 63 61 73 65 20 74 68 65 20 63 6f 6e 64 69 74   case the condit
19310 69 6f 6e 73 20 61 62 6f 76 65 20 63 68 61 6e 67  ions above chang
19320 65 20 77 69 74 68 20 66 75 74 75 72 65 0a 20 20  e with future.  
19330 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73  ** modifications
19340 20 6f 72 20 65 6e 68 61 6e 63 65 6d 65 6e 74 73   or enhancements
19350 2e 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59  . */.  if( ALWAY
19360 53 28 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  S(pExpr->op!=TK_
19370 52 45 47 49 53 54 45 52 29 20 29 7b 20 20 0a 20  REGISTER) ){  . 
19380 20 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 20     int iMem;.   
19390 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65   iMem = ++pParse
193a0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
193b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
193c0 20 4f 50 5f 43 6f 70 79 2c 20 69 6e 52 65 67 2c   OP_Copy, inReg,
193d0 20 69 4d 65 6d 29 3b 0a 20 20 20 20 70 45 78 70   iMem);.    pExp
193e0 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 4d 65 6d  r->iTable = iMem
193f0 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32  ;.    pExpr->op2
19400 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
19410 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
19420 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 7d 0a 20  _REGISTER;.  }. 
19430 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d   return inReg;.}
19440 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
19450 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
19460 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20  _EXPLAIN)./*.** 
19470 47 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e  Generate a human
19480 2d 72 65 61 64 61 62 6c 65 20 65 78 70 6c 61 6e  -readable explan
19490 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65 78 70 72  ation of an expr
194a0 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a  ession tree..*/.
194b0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 6c  void sqlite3Expl
194c0 61 69 6e 45 78 70 72 28 56 64 62 65 20 2a 70 4f  ainExpr(Vdbe *pO
194d0 75 74 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  ut, Expr *pExpr)
194e0 7b 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  {.  int op;     
194f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19500 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e   The opcode bein
19510 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 63 6f 6e  g coded */.  con
19520 73 74 20 63 68 61 72 20 2a 7a 42 69 6e 4f 70 20  st char *zBinOp 
19530 3d 20 30 3b 20 20 20 2f 2a 20 42 69 6e 61 72 79  = 0;   /* Binary
19540 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 63   operator */.  c
19550 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 6e 69 4f  onst char *zUniO
19560 70 20 3d 20 30 3b 20 20 20 2f 2a 20 55 6e 61 72  p = 0;   /* Unar
19570 79 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  y operator */.  
19580 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a  if( pExpr==0 ){.
19590 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c      op = TK_NULL
195a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
195b0 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
195c0 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20   }.  switch( op 
195d0 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
195e0 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  GG_COLUMN: {.   
195f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
19600 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 41  nPrintf(pOut, "A
19610 47 47 7b 25 64 3a 25 64 7d 22 2c 0a 20 20 20 20  GG{%d:%d}",.    
19620 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
19630 54 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43  Table, pExpr->iC
19640 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72  olumn);.      br
19650 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
19660 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
19670 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
19680 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20  ->iTable<0 ){.  
19690 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e        /* This on
196a0 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  ly happens when 
196b0 63 6f 64 69 6e 67 20 63 68 65 63 6b 20 63 6f 6e  coding check con
196c0 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20  straints */.    
196d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
196e0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
196f0 43 4f 4c 55 4d 4e 28 25 64 29 22 2c 20 70 45 78  COLUMN(%d)", pEx
19700 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
19710 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19720 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
19730 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 7b  nPrintf(pOut, "{
19740 25 64 3a 25 64 7d 22 2c 0a 20 20 20 20 20 20 20  %d:%d}",.       
19750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19760 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
19770 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ble, pExpr->iCol
19780 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  umn);.      }.  
19790 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
197a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
197b0 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 66  EGER: {.      if
197c0 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
197d0 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a   EP_IntValue ){.
197e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
197f0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
19800 74 2c 20 22 25 64 22 2c 20 70 45 78 70 72 2d 3e  t, "%d", pExpr->
19810 75 2e 69 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  u.iValue);.     
19820 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19830 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
19840 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 73 22 2c  intf(pOut, "%s",
19850 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
19860 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
19870 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
19880 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19890 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
198a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
198b0 41 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AT: {.      sqli
198c0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
198d0 28 70 4f 75 74 2c 22 25 73 22 2c 20 70 45 78 70  (pOut,"%s", pExp
198e0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
198f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19900 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
19910 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
19920 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
19930 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25  inPrintf(pOut,"%
19940 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Q", pExpr->u.zTo
19950 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ken);.      brea
19960 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
19970 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  e TK_NULL: {.   
19980 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
19990 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 4e 55  nPrintf(pOut,"NU
199a0 4c 4c 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  LL");.      brea
199b0 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
199c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f   SQLITE_OMIT_BLO
199d0 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61  B_LITERAL.    ca
199e0 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20  se TK_BLOB: {.  
199f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
19a00 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25  inPrintf(pOut,"%
19a10 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  s", pExpr->u.zTo
19a20 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ken);.      brea
19a30 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
19a40 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
19a50 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  ABLE: {.      sq
19a60 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
19a70 74 66 28 70 4f 75 74 2c 22 56 41 52 49 41 42 4c  tf(pOut,"VARIABL
19a80 45 28 25 73 2c 25 64 29 22 2c 0a 20 20 20 20 20  E(%s,%d)",.     
19a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19aa0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a        pExpr->u.z
19ab0 54 6f 6b 65 6e 2c 20 70 45 78 70 72 2d 3e 69 43  Token, pExpr->iC
19ac0 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72  olumn);.      br
19ad0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
19ae0 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a  ase TK_REGISTER:
19af0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
19b00 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
19b10 75 74 2c 22 52 45 47 49 53 54 45 52 28 25 64 29  ut,"REGISTER(%d)
19b20 22 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  ", pExpr->iTable
19b30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
19b40 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
19b50 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 73 71  K_AS: {.      sq
19b60 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
19b70 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c  (pOut, pExpr->pL
19b80 65 66 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  eft);.      brea
19b90 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
19ba0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
19bb0 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  T.    case TK_CA
19bc0 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  ST: {.      /* E
19bd0 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
19be0 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70  e form:   CAST(p
19bf0 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a  Left AS token) *
19c00 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  /.      const ch
19c10 61 72 20 2a 7a 41 66 66 20 3d 20 22 75 6e 6b 22  ar *zAff = "unk"
19c20 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  ;.      switch( 
19c30 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
19c40 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  ype(pExpr->u.zTo
19c50 6b 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ken) ){.        
19c60 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
19c70 54 45 58 54 3a 20 20 20 20 7a 41 66 66 20 3d 20  TEXT:    zAff = 
19c80 22 54 45 58 54 22 3b 20 20 20 20 20 62 72 65 61  "TEXT";     brea
19c90 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
19ca0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a  SQLITE_AFF_NONE:
19cb0 20 20 20 20 7a 41 66 66 20 3d 20 22 4e 4f 4e 45      zAff = "NONE
19cc0 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
19cd0 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
19ce0 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3a 20 7a  E_AFF_NUMERIC: z
19cf0 41 66 66 20 3d 20 22 4e 55 4d 45 52 49 43 22 3b  Aff = "NUMERIC";
19d00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
19d10 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
19d20 5f 49 4e 54 45 47 45 52 3a 20 7a 41 66 66 20 3d  _INTEGER: zAff =
19d30 20 22 49 4e 54 45 47 45 52 22 3b 20 20 62 72 65   "INTEGER";  bre
19d40 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
19d50 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
19d60 3a 20 20 20 20 7a 41 66 66 20 3d 20 22 52 45 41  :    zAff = "REA
19d70 4c 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  L";     break;. 
19d80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
19d90 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
19da0 66 28 70 4f 75 74 2c 20 22 43 41 53 54 2d 25 73  f(pOut, "CAST-%s
19db0 28 22 2c 20 7a 41 66 66 29 3b 0a 20 20 20 20 20  (", zAff);.     
19dc0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
19dd0 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d  xpr(pOut, pExpr-
19de0 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
19df0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
19e00 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a  ntf(pOut, ")");.
19e10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19e20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
19e30 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f  ITE_OMIT_CAST */
19e40 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
19e50 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22        zBinOp = "
19e60 4c 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  LT";     break;.
19e70 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20      case TK_LE: 
19e80 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c       zBinOp = "L
19e90 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  E";     break;. 
19ea0 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20     case TK_GT:  
19eb0 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 47 54      zBinOp = "GT
19ec0 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
19ed0 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20    case TK_GE:   
19ee0 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 47 45 22     zBinOp = "GE"
19ef0 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
19f00 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20   case TK_NE:    
19f10 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4e 45 22 3b    zBinOp = "NE";
19f20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19f30 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20  case TK_EQ:     
19f40 20 7a 42 69 6e 4f 70 20 3d 20 22 45 51 22 3b 20   zBinOp = "EQ"; 
19f50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
19f60 61 73 65 20 54 4b 5f 49 53 3a 20 20 20 20 20 20  ase TK_IS:      
19f70 7a 42 69 6e 4f 70 20 3d 20 22 49 53 22 3b 20 20  zBinOp = "IS";  
19f80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
19f90 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a  se TK_ISNOT:   z
19fa0 42 69 6e 4f 70 20 3d 20 22 49 53 4e 4f 54 22 3b  BinOp = "ISNOT";
19fb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
19fc0 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20 7a 42  e TK_AND:     zB
19fd0 69 6e 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20 20  inOp = "AND";   
19fe0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
19ff0 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 42 69   TK_OR:      zBi
1a000 6e 4f 70 20 3d 20 22 4f 52 22 3b 20 20 20 20 20  nOp = "OR";     
1a010 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1a020 54 4b 5f 50 4c 55 53 3a 20 20 20 20 7a 42 69 6e  TK_PLUS:    zBin
1a030 4f 70 20 3d 20 22 41 44 44 22 3b 20 20 20 20 62  Op = "ADD";    b
1a040 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1a050 4b 5f 53 54 41 52 3a 20 20 20 20 7a 42 69 6e 4f  K_STAR:    zBinO
1a060 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20 62 72  p = "MUL";    br
1a070 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1a080 5f 4d 49 4e 55 53 3a 20 20 20 7a 42 69 6e 4f 70  _MINUS:   zBinOp
1a090 20 3d 20 22 53 55 42 22 3b 20 20 20 20 62 72 65   = "SUB";    bre
1a0a0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1a0b0 52 45 4d 3a 20 20 20 20 20 7a 42 69 6e 4f 70 20  REM:     zBinOp 
1a0c0 3d 20 22 52 45 4d 22 3b 20 20 20 20 62 72 65 61  = "REM";    brea
1a0d0 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
1a0e0 49 54 41 4e 44 3a 20 20 7a 42 69 6e 4f 70 20 3d  ITAND:  zBinOp =
1a0f0 20 22 42 49 54 41 4e 44 22 3b 20 62 72 65 61 6b   "BITAND"; break
1a100 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  ;.    case TK_BI
1a110 54 4f 52 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20  TOR:   zBinOp = 
1a120 22 42 49 54 4f 52 22 3b 20 20 62 72 65 61 6b 3b  "BITOR";  break;
1a130 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
1a140 53 48 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22  SH:   zBinOp = "
1a150 44 49 56 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  DIV";    break;.
1a160 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
1a170 46 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c  FT:  zBinOp = "L
1a180 53 48 49 46 54 22 3b 20 62 72 65 61 6b 3b 0a 20  SHIFT"; break;. 
1a190 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
1a1a0 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 52 53  T:  zBinOp = "RS
1a1b0 48 49 46 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20  HIFT"; break;.  
1a1c0 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54    case TK_CONCAT
1a1d0 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 43 4f 4e  :  zBinOp = "CON
1a1e0 43 41 54 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20  CAT"; break;..  
1a1f0 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
1a200 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22 55 4d 49  :  zUniOp = "UMI
1a210 4e 55 53 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  NUS"; break;.   
1a220 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
1a230 20 20 7a 55 6e 69 4f 70 20 3d 20 22 55 50 4c 55    zUniOp = "UPLU
1a240 53 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  S";  break;.    
1a250 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20  case TK_BITNOT: 
1a260 20 7a 55 6e 69 4f 70 20 3d 20 22 42 49 54 4e 4f   zUniOp = "BITNO
1a270 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  T"; break;.    c
1a280 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20 20 20  ase TK_NOT:     
1a290 7a 55 6e 69 4f 70 20 3d 20 22 4e 4f 54 22 3b 20  zUniOp = "NOT"; 
1a2a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1a2b0 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a  se TK_ISNULL:  z
1a2c0 55 6e 69 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22  UniOp = "ISNULL"
1a2d0 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
1a2e0 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 55  e TK_NOTNULL: zU
1a2f0 6e 69 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22  niOp = "NOTNULL"
1a300 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61  ; break;..    ca
1a310 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
1a320 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
1a330 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20  CONST_FUNC:.    
1a340 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
1a350 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  : {.      ExprLi
1a360 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20  st *pFarg;      
1a370 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63   /* List of func
1a380 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
1a390 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  /.      if( Expr
1a3a0 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
1a3b0 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
1a3c0 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ly) ){.        p
1a3d0 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  Farg = 0;.      
1a3e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
1a3f0 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Farg = pExpr->x.
1a400 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pList;.      }. 
1a410 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f       if( op==TK_
1a420 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a  AGG_FUNCTION ){.
1a430 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1a440 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1a450 74 2c 20 22 41 47 47 5f 46 55 4e 43 54 49 4f 4e  t, "AGG_FUNCTION
1a460 25 64 3a 25 73 28 22 2c 0a 20 20 20 20 20 20 20  %d:%s(",.       
1a470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a480 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32        pExpr->op2
1a490 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1a4a0 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
1a4b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a4c0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1a4d0 75 74 2c 20 22 46 55 4e 43 54 49 4f 4e 3a 25 73  ut, "FUNCTION:%s
1a4e0 28 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  (", pExpr->u.zTo
1a4f0 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ken);.      }.  
1a500 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b      if( pFarg ){
1a510 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a520 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28  ExplainExprList(
1a530 70 4f 75 74 2c 20 70 46 61 72 67 29 3b 0a 20 20  pOut, pFarg);.  
1a540 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1a550 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1a560 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20 20  (pOut, ")");.   
1a570 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1a580 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a590 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
1a5a0 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
1a5b0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1a5c0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1a5d0 75 74 2c 20 22 45 58 49 53 54 53 28 22 29 3b 0a  ut, "EXISTS(");.
1a5e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a5f0 6c 61 69 6e 53 65 6c 65 63 74 28 70 4f 75 74 2c  lainSelect(pOut,
1a600 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
1a610 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1a620 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1a630 4f 75 74 2c 22 29 22 29 3b 0a 20 20 20 20 20 20  Out,")");.      
1a640 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1a650 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
1a660 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1a670 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1a680 75 74 2c 20 22 28 22 29 3b 0a 20 20 20 20 20 20  ut, "(");.      
1a690 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65  sqlite3ExplainSe
1a6a0 6c 65 63 74 28 70 4f 75 74 2c 20 70 45 78 70 72  lect(pOut, pExpr
1a6b0 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
1a6c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1a6d0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1a6e0 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  )");.      break
1a6f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1a700 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
1a710 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1a720 69 6e 74 66 28 70 4f 75 74 2c 20 22 49 4e 28 22  intf(pOut, "IN("
1a730 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a740 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74  ExplainExpr(pOut
1a750 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
1a760 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1a770 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1a780 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 69 66  , ",");.      if
1a790 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1a7a0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
1a7b0 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
1a7c0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1a7d0 53 65 6c 65 63 74 28 70 4f 75 74 2c 20 70 45 78  Select(pOut, pEx
1a7e0 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a  pr->x.pSelect);.
1a7f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a800 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1a810 61 69 6e 45 78 70 72 4c 69 73 74 28 70 4f 75 74  ainExprList(pOut
1a820 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
1a830 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1a840 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1a850 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29  rintf(pOut, ")")
1a860 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1a870 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
1a880 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1a890 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20  ERY */..    /*. 
1a8a0 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45     **    x BETWE
1a8b0 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a  EN y AND z.    *
1a8c0 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73  *.    ** This is
1a8d0 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20   equivalent to. 
1a8e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1a8f0 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20  x>=y AND x<=z.  
1a900 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73    **.    ** X is
1a910 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
1a920 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20  ->pLeft..    ** 
1a930 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  Y is stored in p
1a940 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30  Expr->pList->a[0
1a950 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20  ].pExpr..    ** 
1a960 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  Z is stored in p
1a970 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31  Expr->pList->a[1
1a980 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a  ].pExpr..    */.
1a990 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
1a9a0 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  EEN: {.      Exp
1a9b0 72 20 2a 70 58 20 3d 20 70 45 78 70 72 2d 3e 70  r *pX = pExpr->p
1a9c0 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72  Left;.      Expr
1a9d0 20 2a 70 59 20 3d 20 70 45 78 70 72 2d 3e 78 2e   *pY = pExpr->x.
1a9e0 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
1a9f0 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  r;.      Expr *p
1aa00 5a 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  Z = pExpr->x.pLi
1aa10 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
1aa20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1aa30 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1aa40 20 22 42 45 54 57 45 45 4e 28 22 29 3b 0a 20 20   "BETWEEN(");.  
1aa50 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1aa60 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 58 29  inExpr(pOut, pX)
1aa70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1aa80 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1aa90 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 73  t, ",");.      s
1aaa0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1aab0 72 28 70 4f 75 74 2c 20 70 59 29 3b 0a 20 20 20  r(pOut, pY);.   
1aac0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1aad0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c  nPrintf(pOut, ",
1aae0 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
1aaf0 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75  3ExplainExpr(pOu
1ab00 74 2c 20 70 5a 29 3b 0a 20 20 20 20 20 20 73 71  t, pZ);.      sq
1ab10 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1ab20 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20  tf(pOut, ")");. 
1ab30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ab40 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52  }.    case TK_TR
1ab50 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f  IGGER: {.      /
1ab60 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20  * If the opcode 
1ab70 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74  is TK_TRIGGER, t
1ab80 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
1ab90 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  on is a referenc
1aba0 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20  e.      ** to a 
1abb0 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65  column in the ne
1abc0 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65  w.* or old.* pse
1abd0 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c  udo-tables avail
1abe0 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  able to.      **
1abf0 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
1ac00 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
1ac10 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73  Expr.iTable is s
1ac20 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a  et to 1 for the.
1ac30 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70        ** new.* p
1ac40 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20  seudo-table, or 
1ac50 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20  0 for the old.* 
1ac60 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78  pseudo-table. Ex
1ac70 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20  pr.iColumn.     
1ac80 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68   ** is set to th
1ac90 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
1aca0 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20  pseudo-table to 
1acb0 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74  read, or to -1 t
1acc0 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20  o.      ** read 
1acd0 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e  the rowid field.
1ace0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1acf0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1ad00 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 73 28 25  intf(pOut, "%s(%
1ad10 64 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  d)", .          
1ad20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20  pExpr->iTable ? 
1ad30 22 4e 45 57 22 20 3a 20 22 4f 4c 44 22 2c 20 70  "NEW" : "OLD", p
1ad40 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
1ad50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ad60 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
1ad70 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ASE: {.      sql
1ad80 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1ad90 66 28 70 4f 75 74 2c 20 22 43 41 53 45 28 22 29  f(pOut, "CASE(")
1ada0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1adb0 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c  xplainExpr(pOut,
1adc0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
1add0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1ade0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1adf0 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 73 71 6c   ",");.      sql
1ae00 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c  ite3ExplainExprL
1ae10 69 73 74 28 70 4f 75 74 2c 20 70 45 78 70 72 2d  ist(pOut, pExpr-
1ae20 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  >x.pList);.     
1ae30 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
1ae40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ae50 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61  T_TRIGGER.    ca
1ae60 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20  se TK_RAISE: {. 
1ae70 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1ae80 2a 7a 54 79 70 65 20 3d 20 22 75 6e 6b 22 3b 0a  *zType = "unk";.
1ae90 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70 45        switch( pE
1aea0 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 29 7b  xpr->affinity ){
1aeb0 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 45  .        case OE
1aec0 5f 52 6f 6c 6c 62 61 63 6b 3a 20 20 20 7a 54 79  _Rollback:   zTy
1aed0 70 65 20 3d 20 22 72 6f 6c 6c 62 61 63 6b 22 3b  pe = "rollback";
1aee0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1aef0 20 63 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a 20   case OE_Abort: 
1af00 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 61 62       zType = "ab
1af10 6f 72 74 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  ort";     break;
1af20 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 45  .        case OE
1af30 5f 46 61 69 6c 3a 20 20 20 20 20 20 20 7a 54 79  _Fail:       zTy
1af40 70 65 20 3d 20 22 66 61 69 6c 22 3b 20 20 20 20  pe = "fail";    
1af50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1af60 20 63 61 73 65 20 4f 45 5f 49 67 6e 6f 72 65 3a   case OE_Ignore:
1af70 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 69 67       zType = "ig
1af80 6e 6f 72 65 22 3b 20 20 20 20 62 72 65 61 6b 3b  nore";    break;
1af90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1afa0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1afb0 6e 74 66 28 70 4f 75 74 2c 20 22 52 41 49 53 45  ntf(pOut, "RAISE
1afc0 2d 25 73 28 25 73 29 22 2c 20 7a 54 79 70 65 2c  -%s(%s)", zType,
1afd0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1afe0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1aff0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
1b000 0a 20 20 69 66 28 20 7a 42 69 6e 4f 70 20 29 7b  .  if( zBinOp ){
1b010 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
1b020 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22  ainPrintf(pOut,"
1b030 25 73 28 22 2c 20 7a 42 69 6e 4f 70 29 3b 0a 20  %s(", zBinOp);. 
1b040 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1b050 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70  nExpr(pOut, pExp
1b060 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  r->pLeft);.    s
1b070 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1b080 6e 74 66 28 70 4f 75 74 2c 22 2c 22 29 3b 0a 20  ntf(pOut,",");. 
1b090 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1b0a0 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70  nExpr(pOut, pExp
1b0b0 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
1b0c0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1b0d0 69 6e 74 66 28 70 4f 75 74 2c 22 29 22 29 3b 0a  intf(pOut,")");.
1b0e0 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 55 6e 69    }else if( zUni
1b0f0 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Op ){.    sqlite
1b100 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1b110 4f 75 74 2c 22 25 73 28 22 2c 20 7a 55 6e 69 4f  Out,"%s(", zUniO
1b120 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  p);.    sqlite3E
1b130 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c  xplainExpr(pOut,
1b140 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
1b150 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1b160 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 29  inPrintf(pOut,")
1b170 22 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  ");.  }.}.#endif
1b180 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
1b190 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
1b1a0 58 50 4c 41 49 4e 29 20 2a 2f 0a 0a 23 69 66 20  XPLAIN) */..#if 
1b1b0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1b1c0 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41  NABLE_TREE_EXPLA
1b1d0 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  IN)./*.** Genera
1b1e0 74 65 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61  te a human-reada
1b1f0 62 6c 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20  ble explanation 
1b200 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
1b210 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73   list..*/.void s
1b220 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1b230 72 4c 69 73 74 28 56 64 62 65 20 2a 70 4f 75 74  rList(Vdbe *pOut
1b240 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
1b250 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
1b260 66 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  f( pList==0 || p
1b270 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29  List->nExpr==0 )
1b280 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
1b290 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1b2a0 20 22 28 65 6d 70 74 79 2d 6c 69 73 74 29 22 29   "(empty-list)")
1b2b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1b2c0 7d 65 6c 73 65 20 69 66 28 20 70 4c 69 73 74 2d  }else if( pList-
1b2d0 3e 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20  >nExpr==1 ){.   
1b2e0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1b2f0 78 70 72 28 70 4f 75 74 2c 20 70 4c 69 73 74 2d  xpr(pOut, pList-
1b300 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
1b310 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
1b320 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70 4f  e3ExplainPush(pO
1b330 75 74 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ut);.    for(i=0
1b340 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
1b350 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
1b360 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1b370 74 66 28 70 4f 75 74 2c 20 22 69 74 65 6d 5b 25  tf(pOut, "item[%
1b380 64 5d 20 3d 20 22 2c 20 69 29 3b 0a 20 20 20 20  d] = ", i);.    
1b390 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b3a0 50 75 73 68 28 70 4f 75 74 29 3b 0a 20 20 20 20  Push(pOut);.    
1b3b0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b3c0 45 78 70 72 28 70 4f 75 74 2c 20 70 4c 69 73 74  Expr(pOut, pList
1b3d0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
1b3e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1b3f0 61 69 6e 50 6f 70 28 70 4f 75 74 29 3b 0a 20 20  ainPop(pOut);.  
1b400 20 20 20 20 69 66 28 20 69 3c 70 4c 69 73 74 2d      if( i<pList-
1b410 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20  >nExpr-1 ){.    
1b420 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1b430 69 6e 4e 4c 28 70 4f 75 74 29 3b 0a 20 20 20 20  inNL(pOut);.    
1b440 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
1b450 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28  lite3ExplainPop(
1b460 70 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  pOut);.  }.}.#en
1b470 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
1b480 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  BUG */../*.** Re
1b490 74 75 72 6e 20 54 52 55 45 20 69 66 20 70 45 78  turn TRUE if pEx
1b4a0 70 72 20 69 73 20 61 6e 20 63 6f 6e 73 74 61 6e  pr is an constan
1b4b0 74 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  t expression tha
1b4c0 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  t is appropriate
1b4d0 0a 2a 2a 20 66 6f 72 20 66 61 63 74 6f 72 69 6e  .** for factorin
1b4e0 67 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e  g out of a loop.
1b4f0 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 78    Appropriate ex
1b500 70 72 65 73 73 69 6f 6e 73 20 61 72 65 3a 0a 2a  pressions are:.*
1b510 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20 65  *.**    *  Any e
1b520 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65  xpression that e
1b530 76 61 6c 75 61 74 65 73 20 74 6f 20 74 77 6f 20  valuates to two 
1b540 6f 72 20 6d 6f 72 65 20 6f 70 63 6f 64 65 73 2e  or more opcodes.
1b550 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79  .**.**    *  Any
1b560 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 4f 50 5f   OP_Integer, OP_
1b570 52 65 61 6c 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Real, OP_String,
1b580 20 4f 50 5f 42 6c 6f 62 2c 20 4f 50 5f 4e 75 6c   OP_Blob, OP_Nul
1b590 6c 2c 20 0a 2a 2a 20 20 20 20 20 20 20 6f 72 20  l, .**       or 
1b5a0 4f 50 5f 56 61 72 69 61 62 6c 65 20 74 68 61 74  OP_Variable that
1b5b0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
1b5c0 6f 20 62 65 20 70 6c 61 63 65 64 20 69 6e 20 61  o be placed in a
1b5d0 20 0a 2a 2a 20 20 20 20 20 20 20 73 70 65 63 69   .**       speci
1b5e0 66 69 63 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a  fic register..**
1b5f0 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20  .** There is no 
1b600 70 6f 69 6e 74 20 69 6e 20 66 61 63 74 6f 72 69  point in factori
1b610 6e 67 20 6f 75 74 20 73 69 6e 67 6c 65 2d 69 6e  ng out single-in
1b620 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61  struction consta
1b630 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  nt.** expression
1b640 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
1b650 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 70 61  e placed in a pa
1b660 72 74 69 63 75 6c 61 72 20 72 65 67 69 73 74 65  rticular registe
1b670 72 2e 20 20 0a 2a 2a 20 57 65 20 63 6f 75 6c 64  r.  .** We could
1b680 20 66 61 63 74 6f 72 20 74 68 65 6d 20 6f 75 74   factor them out
1b690 2c 20 62 75 74 20 74 68 65 6e 20 77 65 20 77 6f  , but then we wo
1b6a0 75 6c 64 20 65 6e 64 20 75 70 20 61 64 64 69 6e  uld end up addin
1b6b0 67 20 61 6e 0a 2a 2a 20 4f 50 5f 53 43 6f 70 79  g an.** OP_SCopy
1b6c0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
1b6d0 6d 6f 76 65 20 74 68 65 20 76 61 6c 75 65 20 69  move the value i
1b6e0 6e 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20  nto the correct 
1b6f0 72 65 67 69 73 74 65 72 0a 2a 2a 20 6c 61 74 65  register.** late
1b700 72 2e 20 20 57 65 20 6d 69 67 68 74 20 61 73 20  r.  We might as 
1b710 77 65 6c 6c 20 6a 75 73 74 20 75 73 65 20 74 68  well just use th
1b720 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e 73 74 72  e original instr
1b730 75 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 61 76  uction and.** av
1b740 6f 69 64 20 74 68 65 20 4f 50 5f 53 43 6f 70 79  oid the OP_SCopy
1b750 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b760 69 73 41 70 70 72 6f 70 72 69 61 74 65 46 6f 72  isAppropriateFor
1b770 46 61 63 74 6f 72 69 6e 67 28 45 78 70 72 20 2a  Factoring(Expr *
1b780 70 29 7b 0a 20 20 69 66 28 20 21 73 71 6c 69 74  p){.  if( !sqlit
1b790 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
1b7a0 4e 6f 74 4a 6f 69 6e 28 70 29 20 29 7b 0a 20 20  NotJoin(p) ){.  
1b7b0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20    return 0;  /* 
1b7c0 4f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 65 78  Only constant ex
1b7d0 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 61 70  pressions are ap
1b7e0 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 66 61  propriate for fa
1b7f0 63 74 6f 72 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  ctoring */.  }. 
1b800 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20 26   if( (p->flags &
1b810 20 45 50 5f 46 69 78 65 64 44 65 73 74 29 3d 3d   EP_FixedDest)==
1b820 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1b830 31 3b 20 20 2f 2a 20 41 6e 79 20 63 6f 6e 73 74  1;  /* Any const
1b840 61 6e 74 20 77 69 74 68 6f 75 74 20 61 20 66 69  ant without a fi
1b850 78 65 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  xed destination 
1b860 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a  is appropriate *
1b870 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  /.  }.  while( p
1b880 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29  ->op==TK_UPLUS )
1b890 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20   p = p->pLeft;. 
1b8a0 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
1b8b0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
1b8c0 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52  _OMIT_BLOB_LITER
1b8d0 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  AL.    case TK_B
1b8e0 4c 4f 42 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20  LOB:.#endif.    
1b8f0 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  case TK_VARIABLE
1b900 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  :.    case TK_IN
1b910 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20  TEGER:.    case 
1b920 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61  TK_FLOAT:.    ca
1b930 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20  se TK_NULL:.    
1b940 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
1b950 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1b960 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 42 4c 4f 42  ( p->op==TK_BLOB
1b970 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1b980 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 56 41  se( p->op==TK_VA
1b990 52 49 41 42 4c 45 20 29 3b 0a 20 20 20 20 20 20  RIABLE );.      
1b9a0 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
1b9b0 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20  =TK_INTEGER );. 
1b9c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1b9d0 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29  ->op==TK_FLOAT )
1b9e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1b9f0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c  ( p->op==TK_NULL
1ba00 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1ba10 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54  se( p->op==TK_ST
1ba20 52 49 4e 47 20 29 3b 0a 20 20 20 20 20 20 2f 2a  RING );.      /*
1ba30 20 53 69 6e 67 6c 65 2d 69 6e 73 74 72 75 63 74   Single-instruct
1ba40 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 20 77 69  ion constants wi
1ba50 74 68 20 61 20 66 69 78 65 64 20 64 65 73 74 69  th a fixed desti
1ba60 6e 61 74 69 6f 6e 20 61 72 65 0a 20 20 20 20 20  nation are.     
1ba70 20 2a 2a 20 62 65 74 74 65 72 20 64 6f 6e 65 20   ** better done 
1ba80 69 6e 2d 6c 69 6e 65 2e 20 20 49 66 20 77 65 20  in-line.  If we 
1ba90 66 61 63 74 6f 72 20 74 68 65 6d 2c 20 74 68 65  factor them, the
1baa0 79 20 77 69 6c 6c 20 6a 75 73 74 20 65 6e 64 0a  y will just end.
1bab0 20 20 20 20 20 20 2a 2a 20 75 70 20 67 65 6e 65        ** up gene
1bac0 72 61 74 69 6e 67 20 61 6e 20 4f 50 5f 53 43 6f  rating an OP_SCo
1bad0 70 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 76  py to move the v
1bae0 61 6c 75 65 20 74 6f 20 74 68 65 20 64 65 73 74  alue to the dest
1baf0 69 6e 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ination.      **
1bb00 20 72 65 67 69 73 74 65 72 2e 20 2a 2f 0a 20 20   register. */.  
1bb10 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1bb20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1bb30 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
1bb40 69 66 28 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70  if( p->pLeft->op
1bb50 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 2d  ==TK_FLOAT || p-
1bb60 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pLeft->op==TK_I
1bb70 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20  NTEGER ){.      
1bb80 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1bb90 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
1bba0 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
1bbb0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 62 72 65 61  lt: {.      brea
1bbc0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
1bbd0 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
1bbe0 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20  * If pExpr is a 
1bbf0 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73  constant express
1bc00 69 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70 72  ion that is appr
1bc10 6f 70 72 69 61 74 65 20 66 6f 72 0a 2a 2a 20 66  opriate for.** f
1bc20 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20  actoring out of 
1bc30 61 20 6c 6f 6f 70 2c 20 74 68 65 6e 20 65 76 61  a loop, then eva
1bc40 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73  luate the expres
1bc50 73 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20 72  sion.** into a r
1bc60 65 67 69 73 74 65 72 20 61 6e 64 20 63 6f 6e 76  egister and conv
1bc70 65 72 74 20 74 68 65 20 65 78 70 72 65 73 73 69  ert the expressi
1bc80 6f 6e 20 69 6e 74 6f 20 61 20 54 4b 5f 52 45 47  on into a TK_REG
1bc90 49 53 54 45 52 0a 2a 2a 20 65 78 70 72 65 73 73  ISTER.** express
1bca0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
1bcb0 6e 74 20 65 76 61 6c 43 6f 6e 73 74 45 78 70 72  nt evalConstExpr
1bcc0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
1bcd0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
1bce0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
1bcf0 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
1bd00 65 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  e;.  switch( pEx
1bd10 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
1bd20 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 63 61  se TK_IN:.    ca
1bd30 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20  se TK_REGISTER: 
1bd40 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  {.      return W
1bd50 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a  RC_Prune;.    }.
1bd60 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
1bd70 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  TION:.    case T
1bd80 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a  K_AGG_FUNCTION:.
1bd90 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53      case TK_CONS
1bda0 54 5f 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20  T_FUNC: {.      
1bdb0 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73  /* The arguments
1bdc0 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 68   to a function h
1bdd0 61 76 65 20 61 20 66 69 78 65 64 20 64 65 73 74  ave a fixed dest
1bde0 69 6e 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  ination..      *
1bdf0 2a 20 4d 61 72 6b 20 74 68 65 6d 20 74 68 69 73  * Mark them this
1be00 20 77 61 79 20 74 6f 20 61 76 6f 69 64 20 67 65   way to avoid ge
1be10 6e 65 72 61 74 65 64 20 75 6e 6e 65 65 64 65 64  nerated unneeded
1be20 20 4f 50 5f 53 43 6f 70 79 0a 20 20 20 20 20 20   OP_SCopy.      
1be30 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e  ** instructions.
1be40 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
1be50 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1be60 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1be70 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
1be80 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1be90 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
1bea0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
1beb0 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
1bec0 20 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69       int i = pLi
1bed0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
1bee0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
1bef0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
1bf00 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20   pList->a;.     
1bf10 20 20 20 66 6f 72 28 3b 20 69 3e 30 3b 20 69 2d     for(; i>0; i-
1bf20 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
1bf30 20 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59         if( ALWAY
1bf40 53 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 20  S(pItem->pExpr) 
1bf50 29 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  ) pItem->pExpr->
1bf60 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46 69 78 65  flags |= EP_Fixe
1bf70 64 44 65 73 74 3b 0a 20 20 20 20 20 20 20 20 7d  dDest;.        }
1bf80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1bf90 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1bfa0 20 20 69 66 28 20 69 73 41 70 70 72 6f 70 72 69    if( isAppropri
1bfb0 61 74 65 46 6f 72 46 61 63 74 6f 72 69 6e 67 28  ateForFactoring(
1bfc0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e  pExpr) ){.    in
1bfd0 74 20 72 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d  t r1 = ++pParse-
1bfe0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20 72  >nMem;.    int r
1bff0 32 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69  2;.    r2 = sqli
1c000 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
1c010 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
1c020 20 72 31 29 3b 0a 20 20 20 20 69 66 28 20 4e 45   r1);.    if( NE
1c030 56 45 52 28 72 31 21 3d 72 32 29 20 29 20 73 71  VER(r1!=r2) ) sq
1c040 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1c050 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
1c060 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 20  .    pExpr->op2 
1c070 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20  = pExpr->op;.   
1c080 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
1c090 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20 70 45  REGISTER;.    pE
1c0a0 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 72 32  xpr->iTable = r2
1c0b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
1c0c0 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65  _Prune;.  }.  re
1c0d0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
1c0e0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 65  e;.}../*.** Pree
1c0f0 76 61 6c 75 61 74 65 20 63 6f 6e 73 74 61 6e 74  valuate constant
1c100 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
1c110 77 69 74 68 69 6e 20 70 45 78 70 72 20 61 6e 64  within pExpr and
1c120 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65   store the.** re
1c130 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
1c140 72 73 2e 20 20 4d 6f 64 69 66 79 20 70 45 78 70  rs.  Modify pExp
1c150 72 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f  r so that the co
1c160 6e 73 74 61 6e 74 20 73 75 62 65 78 70 72 65 73  nstant subexpres
1c170 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 54 4b 5f 52  ions.** are TK_R
1c180 45 47 49 53 54 45 52 20 6f 70 63 6f 64 65 73 20  EGISTER opcodes 
1c190 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
1c1a0 65 20 70 72 65 63 6f 6d 70 75 74 65 64 20 76 61  e precomputed va
1c1b0 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lues..**.** This
1c1c0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
1c1d0 2d 6f 70 20 69 66 20 74 68 65 20 6a 75 6d 70 20  -op if the jump 
1c1e0 74 6f 20 74 68 65 20 63 6f 6f 6b 69 65 2d 63 68  to the cookie-ch
1c1f0 65 63 6b 20 63 6f 64 65 20 68 61 73 0a 2a 2a 20  eck code has.** 
1c200 61 6c 72 65 61 64 79 20 6f 63 63 75 72 2e 20 20  already occur.  
1c210 53 69 6e 63 65 20 74 68 65 20 63 6f 6f 6b 69 65  Since the cookie
1c220 2d 63 68 65 63 6b 20 6a 75 6d 70 20 69 73 20 67  -check jump is g
1c230 65 6e 65 72 61 74 65 64 20 70 72 69 6f 72 20 74  enerated prior t
1c240 6f 0a 2a 2a 20 61 6e 79 20 6f 74 68 65 72 20 73  o.** any other s
1c250 65 72 69 6f 75 73 20 70 72 6f 63 65 73 73 69 6e  erious processin
1c260 67 2c 20 74 68 69 73 20 63 68 65 63 6b 20 65 6e  g, this check en
1c270 73 75 72 65 73 20 74 68 61 74 20 74 68 65 72 65  sures that there
1c280 20 69 73 20 6e 6f 0a 2a 2a 20 77 61 79 20 74 6f   is no.** way to
1c290 20 61 63 63 69 64 65 6e 74 6c 79 20 62 79 70 61   accidently bypa
1c2a0 73 73 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20  ss the constant 
1c2b0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 73 2e  initializations.
1c2c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1c2d0 69 6e 65 20 69 73 20 61 6c 73 6f 20 61 20 6e 6f  ine is also a no
1c2e0 2d 6f 70 20 69 66 20 74 68 65 20 53 51 4c 49 54  -op if the SQLIT
1c2f0 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74  E_FactorOutConst
1c300 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a   optimization.**
1c310 20 69 73 20 64 69 73 61 62 6c 65 64 20 76 69 61   is disabled via
1c320 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74 65 73   the sqlite3_tes
1c330 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1c340 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
1c350 5a 41 54 49 4f 4e 53 29 0a 2a 2a 20 69 6e 74 65  ZATIONS).** inte
1c360 72 66 61 63 65 2e 20 20 54 68 69 73 20 61 6c 6c  rface.  This all
1c370 6f 77 73 20 74 65 73 74 20 6c 6f 67 69 63 20 74  ows test logic t
1c380 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
1c390 65 20 73 61 6d 65 20 61 6e 73 77 65 72 20 69 73  e same answer is
1c3a0 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 6f 72  .** obtained for
1c3b0 20 71 75 65 72 69 65 73 20 72 65 67 61 72 64 6c   queries regardl
1c3c0 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f  ess of whether o
1c3d0 72 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 73 20  r not constants 
1c3e0 61 72 65 0a 2a 2a 20 70 72 65 63 6f 6d 70 75 74  are.** precomput
1c3f0 65 64 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  ed into register
1c400 73 20 6f 72 20 69 66 20 74 68 65 79 20 61 72 65  s or if they are
1c410 20 69 6e 73 65 72 74 65 64 20 69 6e 2d 6c 69 6e   inserted in-lin
1c420 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1c430 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73 74 61  e3ExprCodeConsta
1c440 6e 74 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  nts(Parse *pPars
1c450 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
1c460 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 69  .  Walker w;.  i
1c470 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  f( pParse->cooki
1c480 65 47 6f 74 6f 20 29 20 72 65 74 75 72 6e 3b 0a  eGoto ) return;.
1c490 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
1c4a0 6f 6e 44 69 73 61 62 6c 65 64 28 70 50 61 72 73  onDisabled(pPars
1c4b0 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 46 61  e->db, SQLITE_Fa
1c4c0 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29 20 29 20  ctorOutConst) ) 
1c4d0 72 65 74 75 72 6e 3b 0a 20 20 77 2e 78 45 78 70  return;.  w.xExp
1c4e0 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 76 61 6c  rCallback = eval
1c4f0 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 77 2e 78  ConstExpr;.  w.x
1c500 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
1c510 20 30 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d   0;.  w.pParse =
1c520 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74   pParse;.  sqlit
1c530 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
1c540 45 78 70 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  Expr);.}.../*.**
1c550 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1c560 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76  hat pushes the v
1c570 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c  alue of every el
1c580 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76  ement of the giv
1c590 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  en.** expression
1c5a0 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71   list into a seq
1c5b0 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
1c5c0 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  rs beginning at 
1c5d0 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65  target..**.** Re
1c5e0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1c5f0 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c  of elements eval
1c600 75 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  uated..*/.int sq
1c610 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
1c620 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
1c630 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
1c640 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1c650 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
1c660 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78  ist,   /* The ex
1c670 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
1c680 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69   be coded */.  i
1c690 6e 74 20 74 61 72 67 65 74 2c 20 20 20 20 20 20  nt target,      
1c6a0 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
1c6b0 69 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ite results */. 
1c6c0 20 69 6e 74 20 64 6f 48 61 72 64 43 6f 70 79 20   int doHardCopy 
1c6d0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 61 20 68 61      /* Make a ha
1c6e0 72 64 20 63 6f 70 79 20 6f 66 20 65 76 65 72 79  rd copy of every
1c6f0 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20   element */.){. 
1c700 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1c710 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1c720 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 61 73 73 65  int i, n;.  asse
1c730 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a  rt( pList!=0 );.
1c740 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
1c750 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
1c760 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30  pParse->pVdbe!=0
1c770 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20 67 65   );  /* Never ge
1c780 74 73 20 74 68 69 73 20 66 61 72 20 6f 74 68 65  ts this far othe
1c790 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70  rwise */.  n = p
1c7a0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66  List->nExpr;.  f
1c7b0 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
1c7c0 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  a, i=0; i<n; i++
1c7d0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1c7e0 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 49  Expr *pExpr = pI
1c7f0 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
1c800 69 6e 74 20 69 6e 52 65 67 20 3d 20 73 71 6c 69  int inReg = sqli
1c810 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
1c820 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
1c830 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
1c840 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65  if( inReg!=targe
1c850 74 2b 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  t+i ){.      sql
1c860 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
1c870 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 64 6f  Parse->pVdbe, do
1c880 48 61 72 64 43 6f 70 79 20 3f 20 4f 50 5f 43 6f  HardCopy ? OP_Co
1c890 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 2c 0a 20  py : OP_SCopy,. 
1c8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8b0 20 20 20 20 20 20 20 69 6e 52 65 67 2c 20 74 61         inReg, ta
1c8c0 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20  rget+i);.    }. 
1c8d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
1c8e0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1c8f0 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45 54 57   code for a BETW
1c900 45 45 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  EEN operator..**
1c910 0a 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e  .**    x BETWEEN
1c920 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54   y AND z.**.** T
1c930 68 65 20 61 62 6f 76 65 20 69 73 20 65 71 75 69  he above is equi
1c940 76 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a  valent to .**.**
1c950 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d      x>=y AND x<=
1c960 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20  z.**.** Code it 
1c970 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20  as such, taking 
1c980 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63  care to do the c
1c990 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73  ommon subexpress
1c9a0 69 6f 6e 0a 2a 2a 20 65 6c 65 6d 65 6e 74 61 74  ion.** elementat
1c9b0 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2f 0a 73 74 61  ion of x..*/.sta
1c9c0 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64  tic void exprCod
1c9d0 65 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73  eBetween(.  Pars
1c9e0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
1c9f0 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
1ca00 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
1ca10 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
1ca20 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
1ca30 68 65 20 42 45 54 57 45 45 4e 20 65 78 70 72 65  he BETWEEN expre
1ca40 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64  ssion */.  int d
1ca50 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  est,         /* 
1ca60 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65  Jump here if the
1ca70 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 2a   jump is taken *
1ca80 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 54 72  /.  int jumpIfTr
1ca90 75 65 2c 20 20 20 2f 2a 20 54 61 6b 65 20 74 68  ue,   /* Take th
1caa0 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45  e jump if the BE
1cab0 54 57 45 45 4e 20 69 73 20 74 72 75 65 20 2a 2f  TWEEN is true */
1cac0 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  .  int jumpIfNul
1cad0 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20 74 68 65  l    /* Take the
1cae0 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45 54   jump if the BET
1caf0 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a  WEEN is NULL */.
1cb00 29 7b 0a 20 20 45 78 70 72 20 65 78 70 72 41 6e  ){.  Expr exprAn
1cb10 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 41 4e  d;     /* The AN
1cb20 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 20 78  D operator in  x
1cb30 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f  >=y AND x<=z  */
1cb40 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74  .  Expr compLeft
1cb50 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78 3e 3d  ;    /* The  x>=
1cb60 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70  y  term */.  Exp
1cb70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20 20 2f  r compRight;   /
1cb80 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74 65 72  * The  x<=z  ter
1cb90 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65 78 70 72  m */.  Expr expr
1cba0 58 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  X;       /* The 
1cbb0 20 78 20 20 73 75 62 65 78 70 72 65 73 73 69 6f   x  subexpressio
1cbc0 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  n */.  int regFr
1cbd0 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d 70  ee1 = 0; /* Temp
1cbe0 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73 74  orary use regist
1cbf0 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
1cc00 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1cc10 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
1cc20 65 6c 65 63 74 29 20 29 3b 0a 20 20 65 78 70 72  elect) );.  expr
1cc30 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66  X = *pExpr->pLef
1cc40 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70 20  t;.  exprAnd.op 
1cc50 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72  = TK_AND;.  expr
1cc60 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d  And.pLeft = &com
1cc70 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64  pLeft;.  exprAnd
1cc80 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52  .pRight = &compR
1cc90 69 67 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74  ight;.  compLeft
1cca0 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63  .op = TK_GE;.  c
1ccb0 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20  ompLeft.pLeft = 
1ccc0 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65  &exprX;.  compLe
1ccd0 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70  ft.pRight = pExp
1cce0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d  r->x.pList->a[0]
1ccf0 2e 70 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69  .pExpr;.  compRi
1cd00 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a  ght.op = TK_LE;.
1cd10 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66    compRight.pLef
1cd20 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f  t = &exprX;.  co
1cd30 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d  mpRight.pRight =
1cd40 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
1cd50 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65  >a[1].pExpr;.  e
1cd60 78 70 72 58 2e 69 54 61 62 6c 65 20 3d 20 73 71  xprX.iTable = sq
1cd70 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1cd80 70 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 58  p(pParse, &exprX
1cd90 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1cda0 65 78 70 72 58 2e 6f 70 20 3d 20 54 4b 5f 52 45  exprX.op = TK_RE
1cdb0 47 49 53 54 45 52 3b 0a 20 20 69 66 28 20 6a 75  GISTER;.  if( ju
1cdc0 6d 70 49 66 54 72 75 65 20 29 7b 0a 20 20 20 20  mpIfTrue ){.    
1cdd0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
1cde0 65 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41  e(pParse, &exprA
1cdf0 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  nd, dest, jumpIf
1ce00 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Null);.  }else{.
1ce10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1ce20 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 26  fFalse(pParse, &
1ce30 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a  exprAnd, dest, j
1ce40 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a  umpIfNull);.  }.
1ce50 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1ce60 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1ce70 72 65 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a  regFree1);..  /*
1ce80 20 45 6e 73 75 72 65 20 61 64 65 71 75 61 74 65   Ensure adequate
1ce90 20 74 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a   test coverage *
1cea0 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  /.  testcase( ju
1ceb0 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a  mpIfTrue==0 && j
1cec0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
1ced0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1cee0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1cef0 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70  fTrue==0 && jump
1cf00 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
1cf10 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
1cf20 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
1cf30 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue==0 && jumpIfN
1cf40 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
1cf50 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
1cf60 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d  ase( jumpIfTrue=
1cf70 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
1cf80 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  !=0 && regFree1!
1cf90 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
1cfa0 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20  ( jumpIfTrue!=0 
1cfb0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
1cfc0 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
1cfd0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  );.  testcase( j
1cfe0 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20  umpIfTrue!=0 && 
1cff0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
1d000 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
1d010 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1d020 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d  IfTrue!=0 && jum
1d030 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
1d040 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
1d050 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1d060 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue!=0 && jumpIf
1d070 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
1d080 65 65 31 21 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a  ee1!=0 );.}../*.
1d090 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1d0a0 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
1d0b0 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
1d0c0 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
1d0d0 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
1d0e0 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
1d0f0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
1d100 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  rue but executio
1d110 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
1d120 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
1d130 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
1d140 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  s false..**.** I
1d150 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1d160 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
1d170 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
1d180 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65   nor false), the
1d190 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75  n.** take the ju
1d1a0 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66  mp if the jumpIf
1d1b0 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c  Null flag is SQL
1d1c0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a  ITE_JUMPIFNULL..
1d1d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20  **.** This code 
1d1e0 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66  depends on the f
1d1f0 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e  act that certain
1d200 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65   token values (e
1d210 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65  x: TK_EQ).** are
1d220 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63   the same as opc
1d230 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ode values (ex: 
1d240 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c  OP_Eq) that impl
1d250 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73  ement the corres
1d260 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  ponding.** opera
1d270 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63  tion.  Special c
1d280 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e  omments in vdbe.
1d290 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f  c and the mkopco
1d2a0 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69  deh.awk script i
1d2b0 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72  n.** the make pr
1d2c0 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73  ocess cause thes
1d2d0 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67  e values to alig
1d2e0 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e  n.  Assert()s in
1d2f0 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c   the code.** bel
1d300 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74  ow verify that t
1d310 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  he numbers are a
1d320 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79  ligned correctly
1d330 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1d340 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73  3ExprIfTrue(Pars
1d350 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1d360 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
1d370 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
1d380 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1d390 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1d3a0 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
1d3b0 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a  t regFree1 = 0;.
1d3c0 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
1d3d0 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   0;.  int r1, r2
1d3e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d  ;..  assert( jum
1d3f0 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
1d400 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75  JUMPIFNULL || ju
1d410 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1d420 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
1d430 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20   )     return;  
1d440 2f 2a 20 45 78 69 73 74 61 6e 63 65 20 6f 66 20  /* Existance of 
1d450 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20  VDBE checked by 
1d460 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20  caller */.  if( 
1d470 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20  NEVER(pExpr==0) 
1d480 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f  ) return;  /* No
1d490 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61   way this can ha
1d4a0 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70  ppen */.  op = p
1d4b0 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74  Expr->op;.  swit
1d4c0 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
1d4d0 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20  se TK_AND: {.   
1d4e0 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
1d4f0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1d500 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  (v);.      testc
1d510 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1d520 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1d530 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
1d540 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1d550 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1d560 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
1d570 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70  ->pLeft, d2,jump
1d580 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55  IfNull^SQLITE_JU
1d590 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
1d5a0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
1d5b0 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
1d5c0 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
1d5d0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1d5e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1d5f0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
1d600 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1d610 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
1d620 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 62  rse, 1);.      b
1d630 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1d640 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
1d650 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1d660 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1d670 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1d680 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
1d690 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
1d6a0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1d6b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1d6c0 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
1d6d0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
1d6e0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1d6f0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1d700 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1d710 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  _NOT: {.      te
1d720 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1d730 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
1d740 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1d750 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1d760 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
1d770 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1d780 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1d790 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
1d7a0 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
1d7b0 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
1d7c0 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
1d7d0 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
1d7e0 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
1d7f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1d800 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20  _LT==OP_Lt );.  
1d810 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
1d820 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20  E==OP_Le );.    
1d830 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d    assert( TK_GT=
1d840 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20  =OP_Gt );.      
1d850 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f  assert( TK_GE==O
1d860 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Ge );.      as
1d870 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f  sert( TK_EQ==OP_
1d880 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Eq );.      asse
1d890 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  rt( TK_NE==OP_Ne
1d8a0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1d8b0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b  se( op==TK_LT );
1d8c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d8d0 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20   op==TK_LE );.  
1d8e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1d8f0 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20  ==TK_GT );.     
1d900 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1d910 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_GE );.      te
1d920 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45  stcase( op==TK_E
1d930 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Q );.      testc
1d940 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29  ase( op==TK_NE )
1d950 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1d960 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1d970 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1d980 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1d990 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1d9a0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1d9b0 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
1d9c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1d9d0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1d9e0 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
1d9f0 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
1da00 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
1da10 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
1da20 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
1da30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1da40 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
1da50 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1da60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1da70 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1da80 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1da90 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
1daa0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1dab0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20     case TK_IS:. 
1dac0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
1dad0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1dae0 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  se( op==TK_IS );
1daf0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1db00 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b   op==TK_ISNOT );
1db10 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1db20 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1db30 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1db40 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1db50 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
1db60 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1db70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1db80 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
1db90 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28  2);.      op = (
1dba0 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f  op==TK_IS) ? TK_
1dbb0 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20  EQ : TK_NE;.    
1dbc0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
1dbd0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1dbe0 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
1dbf0 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
1dc00 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
1dc10 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e 55   dest, SQLITE_NU
1dc20 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73  LLEQ);.      tes
1dc30 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1dc40 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1dc50 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1dc60 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1dc70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1dc80 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
1dc90 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
1dca0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1dcb0 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
1dcc0 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61  sNull );.      a
1dcd0 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
1dce0 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
1dcf0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1dd00 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
1dd10 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1dd20 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ( op==TK_NOTNULL
1dd30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
1dd40 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1dd50 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1dd60 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1dd70 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
1dd80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1dd90 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20  op, r1, dest);. 
1dda0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1ddb0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1ddc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ddd0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
1dde0 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  WEEN: {.      te
1ddf0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1de00 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  ll==0 );.      e
1de10 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70  xprCodeBetween(p
1de20 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
1de30 73 74 2c 20 31 2c 20 6a 75 6d 70 49 66 4e 75 6c  st, 1, jumpIfNul
1de40 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
1de50 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1de60 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1de70 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
1de80 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
1de90 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71  destIfFalse = sq
1dea0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1deb0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  el(v);.      int
1dec0 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75   destIfNull = ju
1ded0 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20  mpIfNull ? dest 
1dee0 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20  : destIfFalse;. 
1def0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1df00 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
1df10 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73  Expr, destIfFals
1df20 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  e, destIfNull);.
1df30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1df40 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1df50 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20  to, 0, dest);.  
1df60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1df70 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
1df80 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
1df90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1dfa0 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75  #endif.    defau
1dfb0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d  lt: {.      r1 =
1dfc0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1dfd0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1dfe0 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pr, &regFree1);.
1dff0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e000 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
1e010 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
1e020 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
1e030 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1e040 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1e050 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1e060 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1e070 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1e080 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
1e090 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1e0a0 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
1e0b0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1e0c0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1e0d0 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a  gFree2);  .}../*
1e0e0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1e0f0 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
1e100 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
1e110 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
1e120 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
1e130 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
1e140 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1e150 66 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74  false but execut
1e160 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
1e170 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
1e180 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1e190 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20   is true..**.** 
1e1a0 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
1e1b0 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
1e1c0 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
1e1d0 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65  e nor false) the
1e1e0 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d  n.** jump if jum
1e1f0 70 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54  pIfNull is SQLIT
1e200 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20  E_JUMPIFNULL or 
1e210 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20  fall through if 
1e220 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73  jumpIfNull.** is
1e230 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69   0..*/.void sqli
1e240 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 50  te3ExprIfFalse(P
1e250 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1e260 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
1e270 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
1e280 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
1e290 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1e2a0 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
1e2b0 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
1e2c0 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
1e2d0 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c  2 = 0;.  int r1,
1e2e0 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   r2;..  assert( 
1e2f0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
1e300 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c  TE_JUMPIFNULL ||
1e310 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1e320 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
1e330 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a  =0) ) return; /*
1e340 20 45 78 69 73 74 61 6e 63 65 20 6f 66 20 56 44   Existance of VD
1e350 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61  BE checked by ca
1e360 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45  ller */.  if( pE
1e370 78 70 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75  xpr==0 )    retu
1e380 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61  rn;..  /* The va
1e390 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70  lue of pExpr->op
1e3a0 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61   and op are rela
1e3b0 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
1e3c0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
1e3d0 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20  pExpr->op       
1e3e0 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20       op.  **    
1e3f0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20     ---------    
1e400 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d        ----------
1e410 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49  .  **       TK_I
1e420 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f  SNULL          O
1e430 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20  P_NotNull.  **  
1e440 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20       TK_NOTNULL 
1e450 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c          OP_IsNul
1e460 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  l.  **       TK_
1e470 4e 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  NE              
1e480 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Eq.  **      
1e490 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20   TK_EQ          
1e4a0 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20      OP_Ne.  **  
1e4b0 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20       TK_GT      
1e4c0 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20          OP_Le.  
1e4d0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20  **       TK_LE  
1e4e0 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47              OP_G
1e4f0 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  t.  **       TK_
1e500 47 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  GE              
1e510 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Lt.  **      
1e520 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20   TK_LT          
1e530 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20      OP_Ge.  **. 
1e540 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61   ** For other va
1e550 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f  lues of pExpr->o
1e560 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e  p, op is undefin
1e570 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20  ed and unused.. 
1e580 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   ** The value of
1e590 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e   TK_ and OP_ con
1e5a0 73 74 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e  stants are arran
1e5b0 67 65 64 20 73 75 63 68 20 74 68 61 74 20 77 65  ged such that we
1e5c0 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74  .  ** can comput
1e5d0 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62  e the mapping ab
1e5e0 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f  ove using the fo
1e5f0 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69  llowing expressi
1e600 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28  on..  ** Assert(
1e610 29 73 20 76 65 72 69 66 79 20 74 68 61 74 20 74  )s verify that t
1e620 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69  he computation i
1e630 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a  s correct..  */.
1e640 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e    op = ((pExpr->
1e650 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29  op+(TK_ISNULL&1)
1e660 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26  )^1)-(TK_ISNULL&
1e670 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79  1);..  /* Verify
1e680 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65   correct alignme
1e690 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50  nt of TK_ and OP
1e6a0 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f  _ constants.  */
1e6b0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1e6c0 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ->op!=TK_ISNULL 
1e6d0 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  || op==OP_NotNul
1e6e0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
1e6f0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54  Expr->op!=TK_NOT
1e700 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49  NULL || op==OP_I
1e710 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  sNull );.  asser
1e720 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1e730 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71  _NE || op==OP_Eq
1e740 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1e750 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c  xpr->op!=TK_EQ |
1e760 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20  | op==OP_Ne );. 
1e770 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1e780 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d  op!=TK_LT || op=
1e790 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Ge );.  asse
1e7a0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1e7b0 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47  K_LE || op==OP_G
1e7c0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
1e7d0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20  Expr->op!=TK_GT 
1e7e0 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  || op==OP_Le );.
1e7f0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1e800 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70  >op!=TK_GE || op
1e810 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77  ==OP_Lt );..  sw
1e820 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
1e830 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
1e840 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  ND: {.      test
1e850 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1e860 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1e870 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1e880 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1e890 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
1e8a0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
1e8b0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1e8c0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1e8d0 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
1e8e0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1e8f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1e900 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
1e910 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20  .      int d2 = 
1e920 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1e930 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74  abel(v);.      t
1e940 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1e950 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1e960 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1e970 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
1e980 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1e990 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
1e9a0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20  xpr->pLeft, d2, 
1e9b0 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54  jumpIfNull^SQLIT
1e9c0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1e9d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1e9e0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1e9f0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
1ea00 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1ea10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1ea20 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1ea30 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71  v, d2);.      sq
1ea40 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1ea50 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20  p(pParse, 1);.  
1ea60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ea70 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
1ea80 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1ea90 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1eaa0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1eab0 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
1eac0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1ead0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1eae0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
1eaf0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1eb00 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
1eb10 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
1eb20 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
1eb30 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
1eb40 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
1eb50 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
1eb60 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1eb70 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65  K_LT );.      te
1eb80 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
1eb90 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
1eba0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29  ase( op==TK_GT )
1ebb0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ebc0 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20  ( op==TK_GE );. 
1ebd0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1ebe0 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20  p==TK_EQ );.    
1ebf0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1ec00 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_NE );.      t
1ec10 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1ec20 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1ec30 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1ec40 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1ec50 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1ec60 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1ec70 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1ec80 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1ec90 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1eca0 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1ecb0 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1ecc0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1ecd0 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
1ece0 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
1ecf0 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
1ed00 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1ed10 6c 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ll);.      testc
1ed20 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1ed30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1ed40 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
1ed50 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1ed60 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1ed70 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
1ed80 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20  K_ISNOT: {.     
1ed90 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
1eda0 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ->op==TK_IS );. 
1edb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1edc0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e  Expr->op==TK_ISN
1edd0 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  OT );.      r1 =
1ede0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1edf0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1ee00 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1ee10 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
1ee20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1ee30 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1ee40 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
1ee50 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f  gFree2);.      o
1ee60 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d  p = (pExpr->op==
1ee70 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a  TK_IS) ? TK_NE :
1ee80 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 63 6f   TK_EQ;.      co
1ee90 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
1eea0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1eeb0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
1eec0 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
1eed0 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
1eee0 74 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  t, SQLITE_NULLEQ
1eef0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1ef00 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1ef10 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ef20 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1ef30 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ef40 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1ef50 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
1ef60 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
1ef70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1ef80 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a  p==TK_ISNULL );.
1ef90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1efa0 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
1efb0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
1efc0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1efd0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1efe0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1eff0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f000 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
1f010 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  , r1, dest);.   
1f020 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1f030 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1f040 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1f050 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
1f060 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  EN: {.      test
1f070 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1f080 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70  ==0 );.      exp
1f090 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61  rCodeBetween(pPa
1f0a0 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
1f0b0 2c 20 30 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  , 0, jumpIfNull)
1f0c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1f0d0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1f0e0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1f0f0 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  Y.    case TK_IN
1f100 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75  : {.      if( ju
1f110 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  mpIfNull ){.    
1f120 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1f130 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
1f140 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29  xpr, dest, dest)
1f150 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1f160 20 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49         int destI
1f170 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56  fNull = sqlite3V
1f180 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1f190 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f1a0 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
1f1b0 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
1f1c0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
1f1d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f1e0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1f1f0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
1f200 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
1f210 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1f220 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
1f230 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1f240 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1f250 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67  rse, pExpr, &reg
1f260 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71  Free1);.      sq
1f270 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1f280 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c  v, OP_IfNot, r1,
1f290 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1f2a0 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 74 65 73  l!=0);.      tes
1f2b0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1f2c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1f2d0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1f2e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1f2f0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
1f300 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1f310 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1f320 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
1f330 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1f340 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
1f350 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  2);.}../*.** Do 
1f360 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f  a deep compariso
1f370 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73  n of two express
1f380 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75  ion trees.  Retu
1f390 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a  rn 0 if the two.
1f3a0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  ** expressions a
1f3b0 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64  re completely id
1f3c0 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e  entical.  Return
1f3d0 20 31 20 69 66 20 74 68 65 79 20 64 69 66 66 65   1 if they diffe
1f3e0 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43  r only.** by a C
1f3f0 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20  OLLATE operator 
1f400 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c  at the top level
1f410 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66 20 74  .  Return 2 if t
1f420 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65  here are differe
1f430 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68  nces.** other th
1f440 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  an the top-level
1f450 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
1f460 72 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  r..**.** Sometim
1f470 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  es this routine 
1f480 77 69 6c 6c 20 72 65 74 75 72 6e 20 32 20 65 76  will return 2 ev
1f490 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65 78  en if the two ex
1f4a0 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61  pressions.** rea
1f4b0 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c 65  lly are equivale
1f4c0 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f  nt.  If we canno
1f4d0 74 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65  t prove that the
1f4e0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
1f4f0 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77  .** identical, w
1f500 65 20 72 65 74 75 72 6e 20 32 20 6a 75 73 74 20  e return 2 just 
1f510 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20  to be safe.  So 
1f520 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  if this routine.
1f530 2a 2a 20 72 65 74 75 72 6e 73 20 32 2c 20 74 68  ** returns 2, th
1f540 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65  en you do not re
1f550 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65  ally know for ce
1f560 72 74 61 69 6e 20 69 66 20 74 68 65 20 74 77 6f  rtain if the two
1f570 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
1f580 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42  are the same.  B
1f590 75 74 20 69 66 20 79 6f 75 20 67 65 74 20 61 20  ut if you get a 
1f5a0 30 20 6f 72 20 31 20 72 65 74 75 72 6e 2c 20 74  0 or 1 return, t
1f5b0 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62  hen you.** can b
1f5c0 65 20 73 75 72 65 20 74 68 65 20 65 78 70 72 65  e sure the expre
1f5d0 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73  ssions are the s
1f5e0 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61  ame.  In the pla
1f5f0 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69  ces where.** thi
1f600 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
1f610 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68  d, it does not h
1f620 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78  urt to get an ex
1f630 74 72 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20  tra 2 - that.** 
1f640 6a 75 73 74 20 6d 69 67 68 74 20 72 65 73 75 6c  just might resul
1f650 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74  t in some slight
1f660 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20  ly slower code. 
1f670 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a   But returning.*
1f680 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 30  * an incorrect 0
1f690 20 6f 72 20 31 20 63 6f 75 6c 64 20 6c 65 61 64   or 1 could lead
1f6a0 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f   to a malfunctio
1f6b0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
1f6c0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70  3ExprCompare(Exp
1f6d0 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 29  r *pA, Expr *pB)
1f6e0 7b 0a 20 20 69 66 28 20 70 41 3d 3d 30 7c 7c 70  {.  if( pA==0||p
1f6f0 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  B==0 ){.    retu
1f700 72 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20  rn pB==pA ? 0 : 
1f710 32 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  2;.  }.  assert(
1f720 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70   !ExprHasAnyProp
1f730 65 72 74 79 28 70 41 2c 20 45 50 5f 54 6f 6b 65  erty(pA, EP_Toke
1f740 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
1f750 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
1f760 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
1f770 74 79 28 70 42 2c 20 45 50 5f 54 6f 6b 65 6e 4f  ty(pB, EP_TokenO
1f780 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
1f790 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  );.  if( ExprHas
1f7a0 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45 50 5f  Property(pA, EP_
1f7b0 78 49 73 53 65 6c 65 63 74 29 20 7c 7c 20 45 78  xIsSelect) || Ex
1f7c0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 42  prHasProperty(pB
1f7d0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1f7e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b  ){.    return 2;
1f7f0 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e  .  }.  if( (pA->
1f800 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
1f810 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73  nct)!=(pB->flags
1f820 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20   & EP_Distinct) 
1f830 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66  ) return 2;.  if
1f840 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70  ( pA->op!=pB->op
1f850 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69   ) return 2;.  i
1f860 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
1f870 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c  mpare(pA->pLeft,
1f880 20 70 42 2d 3e 70 4c 65 66 74 29 20 29 20 72 65   pB->pLeft) ) re
1f890 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 73 71  turn 2;.  if( sq
1f8a0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
1f8b0 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d  (pA->pRight, pB-
1f8c0 3e 70 52 69 67 68 74 29 20 29 20 72 65 74 75 72  >pRight) ) retur
1f8d0 6e 20 32 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 2;.  if( sqlit
1f8e0 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
1f8f0 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70  e(pA->x.pList, p
1f900 42 2d 3e 78 2e 70 4c 69 73 74 29 20 29 20 72 65  B->x.pList) ) re
1f910 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 70 41  turn 2;.  if( pA
1f920 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54  ->iTable!=pB->iT
1f930 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c  able || pA->iCol
1f940 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e  umn!=pB->iColumn
1f950 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69   ) return 2;.  i
1f960 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
1f970 74 79 28 70 41 2c 20 45 50 5f 49 6e 74 56 61 6c  ty(pA, EP_IntVal
1f980 75 65 29 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ue) ){.    if( !
1f990 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1f9a0 70 42 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pB, EP_IntValue)
1f9b0 20 7c 7c 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65   || pA->u.iValue
1f9c0 21 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29  !=pB->u.iValue )
1f9d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32  {.      return 2
1f9e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
1f9f0 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43  if( pA->op!=TK_C
1fa00 4f 4c 55 4d 4e 20 26 26 20 41 4c 57 41 59 53 28  OLUMN && ALWAYS(
1fa10 70 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43  pA->op!=TK_AGG_C
1fa20 4f 4c 55 4d 4e 29 20 26 26 20 70 41 2d 3e 75 2e  OLUMN) && pA->u.
1fa30 7a 54 6f 6b 65 6e 29 7b 0a 20 20 20 20 69 66 28  zToken){.    if(
1fa40 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1fa50 28 70 42 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  (pB, EP_IntValue
1fa60 29 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 75  ) || NEVER(pB->u
1fa70 2e 7a 54 6f 6b 65 6e 3d 3d 30 29 20 29 20 72 65  .zToken==0) ) re
1fa80 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
1fa90 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f  strcmp(pA->u.zTo
1faa0 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e  ken,pB->u.zToken
1fab0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
1fac0 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
1fad0 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61  }.  if( (pA->fla
1fae0 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61  gs & EP_ExpColla
1faf0 74 65 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20  te)!=(pB->flags 
1fb00 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29  & EP_ExpCollate)
1fb10 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1fb20 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20  f( (pA->flags & 
1fb30 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 21 3d  EP_ExpCollate)!=
1fb40 30 20 26 26 20 70 41 2d 3e 70 43 6f 6c 6c 21 3d  0 && pA->pColl!=
1fb50 70 42 2d 3e 70 43 6f 6c 6c 20 29 20 72 65 74 75  pB->pColl ) retu
1fb60 72 6e 20 32 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 2;.  return 0
1fb70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
1fb80 72 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20  re two ExprList 
1fb90 6f 62 6a 65 63 74 73 2e 20 20 52 65 74 75 72 6e  objects.  Return
1fba0 20 30 20 69 66 20 74 68 65 79 20 61 72 65 20 69   0 if they are i
1fbb0 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a  dentical and .**
1fbc0 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
1fbd0 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20  y differ in any 
1fbe0 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  way..**.** This 
1fbf0 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65  routine might re
1fc00 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f  turn non-zero fo
1fc10 72 20 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70  r equivalent Exp
1fc20 72 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20  rLists.  The.** 
1fc30 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65  only consequence
1fc40 20 77 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65   will be disable
1fc50 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e  d optimizations.
1fc60 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69    But this routi
1fc70 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72  ne.** must never
1fc80 20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   return 0 if the
1fc90 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62   two ExprList ob
1fca0 6a 65 63 74 73 20 61 72 65 20 64 69 66 66 65 72  jects are differ
1fcb0 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c  ent, or.** a mal
1fcc0 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65  function will re
1fcd0 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20  sult..**.** Two 
1fce0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72  NULL pointers ar
1fcf0 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
1fd00 62 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75  be the same.  Bu
1fd10 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  t a NULL pointer
1fd20 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65  .** always diffe
1fd30 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55  rs from a non-NU
1fd40 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69  LL pointer..*/.i
1fd50 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  nt sqlite3ExprLi
1fd60 73 74 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69  stCompare(ExprLi
1fd70 73 74 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74  st *pA, ExprList
1fd80 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   *pB){.  int i;.
1fd90 20 20 69 66 28 20 70 41 3d 3d 30 20 26 26 20 70    if( pA==0 && p
1fda0 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  B==0 ) return 0;
1fdb0 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20  .  if( pA==0 || 
1fdc0 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  pB==0 ) return 1
1fdd0 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45 78 70  ;.  if( pA->nExp
1fde0 72 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20 72  r!=pB->nExpr ) r
1fdf0 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69  eturn 1;.  for(i
1fe00 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b  =0; i<pA->nExpr;
1fe10 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
1fe20 2a 70 45 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b  *pExprA = pA->a[
1fe30 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78  i].pExpr;.    Ex
1fe40 70 72 20 2a 70 45 78 70 72 42 20 3d 20 70 42 2d  pr *pExprB = pB-
1fe50 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
1fe60 20 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f   if( pA->a[i].so
1fe70 72 74 4f 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69  rtOrder!=pB->a[i
1fe80 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65  ].sortOrder ) re
1fe90 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20  turn 1;.    if( 
1fea0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
1feb0 72 65 28 70 45 78 70 72 41 2c 20 70 45 78 70 72  re(pExprA, pExpr
1fec0 42 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  B) ) return 1;. 
1fed0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1fee0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
1fef0 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1ff00 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
1ff10 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72  s used by the tr
1ff20 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20  ee walker.** to 
1ff30 63 6f 75 6e 74 20 72 65 66 65 72 65 6e 63 65 73  count references
1ff40 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e   to table column
1ff50 73 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  s in the argumen
1ff60 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67  ts of an .** agg
1ff70 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c  regate function,
1ff80 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70   in order to imp
1ff90 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71  lement the.** sq
1ffa0 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 54 68 69  lite3FunctionThi
1ffb0 73 53 72 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a  sSrc() routine..
1ffc0 2a 2f 0a 73 74 72 75 63 74 20 53 72 63 43 6f 75  */.struct SrcCou
1ffd0 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  nt {.  SrcList *
1ffe0 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70  pSrc;   /* One p
1fff0 61 72 74 69 63 75 6c 61 72 20 46 52 4f 4d 20 63  articular FROM c
20000 6c 61 75 73 65 20 69 6e 20 61 20 6e 65 73 74 65  lause in a neste
20010 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  d query */.  int
20020 20 6e 54 68 69 73 3b 20 20 20 20 20 20 20 2f 2a   nThis;       /*
20030 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   Number of refer
20040 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
20050 20 69 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a   in pSrcList */.
20060 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20    int nOther;   
20070 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20080 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
20090 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20 46  lumns in other F
200a0 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d  ROM clauses */.}
200b0 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74  ;../*.** Count t
200c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
200d0 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
200e0 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
200f0 74 20 65 78 70 72 53 72 63 43 6f 75 6e 74 28 57  t exprSrcCount(W
20100 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
20110 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
20120 2f 2a 20 54 68 65 20 4e 45 56 45 52 28 29 20 6f  /* The NEVER() o
20130 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 74 65 72  n the second ter
20140 6d 20 69 73 20 62 65 63 61 75 73 65 20 73 71 6c  m is because sql
20150 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73  ite3FunctionUses
20160 54 68 69 73 53 72 63 28 29 0a 20 20 2a 2a 20 69  ThisSrc().  ** i
20170 73 20 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20  s always called 
20180 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 45 78  before sqlite3Ex
20190 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
201a0 74 65 73 28 29 20 61 6e 64 20 73 6f 20 74 68 65  tes() and so the
201b0 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73  .  ** TK_COLUMNs
201c0 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65   have not yet be
201d0 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  en converted int
201e0 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e  o TK_AGG_COLUMN.
201f0 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65    If.  ** sqlite
20200 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69  3FunctionUsesThi
20210 73 53 72 63 28 29 20 69 73 20 75 73 65 64 20 64  sSrc() is used d
20220 69 66 66 65 72 65 6e 74 6c 79 20 69 6e 20 74 68  ifferently in th
20230 65 20 66 75 74 75 72 65 2c 20 74 68 65 0a 20 20  e future, the.  
20240 2a 2a 20 4e 45 56 45 52 28 29 20 77 69 6c 6c 20  ** NEVER() will 
20250 6e 65 65 64 20 74 6f 20 62 65 20 72 65 6d 6f 76  need to be remov
20260 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  ed. */.  if( pEx
20270 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
20280 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45 78 70 72  N || NEVER(pExpr
20290 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
202a0 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  UMN) ){.    int 
202b0 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  i;.    struct Sr
202c0 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c  cCount *p = pWal
202d0 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74  ker->u.pSrcCount
202e0 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  ;.    SrcList *p
202f0 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
20300 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53     for(i=0; i<pS
20310 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  rc->nSrc; i++){.
20320 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
20330 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61  >iTable==pSrc->a
20340 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72  [i].iCursor ) br
20350 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
20360 66 28 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 20  f( i<pSrc->nSrc 
20370 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 68 69  ){.      p->nThi
20380 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  s++;.    }else{.
20390 20 20 20 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b        p->nOther+
203a0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  +;.    }.  }.  r
203b0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
203c0 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  ue;.}../*.** Det
203d0 65 72 6d 69 6e 65 20 69 66 20 61 6e 79 20 6f 66  ermine if any of
203e0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74   the arguments t
203f0 6f 20 74 68 65 20 70 45 78 70 72 20 46 75 6e 63  o the pExpr Func
20400 74 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a  tion reference.*
20410 2a 20 70 53 72 63 4c 69 73 74 2e 20 20 52 65 74  * pSrcList.  Ret
20420 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 79  urn true if they
20430 20 64 6f 2e 20 20 41 6c 73 6f 20 72 65 74 75 72   do.  Also retur
20440 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 66 75  n true if the fu
20450 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f  nction.** has no
20460 20 61 72 67 75 6d 65 6e 74 73 20 6f 72 20 68 61   arguments or ha
20470 73 20 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20  s only constant 
20480 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75  arguments.  Retu
20490 72 6e 20 66 61 6c 73 65 20 69 66 20 70 45 78 70  rn false if pExp
204a0 72 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20  r.** references 
204b0 63 6f 6c 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20  columns but not 
204c0 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65  columns of table
204d0 73 20 66 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c  s found in pSrcL
204e0 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ist..*/.int sqli
204f0 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54  te3FunctionUsesT
20500 68 69 73 53 72 63 28 45 78 70 72 20 2a 70 45 78  hisSrc(Expr *pEx
20510 70 72 2c 20 53 72 63 4c 69 73 74 20 2a 70 53 72  pr, SrcList *pSr
20520 63 4c 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72  cList){.  Walker
20530 20 77 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63   w;.  struct Src
20540 43 6f 75 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73  Count cnt;.  ass
20550 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
20560 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
20570 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  );.  memset(&w, 
20580 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
20590 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
205a0 20 3d 20 65 78 70 72 53 72 63 43 6f 75 6e 74 3b   = exprSrcCount;
205b0 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74  .  w.u.pSrcCount
205c0 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70   = &cnt;.  cnt.p
205d0 53 72 63 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a  Src = pSrcList;.
205e0 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b    cnt.nThis = 0;
205f0 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20  .  cnt.nOther = 
20600 30 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  0;.  sqlite3Walk
20610 45 78 70 72 4c 69 73 74 28 26 77 2c 20 70 45 78  ExprList(&w, pEx
20620 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
20630 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73  return cnt.nThis
20640 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72  >0 || cnt.nOther
20650 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  ==0;.}../*.** Ad
20660 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
20670 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d  to the pAggInfo-
20680 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20  >aCol[] array.  
20690 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
206a0 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
206b0 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
206c0 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
206d0 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
206e0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
206f0 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
20700 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  n(sqlite3 *db, A
20710 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
20720 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
20730 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  ->aCol = sqlite3
20740 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
20750 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20        db,.      
20760 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20   pInfo->aCol,.  
20770 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
20780 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20  o->aCol[0]),.   
20790 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c      &pInfo->nCol
207a0 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a 20  umn,.       &i. 
207b0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a   );.  return i;.
207c0 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  }    ../*.** Add
207d0 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
207e0 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e  o the pAggInfo->
207f0 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20  aFunc[] array.  
20800 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
20810 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
20820 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
20830 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
20840 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
20850 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
20860 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
20870 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67  sqlite3 *db, Agg
20880 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  Info *pInfo){.  
20890 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e  int i;.  pInfo->
208a0 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41  aFunc = sqlite3A
208b0 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
208c0 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20       db, .      
208d0 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20   pInfo->aFunc,. 
208e0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e        sizeof(pIn
208f0 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20  fo->aFunc[0]),. 
20900 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46        &pInfo->nF
20910 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20  unc,.       &i. 
20920 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a   );.  return i;.
20930 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  }    ../*.** Thi
20940 73 20 69 73 20 74 68 65 20 78 45 78 70 72 43 61  s is the xExprCa
20950 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74 72 65  llback for a tre
20960 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20 69 73  e walker.  It is
20970 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c   used to.** impl
20980 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45 78 70  ement sqlite3Exp
20990 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
209a0 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74  es().  See sqlit
209b0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
209c0 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61  regates.** for a
209d0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
209e0 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
209f0 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72   int analyzeAggr
20a00 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a 70 57  egate(Walker *pW
20a10 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
20a20 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pr){.  int i;.  
20a30 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
20a40 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e   = pWalker->u.pN
20a50 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  C;.  Parse *pPar
20a60 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
20a70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ;.  SrcList *pSr
20a80 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  cList = pNC->pSr
20a90 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f  cList;.  AggInfo
20aa0 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43   *pAggInfo = pNC
20ab0 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73  ->pAggInfo;..  s
20ac0 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
20ad0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
20ae0 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
20af0 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
20b00 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
20b10 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
20b20 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  AGG_COLUMN );.  
20b30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
20b40 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
20b50 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43  MN );.      /* C
20b60 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
20b70 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20  he column is in 
20b80 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  one of the table
20b90 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20  s in the FROM.  
20ba0 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66      ** clause of
20bb0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71   the aggregate q
20bc0 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66  uery */.      if
20bd0 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73  ( ALWAYS(pSrcLis
20be0 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  t!=0) ){.       
20bf0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
20c00 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53  item *pItem = pS
20c10 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  rcList->a;.     
20c20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53     for(i=0; i<pS
20c30 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  rcList->nSrc; i+
20c40 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
20c50 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
20c60 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b  gInfo_col *pCol;
20c70 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
20c80 74 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72  t( !ExprHasAnyPr
20c90 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
20ca0 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
20cb0 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20  duced) );.      
20cc0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
20cd0 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43  Table==pItem->iC
20ce0 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  ursor ){.       
20cf0 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65       /* If we re
20d00 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
20d10 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45  it means that pE
20d20 78 70 72 20 72 65 66 65 72 73 20 74 6f 20 61 20  xpr refers to a 
20d30 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  table.          
20d40 20 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20    ** that is in 
20d50 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
20d60 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
20d70 20 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20   query.  .      
20d80 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
20d90 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20       ** Make an 
20da0 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f  entry for the co
20db0 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f  lumn in pAggInfo
20dc0 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72  ->aCol[] if ther
20dd0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
20de0 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79   is not an entry
20df0 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
20e00 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
20e10 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b             int k
20e20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
20e30 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  ol = pAggInfo->a
20e40 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Col;.           
20e50 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67   for(k=0; k<pAgg
20e60 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b  Info->nColumn; k
20e70 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
20e80 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
20e90 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78  Col->iTable==pEx
20ea0 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20  pr->iTable &&.  
20eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ec0 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  pCol->iColumn==p
20ed0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  Expr->iColumn ){
20ee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20ef0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
20f00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20f10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
20f20 20 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e    if( (k>=pAggIn
20f30 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20  fo->nColumn).   
20f40 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6b 20            && (k 
20f50 3d 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75  = addAggInfoColu
20f60 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  mn(pParse->db, p
20f70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20  AggInfo))>=0 .  
20f80 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
20f90 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
20fa0 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  = &pAggInfo->aCo
20fb0 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[k];.          
20fc0 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d      pCol->pTab =
20fd0 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20   pExpr->pTab;.  
20fe0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
20ff0 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72  ->iTable = pExpr
21000 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
21010 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43          pCol->iC
21020 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69  olumn = pExpr->i
21030 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
21040 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d        pCol->iMem
21050 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
21060 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m;.             
21070 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
21080 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
21090 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70           pCol->p
210a0 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
210b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
210c0 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70  pAggInfo->pGroup
210d0 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  By ){.          
210e0 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a        int j, n;.
210f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21100 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20  ExprList *pGB = 
21110 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70  pAggInfo->pGroup
21120 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  By;.            
21130 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
21140 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20  ist_item *pTerm 
21150 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20  = pGB->a;.      
21160 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47            n = pG
21170 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  B->nExpr;.      
21180 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
21190 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65  0; j<n; j++, pTe
211a0 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  rm++){.         
211b0 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
211c0 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  E = pTerm->pExpr
211d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
211e0 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
211f0 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d  TK_COLUMN && pE-
21200 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e  >iTable==pExpr->
21210 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20  iTable &&.      
21220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21230 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78  pE->iColumn==pEx
21240 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pr->iColumn ){. 
21250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21260 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
21270 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20  Column = j;.    
21280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21290 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
212a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
212b0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
212c0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
212d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
212e0 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
212f0 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  mn<0 ){.        
21300 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
21310 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41  orterColumn = pA
21320 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67  ggInfo->nSorting
21330 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20  Column++;.      
21340 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21350 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21360 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
21370 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72  now an entry for
21380 20 70 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e   pExpr in pAggIn
21390 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68  fo->aCol[] (eith
213a0 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  er.            *
213b0 2a 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73  * because it was
213c0 20 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72   there before or
213d0 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74   because we just
213e0 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20   created it)..  
213f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e            ** Con
21400 76 65 72 74 20 74 68 65 20 70 45 78 70 72 20 74  vert the pExpr t
21410 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f  o be a TK_AGG_CO
21420 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74  LUMN referring t
21430 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  o that.         
21440 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e     ** pAggInfo->
21450 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20  aCol[] entry..  
21460 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
21470 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74           ExprSet
21480 49 72 72 65 64 75 63 69 62 6c 65 28 70 45 78 70  Irreducible(pExp
21490 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
214a0 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20  pExpr->pAggInfo 
214b0 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  = pAggInfo;.    
214c0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
214d0 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  p = TK_AGG_COLUM
214e0 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  N;.            p
214f0 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31  Expr->iAgg = (i1
21500 36 29 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  6)k;.           
21510 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
21520 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78    } /* endif pEx
21530 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65  pr->iTable==pIte
21540 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20  m->iCursor */.  
21550 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c        } /* end l
21560 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73  oop over pSrcLis
21570 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  t */.      }.   
21580 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
21590 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  une;.    }.    c
215a0 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
215b0 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ION: {.      if(
215c0 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26   (pNC->ncFlags &
215d0 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 29 3d 3d   NC_InAggFunc)==
215e0 30 0a 20 20 20 20 20 20 20 26 26 20 70 57 61 6c  0.       && pWal
215f0 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68  ker->walkerDepth
21600 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a 20 20 20  ==pExpr->op2.   
21610 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
21620 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
21630 20 70 45 78 70 72 20 69 73 20 61 20 64 75 70 6c   pExpr is a dupl
21640 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72  icate of another
21650 20 61 67 67 72 65 67 61 74 65 20 0a 20 20 20 20   aggregate .    
21660 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
21670 74 68 61 74 20 69 73 20 61 6c 72 65 61 64 79 20  that is already 
21680 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f 20  in the pAggInfo 
21690 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 20 20  structure.      
216a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 72    */.        str
216b0 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
216c0 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e   *pItem = pAggIn
216d0 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20  fo->aFunc;.     
216e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41     for(i=0; i<pA
216f0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
21700 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
21710 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
21720 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
21730 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78  Item->pExpr, pEx
21740 70 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pr)==0 ){.      
21750 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
21760 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21770 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
21780 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  >=pAggInfo->nFun
21790 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
217a0 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69 67 69  * pExpr is origi
217b0 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77  nal.  Make a new
217c0 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e   entry in pAggIn
217d0 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20  fo->aFunc[].    
217e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
217f0 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28     u8 enc = ENC(
21800 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20  pParse->db);.   
21810 20 20 20 20 20 20 20 69 20 3d 20 61 64 64 41 67         i = addAg
21820 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73 65  gInfoFunc(pParse
21830 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b  ->db, pAggInfo);
21840 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
21850 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
21860 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
21870 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
21880 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
21890 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
218a0 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66  pItem = &pAggInf
218b0 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20  o->aFunc[i];.   
218c0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
218d0 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
218e0 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
218f0 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  ->iMem = ++pPars
21900 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
21910 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
21920 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
21930 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
21940 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
21950 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20   pItem->pFunc = 
21960 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
21970 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a  ion(pParse->db,.
21980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21990 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b     pExpr->u.zTok
219a0 65 6e 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  en, sqlite3Strle
219b0 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  n30(pExpr->u.zTo
219c0 6b 65 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ken),.          
219d0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
219e0 78 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d  x.pList ? pExpr-
219f0 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
21a00 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  : 0, enc, 0);.  
21a10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
21a20 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
21a30 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
21a40 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
21a50 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61  >iDistinct = pPa
21a60 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
21a70 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
21a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
21a90 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
21aa0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
21ab0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
21ac0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21ad0 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70   /* Make pExpr p
21ae0 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72  oint to the appr
21af0 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f  opriate pAggInfo
21b00 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a  ->aFunc[] entry.
21b10 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
21b20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
21b30 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
21b40 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
21b50 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
21b60 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 53 65  ;.        ExprSe
21b70 74 49 72 72 65 64 75 63 69 62 6c 65 28 70 45 78  tIrreducible(pEx
21b80 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78  pr);.        pEx
21b90 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29  pr->iAgg = (i16)
21ba0 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  i;.        pExpr
21bb0 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67  ->pAggInfo = pAg
21bc0 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  gInfo;.      }. 
21bd0 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
21be0 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  Prune;.    }.  }
21bf0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
21c00 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63  ntinue;.}.static
21c10 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72   int analyzeAggr
21c20 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57  egatesInSelect(W
21c30 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
21c40 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
21c50 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
21c60 45 54 45 52 28 70 57 61 6c 6b 65 72 29 3b 0a 20  ETER(pWalker);. 
21c70 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
21c80 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65  R(pSelect);.  re
21c90 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
21ca0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  e;.}../*.** Anal
21cb0 79 7a 65 20 74 68 65 20 67 69 76 65 6e 20 65 78  yze the given ex
21cc0 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67  pression looking
21cd0 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66   for aggregate f
21ce0 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  unctions and.** 
21cf0 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68  for variables th
21d00 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64  at need to be ad
21d10 64 65 64 20 74 6f 20 74 68 65 20 70 50 61 72 73  ded to the pPars
21d20 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 2e  e->aAgg[] array.
21d30 0a 2a 2a 20 4d 61 6b 65 20 61 64 64 69 74 69 6f  .** Make additio
21d40 6e 61 6c 20 65 6e 74 72 69 65 73 20 74 6f 20 74  nal entries to t
21d50 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  he pParse->aAgg[
21d60 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63 65 73  ] array as neces
21d70 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  sary..**.** This
21d80 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
21d90 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61  only be called a
21da0 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73  fter the express
21db0 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ion has been.** 
21dc0 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69  analyzed by sqli
21dd0 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
21de0 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  mes()..*/.void s
21df0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
21e00 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65  eAggregates(Name
21e10 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78  Context *pNC, Ex
21e20 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61  pr *pExpr){.  Wa
21e30 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74  lker w;.  memset
21e40 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
21e50 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  ));.  w.xExprCal
21e60 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41  lback = analyzeA
21e70 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78 53  ggregate;.  w.xS
21e80 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
21e90 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
21ea0 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e 75  sInSelect;.  w.u
21eb0 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61 73  .pNC = pNC;.  as
21ec0 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c  sert( pNC->pSrcL
21ed0 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ist!=0 );.  sqli
21ee0 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
21ef0 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExpr);.}../*.**
21f00 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70   Call sqlite3Exp
21f10 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
21f20 65 73 28 29 20 66 6f 72 20 65 76 65 72 79 20 65  es() for every e
21f30 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a  xpression in an.
21f40 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
21f50 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  st.  Return the 
21f60 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
21f70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
21f80 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  ror is found, th
21f90 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75  e analysis is cu
21fa0 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64  t short..*/.void
21fb0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
21fc0 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43  yzeAggList(NameC
21fd0 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70  ontext *pNC, Exp
21fe0 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
21ff0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
22000 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
22010 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
22020 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49  st ){.    for(pI
22030 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
22040 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
22050 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
22060 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
22070 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
22080 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d  ates(pNC, pItem-
22090 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  >pExpr);.    }. 
220a0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
220b0 63 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6e 65  cate a single ne
220c0 77 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 75  w register for u
220d0 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20  se to hold some 
220e0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
220f0 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ult..*/.int sqli
22100 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 50 61  te3GetTempReg(Pa
22110 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
22120 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  if( pParse->nTem
22130 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pReg==0 ){.    r
22140 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e  eturn ++pParse->
22150 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nMem;.  }.  retu
22160 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  rn pParse->aTemp
22170 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54  Reg[--pParse->nT
22180 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  empReg];.}../*.*
22190 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 72  * Deallocate a r
221a0 65 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20  egister, making 
221b0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65  available for re
221c0 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  use for some oth
221d0 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a  er.** purpose..*
221e0 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74  *.** If a regist
221f0 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
22200 62 65 69 6e 67 20 75 73 65 64 20 62 79 20 74 68  being used by th
22210 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c 20  e column cache, 
22220 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 61 6c 6c  then.** the dall
22230 6f 63 61 74 69 6f 6e 20 69 73 20 64 65 66 65 72  ocation is defer
22240 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 63 6f  red until the co
22250 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e 65 20  lumn cache line 
22260 74 68 61 74 20 75 73 65 73 0a 2a 2a 20 74 68 65  that uses.** the
22270 20 72 65 67 69 73 74 65 72 20 62 65 63 6f 6d 65   register become
22280 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  s stale..*/.void
22290 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
222a0 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50  empReg(Parse *pP
222b0 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b  arse, int iReg){
222c0 0a 20 20 69 66 28 20 69 52 65 67 20 26 26 20 70  .  if( iReg && p
222d0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c  Parse->nTempReg<
222e0 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65  ArraySize(pParse
222f0 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20  ->aTempReg) ){. 
22300 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74     int i;.    st
22310 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
22320 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  p;.    for(i=0, 
22330 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
22340 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
22350 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
22360 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
22370 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a  ->iReg==iReg ){.
22380 20 20 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52          p->tempR
22390 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  eg = 1;.        
223a0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
223b0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
223c0 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73  ->aTempReg[pPars
223d0 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d  e->nTempReg++] =
223e0 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   iReg;.  }.}../*
223f0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20  .** Allocate or 
22400 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f  deallocate a blo
22410 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73 65  ck of nReg conse
22420 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72 73  cutive registers
22430 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47  .*/.int sqlite3G
22440 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73  etTempRange(Pars
22450 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e  e *pParse, int n
22460 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e  Reg){.  int i, n
22470 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  i = pParse->
22480 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d  iRangeReg;.  n =
22490 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
224a0 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d  eg;.  if( nReg<=
224b0 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  n ){.    assert(
224c0 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61   !usedAsColumnCa
224d0 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69  che(pParse, i, i
224e0 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20 70 50 61  +n-1) );.    pPa
224f0 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b  rse->iRangeReg +
22500 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72  = nReg;.    pPar
22510 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d  se->nRangeReg -=
22520 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nReg;.  }else{.
22530 20 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e      i = pParse->
22540 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
22550 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67  se->nMem += nReg
22560 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
22570 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
22580 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
22590 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
225a0 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52  int iReg, int nR
225b0 65 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78  eg){.  sqlite3Ex
225c0 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
225d0 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 52 65 67  arse, iReg, nReg
225e0 29 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e 70 50  );.  if( nReg>pP
225f0 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
22600 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  ){.    pParse->n
22610 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67 3b  RangeReg = nReg;
22620 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61  .    pParse->iRa
22630 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a 20  ngeReg = iReg;. 
22640 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b   }.}../*.** Mark
22650 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 72   all temporary r
22660 65 67 69 73 74 65 72 73 20 61 73 20 62 65 69 6e  egisters as bein
22670 67 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 66 6f  g unavailable fo
22680 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64  r reuse..*/.void
22690 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d   sqlite3ClearTem
226a0 70 52 65 67 43 61 63 68 65 28 50 61 72 73 65 20  pRegCache(Parse 
226b0 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72  *pParse){.  pPar
226c0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30  se->nTempReg = 0
226d0 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e  ;.  pParse->nRan
226e0 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a           geReg = 0;.}.