/ Hex Artifact Content
Login

Artifact 6b50dcc885e8f898e6ba97457d1b2305b78cc8d0:


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 63 6f 6c 6c 61 74 69   Set the collati
0760: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
0770: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
0780: 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61   to be the colla
0790: 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
07a0: 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e   named by pToken
07b0: 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .   Return a poi
07c0: 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 45 78  nter to a new Ex
07d0: 70 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a 20  pr node that.** 
07e0: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 43  implements the C
07f0: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e  OLLATE operator.
0800: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
0810: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
0820: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 61 74  ror occurs, that
0830: 20 66 61 63 74 20 69 73 20 72 65 63 6f 72 64 65   fact is recorde
0840: 64 20 69 6e 20 70 50 61 72 73 65 2d 3e 64 62 0a  d in pParse->db.
0850: 2a 2a 20 61 6e 64 20 74 68 65 20 70 45 78 70 72  ** and the pExpr
0860: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 72 65   parameter is re
0870: 74 75 72 6e 65 64 20 75 6e 63 68 61 6e 67 65 64  turned unchanged
0880: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
0890: 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
08a0: 54 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61  Token(Parse *pPa
08b0: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
08c0: 2c 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61  , Token *pCollNa
08d0: 6d 65 29 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c  me){.  if( pColl
08e0: 4e 61 6d 65 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20  Name->n>0 ){.   
08f0: 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71   Expr *pNew = sq
0900: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70  lite3ExprAlloc(p
0910: 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f  Parse->db, TK_CO
0920: 4c 4c 41 54 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65  LLATE, pCollName
0930: 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  , 1);.    if( pN
0940: 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ew ){.      pNew
0950: 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72 3b  ->pLeft = pExpr;
0960: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  .      pNew->fla
0970: 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65  gs |= EP_Collate
0980: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20  ;.      pExpr = 
0990: 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pNew;.    }.  }.
09a0: 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a    return pExpr;.
09b0: 7d 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  }.Expr *sqlite3E
09c0: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72  xprAddCollateStr
09d0: 69 6e 67 28 50 61 72 73 65 20 2a 70 50 61 72 73  ing(Parse *pPars
09e0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
09f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 29 7b  const char *zC){
0a00: 0a 20 20 69 66 28 20 7a 43 20 29 7b 0a 20 20 20  .  if( zC ){.   
0a10: 20 54 6f 6b 65 6e 20 73 3b 0a 20 20 20 20 73 2e   Token s;.    s.
0a20: 7a 20 3d 20 7a 43 3b 0a 20 20 20 20 73 2e 6e 20  z = zC;.    s.n 
0a30: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
0a40: 30 28 73 2e 7a 29 3b 0a 20 20 20 20 70 45 78 70  0(s.z);.    pExp
0a50: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  r = sqlite3ExprA
0a60: 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70  ddCollateToken(p
0a70: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 73  Parse, pExpr, &s
0a80: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
0a90: 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pExpr;.}../*.** 
0aa0: 53 6b 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b  Skip over any TK
0ab0: 5f 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f  _COLLATE operato
0ac0: 72 20 69 6e 20 61 6e 20 65 78 70 72 65 73 73 69  r in an expressi
0ad0: 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  on..*/.Expr *sql
0ae0: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
0af0: 61 74 65 28 45 78 70 72 20 2a 70 45 78 70 72 29  ate(Expr *pExpr)
0b00: 7b 0a 20 20 69 66 28 20 70 45 78 70 72 20 26 26  {.  if( pExpr &&
0b10: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
0b20: 4f 4c 4c 41 54 45 20 29 20 70 45 78 70 72 20 3d  OLLATE ) pExpr =
0b30: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
0b40: 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d   return pExpr;.}
0b50: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
0b60: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
0b70: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78  uence for the ex
0b80: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
0b90: 49 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e  If.** there is n
0ba0: 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74  o defined collat
0bb0: 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65  ing sequence, re
0bc0: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
0bd0: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   The collating s
0be0: 65 71 75 65 6e 63 65 20 6d 69 67 68 74 20 62 65  equence might be
0bf0: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 61   determined by a
0c00: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
0c10: 72 0a 2a 2a 20 6f 72 20 62 79 20 74 68 65 20 70  r.** or by the p
0c20: 72 65 73 65 6e 63 65 20 6f 66 20 61 20 63 6f 6c  resence of a col
0c30: 75 6d 6e 20 77 69 74 68 20 61 20 64 65 66 69 6e  umn with a defin
0c40: 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ed collating seq
0c50: 75 65 6e 63 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54  uence..** COLLAT
0c60: 45 20 6f 70 65 72 61 74 6f 72 73 20 74 61 6b 65  E operators take
0c70: 20 66 69 72 73 74 20 70 72 65 63 65 64 65 6e 63   first precedenc
0c80: 65 2e 20 20 4c 65 66 74 20 6f 70 65 72 61 6e 64  e.  Left operand
0c90: 73 20 74 61 6b 65 0a 2a 2a 20 70 72 65 63 65 64  s take.** preced
0ca0: 65 6e 63 65 20 6f 76 65 72 20 72 69 67 68 74 20  ence over right 
0cb0: 6f 70 65 72 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c  operands..*/.Col
0cc0: 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 45 78 70  lSeq *sqlite3Exp
0cd0: 72 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  rCollSeq(Parse *
0ce0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
0cf0: 78 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  xpr){.  sqlite3 
0d00: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
0d10: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
0d20: 6c 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a  ll = 0;.  Expr *
0d30: 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69  p = pExpr;.  whi
0d40: 6c 65 28 20 70 20 26 26 20 70 43 6f 6c 6c 3d 3d  le( p && pColl==
0d50: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20  0 ){.    int op 
0d60: 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69 66 28  = p->op;.    if(
0d70: 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20 7c 7c 20   op==TK_CAST || 
0d80: 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 7b 0a  op==TK_UPLUS ){.
0d90: 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65        p = p->pLe
0da0: 66 74 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  ft;.      contin
0db0: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
0dc0: 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ( op==TK_COLLATE
0dd0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62   ){.      if( db
0de0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
0df0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
0e00: 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73 20 77   report errors w
0e10: 68 65 6e 20 70 61 72 73 69 6e 67 20 77 68 69 6c  hen parsing whil
0e20: 65 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a  e the schema */.
0e30: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
0e40: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
0e50: 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20  eq(db, ENC(db), 
0e60: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b  p->u.zToken, 0);
0e70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
0e80: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
0e90: 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28  lite3GetCollSeq(
0ea0: 70 50 61 72 73 65 2c 20 45 4e 43 28 64 62 29 2c  pParse, ENC(db),
0eb0: 20 30 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29   0, p->u.zToken)
0ec0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
0ed0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
0ee0: 20 69 66 28 20 70 2d 3e 70 54 61 62 21 3d 30 0a   if( p->pTab!=0.
0ef0: 20 20 20 20 20 26 26 20 28 6f 70 3d 3d 54 4b 5f       && (op==TK_
0f00: 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70  AGG_COLUMN || op
0f10: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  ==TK_COLUMN.    
0f20: 20 20 20 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f        || op==TK_
0f30: 52 45 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d  REGISTER || op==
0f40: 54 4b 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20  TK_TRIGGER).    
0f50: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d  ){.      /* op==
0f60: 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70  TK_REGISTER && p
0f70: 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e  ->pTab!=0 happen
0f80: 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61 73  s when pExpr was
0f90: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20   originally.    
0fa0: 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e    ** a TK_COLUMN
0fb0: 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75   but was previou
0fc0: 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e  sly evaluated an
0fd0: 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65  d cached in a re
0fe0: 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  gister */.      
0ff0: 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75  int j = p->iColu
1000: 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3e  mn;.      if( j>
1010: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =0 ){.        co
1020: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20  nst char *zColl 
1030: 3d 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  = p->pTab->aCol[
1040: 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  j].zColl;.      
1050: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
1060: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
1070: 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c   ENC(db), zColl,
1080: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
1090: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
10a0: 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73      if( p->flags
10b0: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b   & EP_Collate ){
10c0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  .      if( p->pL
10d0: 65 66 74 20 26 26 20 28 70 2d 3e 70 4c 65 66 74  eft && (p->pLeft
10e0: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
10f0: 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  late)!=0 ){.    
1100: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74      p = p->pLeft
1110: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1120: 20 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 52         p = p->pR
1130: 69 67 68 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ight;.      }.  
1140: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62    }else{.      b
1150: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1160: 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68 65    if( sqlite3Che
1170: 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ckCollSeq(pParse
1180: 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20  , pColl) ){ .   
1190: 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a   pColl = 0;.  }.
11a0: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
11b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
11c0: 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20  s an operand of 
11d0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
11e0: 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73 20  rator.  aff2 is 
11f0: 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69  the.** type affi
1200: 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68 65  nity of the othe
1210: 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73  r operand.  This
1220: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1230: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
1240: 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c  inity that shoul
1250: 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  d be used for th
1260: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
1270: 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73  rator..*/.char s
1280: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1290: 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70  inity(Expr *pExp
12a0: 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a 20  r, char aff2){. 
12b0: 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71 6c   char aff1 = sql
12c0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
12d0: 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 61  (pExpr);.  if( a
12e0: 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20  ff1 && aff2 ){. 
12f0: 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73     /* Both sides
1300: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
1310: 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20  on are columns. 
1320: 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72  If one has numer
1330: 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e 69  ic.    ** affini
1340: 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74  ty, use that. Ot
1350: 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61  herwise use no a
1360: 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a  ffinity..    */.
1370: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
1380: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
1390: 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74 65  (aff1) || sqlite
13a0: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
13b0: 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20 20  ty(aff2) ){.    
13c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13d0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
13e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
13f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1400: 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  NONE;.    }.  }e
1410: 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26  lse if( !aff1 &&
1420: 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a   !aff2 ){.    /*
1430: 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66   Neither side of
1440: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1450: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f  is a column.  Co
1460: 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  mpare the.    **
1470: 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c   results directl
1480: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  y..    */.    re
1490: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
14a0: 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NONE;.  }else{. 
14b0: 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69     /* One side i
14c0: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  s a column, the 
14d0: 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73  other is not. Us
14e0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66  e the columns af
14f0: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61  finity. */.    a
1500: 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c  ssert( aff1==0 |
1510: 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20  | aff2==0 );.   
1520: 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20   return (aff1 + 
1530: 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  aff2);.  }.}../*
1540: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
1550: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1560: 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  or.  Return the 
1570: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68  type affinity th
1580: 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
1590: 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20  applied to both 
15a0: 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74  operands prior t
15b0: 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70  o doing the comp
15c0: 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  arison..*/.stati
15d0: 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f  c char compariso
15e0: 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  nAffinity(Expr *
15f0: 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61  pExpr){.  char a
1600: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  ff;.  assert( pE
1610: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
1620: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
1630: 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IN || pExpr->op=
1640: 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20  =TK_LT ||.      
1650: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
1660: 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_GT || pExpr->o
1670: 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70  p==TK_GE || pExp
1680: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a  r->op==TK_LE ||.
1690: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
16a0: 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45  >op==TK_NE || pE
16b0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
16c0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
16d0: 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65 72  ISNOT );.  asser
16e0: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  t( pExpr->pLeft 
16f0: 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74  );.  aff = sqlit
1700: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
1710: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
1720: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
1730: 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  t ){.    aff = s
1740: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1750: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69  inity(pExpr->pRi
1760: 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c  ght, aff);.  }el
1770: 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50 72  se if( ExprHasPr
1780: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1790: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
17a0: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
17b0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
17c0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
17d0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
17e0: 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65  Expr, aff);.  }e
17f0: 6c 73 65 20 69 66 28 20 21 61 66 66 20 29 7b 0a  lse if( !aff ){.
1800: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
1810: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20  _AFF_NONE;.  }. 
1820: 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a   return aff;.}..
1830: 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61  /*.** pExpr is a
1840: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78 70 72   comparison expr
1850: 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c  ession, eg. '=',
1860: 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20 65 74   '<', IN(...) et
1870: 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69 6e 69  c..** idx_affini
1880: 74 79 20 69 73 20 74 68 65 20 61 66 66 69 6e 69  ty is the affini
1890: 74 79 20 6f 66 20 61 6e 20 69 6e 64 65 78 65 64  ty of an indexed
18a0: 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72 6e 20   column. Return 
18b0: 74 72 75 65 0a 2a 2a 20 69 66 20 74 68 65 20 69  true.** if the i
18c0: 6e 64 65 78 20 77 69 74 68 20 61 66 66 69 6e 69  ndex with affini
18d0: 74 79 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20  ty idx_affinity 
18e0: 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 69  may be used to i
18f0: 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20  mplement.** the 
1900: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 70 45  comparison in pE
1910: 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  xpr..*/.int sqli
1920: 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
1930: 4f 6b 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  Ok(Expr *pExpr, 
1940: 63 68 61 72 20 69 64 78 5f 61 66 66 69 6e 69 74  char idx_affinit
1950: 79 29 7b 0a 20 20 63 68 61 72 20 61 66 66 20 3d  y){.  char aff =
1960: 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e   comparisonAffin
1970: 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20 73 77  ity(pExpr);.  sw
1980: 69 74 63 68 28 20 61 66 66 20 29 7b 0a 20 20 20  itch( aff ){.   
1990: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
19a0: 5f 4e 4f 4e 45 3a 0a 20 20 20 20 20 20 72 65 74  _NONE:.      ret
19b0: 75 72 6e 20 31 3b 0a 20 20 20 20 63 61 73 65 20  urn 1;.    case 
19c0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a  SQLITE_AFF_TEXT:
19d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 64  .      return id
19e0: 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  x_affinity==SQLI
19f0: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
1a00: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
1a10: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 73  return sqlite3Is
1a20: 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28  NumericAffinity(
1a30: 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b 0a 20  idx_affinity);. 
1a40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
1a50: 72 6e 20 74 68 65 20 50 35 20 76 61 6c 75 65 20  rn the P5 value 
1a60: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75  that should be u
1a70: 73 65 64 20 66 6f 72 20 61 20 62 69 6e 61 72 79  sed for a binary
1a80: 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f   comparison.** o
1a90: 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c 20 4f 50  pcode (OP_Eq, OP
1aa0: 5f 47 65 20 65 74 63 2e 29 20 75 73 65 64 20 74  _Ge etc.) used t
1ab0: 6f 20 63 6f 6d 70 61 72 65 20 70 45 78 70 72 31  o compare pExpr1
1ac0: 20 61 6e 64 20 70 45 78 70 72 32 2e 0a 2a 2f 0a   and pExpr2..*/.
1ad0: 73 74 61 74 69 63 20 75 38 20 62 69 6e 61 72 79  static u8 binary
1ae0: 43 6f 6d 70 61 72 65 50 35 28 45 78 70 72 20 2a  CompareP5(Expr *
1af0: 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a 70 45  pExpr1, Expr *pE
1b00: 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66  xpr2, int jumpIf
1b10: 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61 66 66 20  Null){.  u8 aff 
1b20: 3d 20 28 63 68 61 72 29 73 71 6c 69 74 65 33 45  = (char)sqlite3E
1b30: 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70  xprAffinity(pExp
1b40: 72 32 29 3b 0a 20 20 61 66 66 20 3d 20 28 75 38  r2);.  aff = (u8
1b50: 29 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41  )sqlite3CompareA
1b60: 66 66 69 6e 69 74 79 28 70 45 78 70 72 31 2c 20  ffinity(pExpr1, 
1b70: 61 66 66 29 20 7c 20 28 75 38 29 6a 75 6d 70 49  aff) | (u8)jumpI
1b80: 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75 72 6e 20  fNull;.  return 
1b90: 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  aff;.}../*.** Re
1ba0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1bb0: 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  o the collation 
1bc0: 73 65 71 75 65 6e 63 65 20 74 68 61 74 20 73 68  sequence that sh
1bd0: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62 79 0a  ould be used by.
1be0: 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70  ** a binary comp
1bf0: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20  arison operator 
1c00: 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66 74 20  comparing pLeft 
1c10: 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a  and pRight..**.*
1c20: 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20 68 61  * If the left ha
1c30: 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  nd expression ha
1c40: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  s a collating se
1c50: 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74 68 65  quence type, the
1c60: 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65 64 2e  n it is.** used.
1c70: 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63   Otherwise the c
1c80: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1c90: 65 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 20  e for the right 
1ca0: 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 0a  hand expression.
1cb0: 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72 20 74  ** is used, or t
1cc0: 68 65 20 64 65 66 61 75 6c 74 20 28 42 49 4e 41  he default (BINA
1cd0: 52 59 29 20 69 66 20 6e 65 69 74 68 65 72 20 65  RY) if neither e
1ce0: 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20  xpression has a 
1cf0: 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74 79 70  collating.** typ
1d00: 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  e..**.** Argumen
1d10: 74 20 70 52 69 67 68 74 20 28 62 75 74 20 6e 6f  t pRight (but no
1d20: 74 20 70 4c 65 66 74 29 20 6d 61 79 20 62 65 20  t pLeft) may be 
1d30: 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20  a null pointer. 
1d40: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a  In this case,.**
1d50: 20 69 74 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69   it is not consi
1d60: 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65  dered..*/.CollSe
1d70: 71 20 2a 73 71 6c 69 74 65 33 42 69 6e 61 72 79  q *sqlite3Binary
1d80: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a  CompareCollSeq(.
1d90: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1da0: 20 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c   .  Expr *pLeft,
1db0: 20 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74   .  Expr *pRight
1dc0: 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  .){.  CollSeq *p
1dd0: 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Coll;.  assert( 
1de0: 70 4c 65 66 74 20 29 3b 0a 20 20 69 66 28 20 70  pLeft );.  if( p
1df0: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  Left->flags & EP
1e00: 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20  _Collate ){.    
1e10: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
1e20: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
1e30: 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d 65 6c  e, pLeft);.  }el
1e40: 73 65 20 69 66 28 20 70 52 69 67 68 74 20 26 26  se if( pRight &&
1e50: 20 28 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20   (pRight->flags 
1e60: 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21 3d 30  & EP_Collate)!=0
1e70: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20   ){.    pColl = 
1e80: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1e90: 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  eq(pParse, pRigh
1ea0: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
1eb0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
1ec0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
1ed0: 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  se, pLeft);.    
1ee0: 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
1ef0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1f00: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
1f10: 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a  Parse, pRight);.
1f20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1f30: 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a  rn pColl;.}../*.
1f40: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1f50: 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69 73 6f   for a compariso
1f60: 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73  n operator..*/.s
1f70: 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 43 6f  tatic int codeCo
1f80: 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a  mpare(.  Parse *
1f90: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 54 68  pParse,    /* Th
1fa0: 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64 20 63  e parsing (and c
1fb0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 29 20  ode generating) 
1fc0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
1fd0: 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 2f  r *pLeft,      /
1fe0: 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65 72 61  * The left opera
1ff0: 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52  nd */.  Expr *pR
2000: 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  ight,     /* The
2010: 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a   right operand *
2020: 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65 2c 20  /.  int opcode, 
2030: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
2040: 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65 20 2a  parison opcode *
2050: 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69 6e 74  /.  int in1, int
2060: 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73 74 65   in2, /* Registe
2070: 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72 61 6e  r holding operan
2080: 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  ds */.  int dest
2090: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d  ,         /* Jum
20a0: 70 20 68 65 72 65 20 69 66 20 74 72 75 65 2e 20  p here if true. 
20b0: 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66   */.  int jumpIf
20c0: 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20 74 72  Null    /* If tr
20d0: 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69 74 68  ue, jump if eith
20e0: 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55  er operand is NU
20f0: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70  LL */.){.  int p
2100: 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  5;.  int addr;. 
2110: 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a 0a 20   CollSeq *p4;.. 
2120: 20 70 34 20 3d 20 73 71 6c 69 74 65 33 42 69 6e   p4 = sqlite3Bin
2130: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
2140: 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  q(pParse, pLeft,
2150: 20 70 52 69 67 68 74 29 3b 0a 20 20 70 35 20 3d   pRight);.  p5 =
2160: 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 35   binaryCompareP5
2170: 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20  (pLeft, pRight, 
2180: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 61  jumpIfNull);.  a
2190: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
21a0: 65 41 64 64 4f 70 34 28 70 50 61 72 73 65 2d 3e  eAddOp4(pParse->
21b0: 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c 20 69  pVdbe, opcode, i
21c0: 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c 0a 20  n2, dest, in1,. 
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
21f0: 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  )p4, P4_COLLSEQ)
2200: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
2210: 68 61 6e 67 65 50 35 28 70 50 61 72 73 65 2d 3e  hangeP5(pParse->
2220: 70 56 64 62 65 2c 20 28 75 38 29 70 35 29 3b 0a  pVdbe, (u8)p5);.
2230: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
2240: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
2250: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a  _EXPR_DEPTH>0./*
2260: 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61  .** Check that a
2270: 72 67 75 6d 65 6e 74 20 6e 48 65 69 67 68 74 20  rgument nHeight 
2280: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
2290: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78  equal to the max
22a0: 69 6d 75 6d 0a 2a 2a 20 65 78 70 72 65 73 73 69  imum.** expressi
22b0: 6f 6e 20 64 65 70 74 68 20 61 6c 6c 6f 77 65 64  on depth allowed
22c0: 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  . If it is not, 
22d0: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
22e0: 65 73 73 61 67 65 20 69 6e 0a 2a 2a 20 70 50 61  essage in.** pPa
22f0: 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rse..*/.int sqli
2300: 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67  te3ExprCheckHeig
2310: 68 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ht(Parse *pParse
2320: 2c 20 69 6e 74 20 6e 48 65 69 67 68 74 29 7b 0a  , int nHeight){.
2330: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2340: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6d 78 48 65  E_OK;.  int mxHe
2350: 69 67 68 74 20 3d 20 70 50 61 72 73 65 2d 3e 64  ight = pParse->d
2360: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
2370: 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54  _LIMIT_EXPR_DEPT
2380: 48 5d 3b 0a 20 20 69 66 28 20 6e 48 65 69 67 68  H];.  if( nHeigh
2390: 74 3e 6d 78 48 65 69 67 68 74 20 29 7b 0a 20 20  t>mxHeight ){.  
23a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
23b0: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
23c0: 20 20 22 45 78 70 72 65 73 73 69 6f 6e 20 74 72    "Expression tr
23d0: 65 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  ee is too large 
23e0: 28 6d 61 78 69 6d 75 6d 20 64 65 70 74 68 20 25  (maximum depth %
23f0: 64 29 22 2c 20 6d 78 48 65 69 67 68 74 0a 20 20  d)", mxHeight.  
2400: 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51    );.    rc = SQ
2410: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
2420: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2430: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
2440: 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73   three functions
2450: 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 29  , heightOfExpr()
2460: 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69  , heightOfExprLi
2470: 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67  st().** and heig
2480: 68 74 4f 66 53 65 6c 65 63 74 28 29 2c 20 61 72  htOfSelect(), ar
2490: 65 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  e used to determ
24a0: 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ine the maximum 
24b0: 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79  height.** of any
24c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
24d0: 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 74   referenced by t
24e0: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61 73  he structure pas
24f0: 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69  sed as the.** fi
2500: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  rst argument..**
2510: 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 61 78 69  .** If this maxi
2520: 6d 75 6d 20 68 65 69 67 68 74 20 69 73 20 67 72  mum height is gr
2530: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
2540: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 70 6f 69  urrent value poi
2550: 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e  nted.** to by pn
2560: 48 65 69 67 68 74 2c 20 74 68 65 20 73 65 63 6f  Height, the seco
2570: 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 20 74 68  nd parameter, th
2580: 65 6e 20 73 65 74 20 2a 70 6e 48 65 69 67 68 74  en set *pnHeight
2590: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75   to that.** valu
25a0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
25b0: 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 45  d heightOfExpr(E
25c0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  xpr *p, int *pnH
25d0: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
25e0: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 48  ){.    if( p->nH
25f0: 65 69 67 68 74 3e 2a 70 6e 48 65 69 67 68 74 20  eight>*pnHeight 
2600: 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67  ){.      *pnHeig
2610: 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b  ht = p->nHeight;
2620: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
2630: 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f  tic void heightO
2640: 66 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  fExprList(ExprLi
2650: 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65  st *p, int *pnHe
2660: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29  ight){.  if( p )
2670: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
2680: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
2690: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
26a0: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
26b0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e  ->a[i].pExpr, pn
26c0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  Height);.    }. 
26d0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
26e0: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
26f0: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 2a  Select *p, int *
2700: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28  pnHeight){.  if(
2710: 20 70 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74   p ){.    height
2720: 4f 66 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65  OfExpr(p->pWhere
2730: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2740: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
2750: 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48 65 69 67  >pHaving, pnHeig
2760: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
2770: 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c  fExpr(p->pLimit,
2780: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
2790: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
27a0: 70 4f 66 66 73 65 74 2c 20 70 6e 48 65 69 67 68  pOffset, pnHeigh
27b0: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
27c0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69  ExprList(p->pELi
27d0: 73 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  st, pnHeight);. 
27e0: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
27f0: 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c  ist(p->pGroupBy,
2800: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
2810: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
2820: 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e  (p->pOrderBy, pn
2830: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
2840: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70  ghtOfSelect(p->p
2850: 50 72 69 6f 72 2c 20 70 6e 48 65 69 67 68 74 29  Prior, pnHeight)
2860: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
2870: 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69  et the Expr.nHei
2880: 67 68 74 20 76 61 72 69 61 62 6c 65 20 69 6e 20  ght variable in 
2890: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61  the structure pa
28a0: 73 73 65 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61  ssed as an .** a
28b0: 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72  rgument. An expr
28c0: 65 73 73 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63  ession with no c
28d0: 68 69 6c 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c  hildren, Expr.pL
28e0: 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e  ist or .** Expr.
28f0: 70 53 65 6c 65 63 74 20 6d 65 6d 62 65 72 20 68  pSelect member h
2900: 61 73 20 61 20 68 65 69 67 68 74 20 6f 66 20 31  as a height of 1
2910: 2e 20 41 6e 79 20 6f 74 68 65 72 20 65 78 70 72  . Any other expr
2920: 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20  ession.** has a 
2930: 68 65 69 67 68 74 20 65 71 75 61 6c 20 74 6f 20  height equal to 
2940: 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  the maximum heig
2950: 68 74 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20  ht of any other 
2960: 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 64 20 45  .** referenced E
2970: 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2f  xpr plus one..*/
2980: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
2990: 72 53 65 74 48 65 69 67 68 74 28 45 78 70 72 20  rSetHeight(Expr 
29a0: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67  *p){.  int nHeig
29b0: 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74  ht = 0;.  height
29c0: 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c  OfExpr(p->pLeft,
29d0: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65   &nHeight);.  he
29e0: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 52  ightOfExpr(p->pR
29f0: 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  ight, &nHeight);
2a00: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
2a10: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
2a20: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 68  Select) ){.    h
2a30: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d  eightOfSelect(p-
2a40: 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 6e 48 65  >x.pSelect, &nHe
2a50: 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ight);.  }else{.
2a60: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
2a70: 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69 73 74 2c  List(p->x.pList,
2a80: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a   &nHeight);.  }.
2a90: 20 20 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e    p->nHeight = n
2aa0: 48 65 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f  Height + 1;.}../
2ab0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
2ac0: 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61 62  r.nHeight variab
2ad0: 6c 65 20 75 73 69 6e 67 20 74 68 65 20 65 78 70  le using the exp
2ae0: 72 53 65 74 48 65 69 67 68 74 28 29 20 66 75 6e  rSetHeight() fun
2af0: 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68 65  ction. If.** the
2b00: 20 68 65 69 67 68 74 20 69 73 20 67 72 65 61 74   height is great
2b10: 65 72 20 74 68 61 6e 20 74 68 65 20 6d 61 78 69  er than the maxi
2b20: 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 65 78 70 72  mum allowed expr
2b30: 65 73 73 69 6f 6e 20 64 65 70 74 68 2c 0a 2a 2a  ession depth,.**
2b40: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
2b50: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f  in pParse..*/.vo
2b60: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 65  id sqlite3ExprSe
2b70: 74 48 65 69 67 68 74 28 50 61 72 73 65 20 2a 70  tHeight(Parse *p
2b80: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 29 7b  Parse, Expr *p){
2b90: 0a 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74  .  exprSetHeight
2ba0: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  (p);.  sqlite3Ex
2bb0: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70 50  prCheckHeight(pP
2bc0: 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74  arse, p->nHeight
2bd0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
2be0: 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  rn the maximum h
2bf0: 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70  eight of any exp
2c00: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66  ression tree ref
2c10: 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68  erenced.** by th
2c20: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
2c30: 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  nt passed as an 
2c40: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
2c50: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
2c60: 70 72 48 65 69 67 68 74 28 53 65 6c 65 63 74 20  prHeight(Select 
2c70: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67  *p){.  int nHeig
2c80: 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74  ht = 0;.  height
2c90: 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65  OfSelect(p, &nHe
2ca0: 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  ight);.  return 
2cb0: 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65  nHeight;.}.#else
2cc0: 0a 20 20 23 64 65 66 69 6e 65 20 65 78 70 72 53  .  #define exprS
2cd0: 65 74 48 65 69 67 68 74 28 79 29 0a 23 65 6e 64  etHeight(y).#end
2ce0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58  if /* SQLITE_MAX
2cf0: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f  _EXPR_DEPTH>0 */
2d00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2d10: 74 69 6e 65 20 69 73 20 74 68 65 20 63 6f 72 65  tine is the core
2d20: 20 61 6c 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45   allocator for E
2d30: 78 70 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a  xpr nodes..**.**
2d40: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   Construct a new
2d50: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
2d60: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
2d70: 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65  inter to it.  Me
2d80: 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73  mory.** for this
2d90: 20 6e 6f 64 65 20 61 6e 64 20 66 6f 72 20 74 68   node and for th
2da0: 65 20 70 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e  e pToken argumen
2db0: 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20 61 6c  t is a single al
2dc0: 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61  location.** obta
2dd0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
2de0: 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68  3DbMalloc().  Th
2df0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
2e00: 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  on.** is respons
2e10: 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
2e20: 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76  sure the node ev
2e30: 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72  entually gets fr
2e40: 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65  eed..**.** If de
2e50: 71 75 6f 74 65 20 69 73 20 74 72 75 65 2c 20 74  quote is true, t
2e60: 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 28 69  hen the token (i
2e70: 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20  f it exists) is 
2e80: 64 65 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20  dequoted..** If 
2e90: 64 65 71 75 6f 74 65 20 69 73 20 66 61 6c 73 65  dequote is false
2ea0: 2c 20 6e 6f 20 64 65 71 75 6f 74 69 6e 67 20 69  , no dequoting i
2eb0: 73 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20  s performance.  
2ec0: 54 68 65 20 64 65 51 75 6f 74 65 0a 2a 2a 20 70  The deQuote.** p
2ed0: 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f  arameter is igno
2ee0: 72 65 64 20 69 66 20 70 54 6f 6b 65 6e 20 69 73  red if pToken is
2ef0: 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20   NULL or if the 
2f00: 74 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a  token does not.*
2f10: 2a 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 71  * appear to be q
2f20: 75 6f 74 65 64 2e 20 20 49 66 20 74 68 65 20 71  uoted.  If the q
2f30: 75 6f 74 65 73 20 77 65 72 65 20 6f 66 20 74 68  uotes were of th
2f40: 65 20 66 6f 72 6d 20 22 2e 2e 2e 22 20 28 64 6f  e form "..." (do
2f50: 75 62 6c 65 2d 71 75 6f 74 65 73 29 0a 2a 2a 20  uble-quotes).** 
2f60: 74 68 65 6e 20 74 68 65 20 45 50 5f 44 62 6c 51  then the EP_DblQ
2f70: 75 6f 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  uoted flag is se
2f80: 74 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  t on the express
2f90: 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ion node..**.** 
2fa0: 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49  Special case:  I
2fb0: 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  f op==TK_INTEGER
2fc0: 20 61 6e 64 20 70 54 6f 6b 65 6e 20 70 6f 69 6e   and pToken poin
2fd0: 74 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74  ts to a string t
2fe0: 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 74 72  hat.** can be tr
2ff0: 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f 20 61 20  anslated into a 
3000: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
3010: 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 69  then the token i
3020: 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72 65 64 20  s not.** stored 
3030: 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e  in u.zToken.  In
3040: 73 74 65 61 64 2c 20 74 68 65 20 69 6e 74 65 67  stead, the integ
3050: 65 72 20 76 61 6c 75 65 73 20 69 73 20 77 72 69  er values is wri
3060: 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69  tten.** into u.i
3070: 56 61 6c 75 65 20 61 6e 64 20 74 68 65 20 45 50  Value and the EP
3080: 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 69  _IntValue flag i
3090: 73 20 73 65 74 2e 20 20 4e 6f 20 65 78 74 72 61  s set.  No extra
30a0: 20 73 74 6f 72 61 67 65 0a 2a 2a 20 69 73 20 61   storage.** is a
30b0: 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64  llocated to hold
30c0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 74 65 78   the integer tex
30d0: 74 20 61 6e 64 20 74 68 65 20 64 65 71 75 6f 74  t and the dequot
30e0: 65 20 66 6c 61 67 20 69 73 20 69 67 6e 6f 72 65  e flag is ignore
30f0: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
3100: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 0a 20 20  te3ExprAlloc(.  
3110: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
3120: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
3130: 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d  e for sqlite3DbM
3140: 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79  allocZero() (may
3150: 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69   be null) */.  i
3160: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
3170: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
3180: 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  sion opcode */. 
3190: 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54   const Token *pT
31a0: 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65  oken,    /* Toke
31b0: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67  n argument.  Mig
31c0: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
31d0: 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20  int dequote     
31e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
31f0: 74 6f 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b  to dequote */.){
3200: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
3210: 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b   int nExtra = 0;
3220: 0a 20 20 69 6e 74 20 69 56 61 6c 75 65 20 3d 20  .  int iValue = 
3230: 30 3b 0a 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e  0;..  if( pToken
3240: 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d   ){.    if( op!=
3250: 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70 54  TK_INTEGER || pT
3260: 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20 20  oken->z==0.     
3270: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
3280: 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d 3e  etInt32(pToken->
3290: 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30 20 29  z, &iValue)==0 )
32a0: 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 3d  {.      nExtra =
32b0: 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20 20   pToken->n+1;.  
32c0: 20 20 20 20 61 73 73 65 72 74 28 20 69 56 61 6c      assert( iVal
32d0: 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  ue>=0 );.    }. 
32e0: 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69   }.  pNew = sqli
32f0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
3300: 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29  db, sizeof(Expr)
3310: 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20  +nExtra);.  if( 
3320: 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 4e 65 77  pNew ){.    pNew
3330: 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20  ->op = (u8)op;. 
3340: 20 20 20 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20     pNew->iAgg = 
3350: 2d 31 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 6b  -1;.    if( pTok
3360: 65 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  en ){.      if( 
3370: 6e 45 78 74 72 61 3d 3d 30 20 29 7b 0a 20 20 20  nExtra==0 ){.   
3380: 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
3390: 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b   |= EP_IntValue;
33a0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
33b0: 2e 69 56 61 6c 75 65 20 3d 20 69 56 61 6c 75 65  .iValue = iValue
33c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
33d0: 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20         int c;.  
33e0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54        pNew->u.zT
33f0: 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 70  oken = (char*)&p
3400: 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20  New[1];.        
3410: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e  assert( pToken->
3420: 7a 21 3d 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e  z!=0 || pToken->
3430: 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
3440: 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20  if( pToken->n ) 
3450: 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a  memcpy(pNew->u.z
3460: 54 6f 6b 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a  Token, pToken->z
3470: 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20  , pToken->n);.  
3480: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54        pNew->u.zT
3490: 6f 6b 65 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20  oken[pToken->n] 
34a0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
34b0: 20 64 65 71 75 6f 74 65 20 26 26 20 6e 45 78 74   dequote && nExt
34c0: 72 61 3e 3d 33 20 0a 20 20 20 20 20 20 20 20 20  ra>=3 .         
34d0: 20 20 20 20 26 26 20 28 28 63 20 3d 20 70 54 6f      && ((c = pTo
34e0: 6b 65 6e 2d 3e 7a 5b 30 5d 29 3d 3d 27 5c 27 27  ken->z[0])=='\''
34f0: 20 7c 7c 20 63 3d 3d 27 22 27 20 7c 7c 20 63 3d   || c=='"' || c=
3500: 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27 60 27 29 20  ='[' || c=='`') 
3510: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
3520: 69 74 65 33 44 65 71 75 6f 74 65 28 70 4e 65 77  ite3Dequote(pNew
3530: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
3540: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 22         if( c=='"
3550: 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20  ' ) pNew->flags 
3560: 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 3b  |= EP_DblQuoted;
3570: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3580: 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c   }.    }.#if SQL
3590: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
35a0: 54 48 3e 30 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  TH>0.    pNew->n
35b0: 48 65 69 67 68 74 20 3d 20 31 3b 0a 23 65 6e 64  Height = 1;.#end
35c0: 69 66 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  if  .  }.  retur
35d0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
35e0: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
35f0: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
3600: 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 74 65 72 6d  from a zero-term
3610: 69 6e 61 74 65 64 20 74 6f 6b 65 6e 20 74 68 61  inated token tha
3620: 74 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79  t has.** already
3630: 20 62 65 65 6e 20 64 65 71 75 6f 74 65 64 2e 0a   been dequoted..
3640: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3650: 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20  Expr(.  sqlite3 
3660: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
3670: 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71  /* Handle for sq
3680: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
3690: 6f 28 29 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c  o() (may be null
36a0: 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  ) */.  int op,  
36b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36c0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63  * Expression opc
36d0: 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ode */.  const c
36e0: 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 20 20 20 20  har *zToken     
36f0: 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65   /* Token argume
3700: 6e 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55  nt.  Might be NU
3710: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e  LL */.){.  Token
3720: 20 78 3b 0a 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b   x;.  x.z = zTok
3730: 65 6e 3b 0a 20 20 78 2e 6e 20 3d 20 7a 54 6f 6b  en;.  x.n = zTok
3740: 65 6e 20 3f 20 73 71 6c 69 74 65 33 53 74 72 6c  en ? sqlite3Strl
3750: 65 6e 33 30 28 7a 54 6f 6b 65 6e 29 20 3a 20 30  en30(zToken) : 0
3760: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
3770: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
3780: 6f 70 2c 20 26 78 2c 20 30 29 3b 0a 7d 0a 0a 2f  op, &x, 0);.}../
3790: 2a 0a 2a 2a 20 41 74 74 61 63 68 20 73 75 62 74  *.** Attach subt
37a0: 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70  rees pLeft and p
37b0: 52 69 67 68 74 20 74 6f 20 74 68 65 20 45 78 70  Right to the Exp
37c0: 72 20 6e 6f 64 65 20 70 52 6f 6f 74 2e 0a 2a 2a  r node pRoot..**
37d0: 0a 2a 2a 20 49 66 20 70 52 6f 6f 74 3d 3d 4e 55  .** If pRoot==NU
37e0: 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  LL that means th
37f0: 61 74 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  at a memory allo
3800: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73  cation error has
3810: 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 49 6e   occurred..** In
3820: 20 74 68 61 74 20 63 61 73 65 2c 20 64 65 6c 65   that case, dele
3830: 74 65 20 74 68 65 20 73 75 62 74 72 65 65 73 20  te the subtrees 
3840: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
3850: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3860: 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72  3ExprAttachSubtr
3870: 65 65 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ees(.  sqlite3 *
3880: 64 62 2c 0a 20 20 45 78 70 72 20 2a 70 52 6f 6f  db,.  Expr *pRoo
3890: 74 2c 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  t,.  Expr *pLeft
38a0: 2c 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  ,.  Expr *pRight
38b0: 0a 29 7b 0a 20 20 69 66 28 20 70 52 6f 6f 74 3d  .){.  if( pRoot=
38c0: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
38d0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
38e0: 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ed );.    sqlite
38f0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
3900: 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69  pLeft);.    sqli
3910: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
3920: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c  , pRight);.  }el
3930: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67  se{.    if( pRig
3940: 68 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f  ht ){.      pRoo
3950: 74 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67  t->pRight = pRig
3960: 68 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d  ht;.      pRoot-
3970: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c  >flags |= EP_Col
3980: 6c 61 74 65 20 26 20 70 52 69 67 68 74 2d 3e 66  late & pRight->f
3990: 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lags;.    }.    
39a0: 69 66 28 20 70 4c 65 66 74 20 29 7b 0a 20 20 20  if( pLeft ){.   
39b0: 20 20 20 70 52 6f 6f 74 2d 3e 70 4c 65 66 74 20     pRoot->pLeft 
39c0: 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70  = pLeft;.      p
39d0: 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Root->flags |= E
39e0: 50 5f 43 6f 6c 6c 61 74 65 20 26 20 70 4c 65 66  P_Collate & pLef
39f0: 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a  t->flags;.    }.
3a00: 20 20 20 20 65 78 70 72 53 65 74 48 65 69 67 68      exprSetHeigh
3a10: 74 28 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a  t(pRoot);.  }.}.
3a20: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
3a30: 61 20 45 78 70 72 20 6e 6f 64 65 20 77 68 69 63  a Expr node whic
3a40: 68 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20  h joins as many 
3a50: 61 73 20 74 77 6f 20 73 75 62 74 72 65 65 73 2e  as two subtrees.
3a60: 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f  .**.** One or bo
3a70: 74 68 20 6f 66 20 74 68 65 20 73 75 62 74 72 65  th of the subtre
3a80: 65 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20  es can be NULL. 
3a90: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
3aa0: 72 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20  r to the new.** 
3ab0: 45 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20  Expr node.  Or, 
3ac0: 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  if an OOM error 
3ad0: 6f 63 63 75 72 73 2c 20 73 65 74 20 70 50 61 72  occurs, set pPar
3ae0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
3af0: 69 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68  iled,.** free th
3b00: 65 20 73 75 62 74 72 65 65 73 20 61 6e 64 20 72  e subtrees and r
3b10: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45  eturn NULL..*/.E
3b20: 78 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70  xpr *sqlite3PExp
3b30: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
3b40: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
3b50: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
3b60: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3b80: 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64  Expression opcod
3b90: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65  e */.  Expr *pLe
3ba0: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ft,            /
3bb0: 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a  * Left operand *
3bc0: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
3bd0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ,           /* R
3be0: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  ight operand */.
3bf0: 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70    const Token *p
3c00: 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67  Token     /* Arg
3c10: 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29  ument token */.)
3c20: 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69  {.  Expr *p;.  i
3c30: 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26  f( op==TK_AND &&
3c40: 20 70 4c 65 66 74 20 26 26 20 70 52 69 67 68 74   pLeft && pRight
3c50: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61 6b 65 20   ){.    /* Take 
3c60: 61 64 76 61 6e 74 61 67 65 20 6f 66 20 73 68 6f  advantage of sho
3c70: 72 74 2d 63 69 72 63 75 69 74 20 66 61 6c 73 65  rt-circuit false
3c80: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f   optimization fo
3c90: 72 20 41 4e 44 20 2a 2f 0a 20 20 20 20 70 20 3d  r AND */.    p =
3ca0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
3cb0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 66  pParse->db, pLef
3cc0: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65  t, pRight);.  }e
3cd0: 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c  lse{.    p = sql
3ce0: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
3cf0: 61 72 73 65 2d 3e 64 62 2c 20 6f 70 2c 20 70 54  arse->db, op, pT
3d00: 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 20 20 73 71  oken, 1);.    sq
3d10: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
3d20: 75 62 74 72 65 65 73 28 70 50 61 72 73 65 2d 3e  ubtrees(pParse->
3d30: 64 62 2c 20 70 2c 20 70 4c 65 66 74 2c 20 70 52  db, p, pLeft, pR
3d40: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ight);.  }.  if(
3d50: 20 70 20 29 20 7b 0a 20 20 20 20 73 71 6c 69 74   p ) {.    sqlit
3d60: 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68  e3ExprCheckHeigh
3d70: 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65  t(pParse, p->nHe
3d80: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ight);.  }.  ret
3d90: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
3da0: 52 65 74 75 72 6e 20 31 20 69 66 20 61 6e 20 65  Return 1 if an e
3db0: 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62  xpression must b
3dc0: 65 20 46 41 4c 53 45 20 69 6e 20 61 6c 6c 20 63  e FALSE in all c
3dd0: 61 73 65 73 20 61 6e 64 20 30 20 69 66 20 74 68  ases and 0 if th
3de0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
3df0: 6d 69 67 68 74 20 62 65 20 74 72 75 65 2e 20 20  might be true.  
3e00: 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
3e10: 69 7a 61 74 69 6f 6e 2e 20 20 49 66 20 69 73 20  ization.  If is 
3e20: 4f 4b 20 74 6f 0a 2a 2a 20 72 65 74 75 72 6e 20  OK to.** return 
3e30: 30 20 68 65 72 65 20 65 76 65 6e 20 69 66 20 74  0 here even if t
3e40: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
3e50: 61 6c 6c 79 20 69 73 20 61 6c 77 61 79 73 20 66  ally is always f
3e60: 61 6c 73 65 20 28 61 20 0a 2a 2a 20 66 61 6c 73  alse (a .** fals
3e70: 65 20 6e 65 67 61 74 69 76 65 29 2e 20 20 42 75  e negative).  Bu
3e80: 74 20 69 74 20 69 73 20 61 20 62 75 67 20 74 6f  t it is a bug to
3e90: 20 72 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   return 1 if the
3ea0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 6d   expression.** m
3eb0: 69 67 68 74 20 62 65 20 74 72 75 65 20 69 6e 20  ight be true in 
3ec0: 73 6f 6d 65 20 72 61 72 65 20 63 69 72 63 75 6d  some rare circum
3ed0: 73 74 61 6e 63 65 73 20 28 61 20 66 61 6c 73 65  stances (a false
3ee0: 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a 2a 0a 2a   positive.).**.*
3ef0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 74  * Note that if t
3f00: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
3f10: 20 70 61 72 74 20 6f 66 20 63 6f 6e 64 69 74 69   part of conditi
3f20: 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c 45  onal for a.** LE
3f30: 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 77 65  FT JOIN, then we
3f40: 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
3f50: 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  e at compile-tim
3f60: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
3f70: 0a 2a 2a 20 69 73 20 69 74 20 74 72 75 65 20 6f  .** is it true o
3f80: 72 20 66 61 6c 73 65 2c 20 73 6f 20 61 6c 77 61  r false, so alwa
3f90: 79 73 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  ys return 0..*/.
3fa0: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 41  static int exprA
3fb0: 6c 77 61 79 73 46 61 6c 73 65 28 45 78 70 72 20  lwaysFalse(Expr 
3fc0: 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30  *p){.  int v = 0
3fd0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
3fe0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
3ff0: 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  omJoin) ) return
4000: 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
4010: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
4020: 70 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20  p, &v) ) return 
4030: 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 3d 3d 30  0;.  return v==0
4040: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20  ;.}../*.** Join 
4050: 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20  two expressions 
4060: 75 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65  using an AND ope
4070: 72 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65  rator.  If eithe
4080: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a  r expression is.
4090: 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75  ** NULL, then ju
40a0: 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74  st return the ot
40b0: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  her expression..
40c0: 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64  **.** If one sid
40d0: 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  e or the other o
40e0: 66 20 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f  f the AND is kno
40f0: 77 6e 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20  wn to be false, 
4100: 74 68 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20  then instead.** 
4110: 6f 66 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20  of returning an 
4120: 41 4e 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  AND expression, 
4130: 6a 75 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f  just return a co
4140: 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f  nstant expressio
4150: 6e 20 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75  n with.** a valu
4160: 65 20 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45  e of false..*/.E
4170: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
4180: 41 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  And(sqlite3 *db,
4190: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78   Expr *pLeft, Ex
41a0: 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69  pr *pRight){.  i
41b0: 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20  f( pLeft==0 ){. 
41c0: 20 20 20 72 65 74 75 72 6e 20 70 52 69 67 68 74     return pRight
41d0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52  ;.  }else if( pR
41e0: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ight==0 ){.    r
41f0: 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d  eturn pLeft;.  }
4200: 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77  else if( exprAlw
4210: 61 79 73 46 61 6c 73 65 28 70 4c 65 66 74 29 20  aysFalse(pLeft) 
4220: 7c 7c 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c  || exprAlwaysFal
4230: 73 65 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20  se(pRight) ){.  
4240: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
4250: 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a  ete(db, pLeft);.
4260: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
4270: 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74  elete(db, pRight
4280: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
4290: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
42a0: 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26  b, TK_INTEGER, &
42b0: 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73  sqlite3IntTokens
42c0: 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  [0], 0);.  }else
42d0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  {.    Expr *pNew
42e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
42f0: 6c 6f 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20  loc(db, TK_AND, 
4300: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
4310: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
4320: 72 65 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70  rees(db, pNew, p
4330: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
4340: 20 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a     return pNew;.
4350: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e    }.}../*.** Con
4360: 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70  struct a new exp
4370: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72  ression node for
4380: 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68   a function with
4390: 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67   multiple.** arg
43a0: 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20  uments..*/.Expr 
43b0: 2a 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63  *sqlite3ExprFunc
43c0: 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
43d0: 73 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  se, ExprList *pL
43e0: 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
43f0: 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  en){.  Expr *pNe
4400: 77 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  w;.  sqlite3 *db
4410: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
4420: 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20   assert( pToken 
4430: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
4440: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
4450: 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54   TK_FUNCTION, pT
4460: 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20  oken, 1);.  if( 
4470: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pNew==0 ){.    s
4480: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
4490: 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
44a0: 20 2f 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79   /* Avoid memory
44b0: 20 6c 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f   leak when mallo
44c0: 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72  c fails */.    r
44d0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
44e0: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70  New->x.pList = p
44f0: 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20  List;.  assert( 
4500: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
4510: 28 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c  (pNew, EP_xIsSel
4520: 65 63 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  ect) );.  sqlite
4530: 33 45 78 70 72 53 65 74 48 65 69 67 68 74 28 70  3ExprSetHeight(p
4540: 50 61 72 73 65 2c 20 70 4e 65 77 29 3b 0a 20 20  Parse, pNew);.  
4550: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
4560: 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76  /*.** Assign a v
4570: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74  ariable number t
4580: 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  o an expression 
4590: 74 68 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77  that encodes a w
45a0: 69 6c 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68  ildcard.** in th
45b0: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73  e original SQL s
45c0: 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a  tatement.  .**.*
45d0: 2a 20 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73  * Wildcards cons
45e0: 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67  isting of a sing
45f0: 6c 65 20 22 3f 22 20 61 72 65 20 61 73 73 69 67  le "?" are assig
4600: 6e 65 64 20 74 68 65 20 6e 65 78 74 20 73 65 71  ned the next seq
4610: 75 65 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61  uential.** varia
4620: 62 6c 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a  ble number..**.*
4630: 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74  * Wildcards of t
4640: 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61  he form "?nnn" a
4650: 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20  re assigned the 
4660: 6e 75 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57  number "nnn".  W
4670: 65 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22  e make.** sure "
4680: 6e 6e 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20  nnn" is not too 
4690: 62 65 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65  be to avoid a de
46a0: 6e 69 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20  nial of service 
46b0: 61 74 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74  attack when.** t
46c0: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
46d0: 20 63 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65   comes from an e
46e0: 78 74 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a  xternal source..
46f0: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
4700: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61  of the form ":aa
4710: 61 22 2c 20 22 40 61 61 61 22 2c 20 6f 72 20 22  a", "@aaa", or "
4720: 24 61 61 61 22 20 61 72 65 20 61 73 73 69 67 6e  $aaa" are assign
4730: 65 64 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ed the same numb
4740: 65 72 0a 2a 2a 20 61 73 20 74 68 65 20 70 72 65  er.** as the pre
4750: 76 69 6f 75 73 20 69 6e 73 74 61 6e 63 65 20 6f  vious instance o
4760: 66 20 74 68 65 20 73 61 6d 65 20 77 69 6c 64 63  f the same wildc
4770: 61 72 64 2e 20 20 4f 72 20 69 66 20 74 68 69 73  ard.  Or if this
4780: 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   is the first.**
4790: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
47a0: 20 77 69 6c 64 63 61 72 64 2c 20 74 68 65 20 6e   wildcard, the n
47b0: 65 78 74 20 73 65 71 75 65 6e 69 61 6c 20 76 61  ext sequenial va
47c0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73  riable number is
47d0: 0a 2a 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f  .** assigned..*/
47e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
47f0: 72 41 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72  rAssignVarNumber
4800: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
4810: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
4820: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
4830: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73  arse->db;.  cons
4840: 74 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66  t char *z;..  if
4850: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
4860: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 21  urn;.  assert( !
4870: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
4880: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
4890: 56 61 6c 75 65 7c 45 50 5f 52 65 64 75 63 65 64  Value|EP_Reduced
48a0: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29  |EP_TokenOnly) )
48b0: 3b 0a 20 20 7a 20 3d 20 70 45 78 70 72 2d 3e 75  ;.  z = pExpr->u
48c0: 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72  .zToken;.  asser
48d0: 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( z!=0 );.  ass
48e0: 65 72 74 28 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a  ert( z[0]!=0 );.
48f0: 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b    if( z[1]==0 ){
4900: 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64  .    /* Wildcard
4910: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22   of the form "?"
4920: 2e 20 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65  .  Assign the ne
4930: 78 74 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  xt variable numb
4940: 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  er */.    assert
4950: 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20  ( z[0]=='?' );. 
4960: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
4970: 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50  n = (ynVar)(++pP
4980: 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 7d  arse->nVar);.  }
4990: 65 6c 73 65 7b 0a 20 20 20 20 79 6e 56 61 72 20  else{.    ynVar 
49a0: 78 20 3d 20 30 3b 0a 20 20 20 20 75 33 32 20 6e  x = 0;.    u32 n
49b0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
49c0: 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 7a  30(z);.    if( z
49d0: 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20  [0]=='?' ){.    
49e0: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66    /* Wildcard of
49f0: 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22   the form "?nnn"
4a00: 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e 6e 22  .  Convert "nnn"
4a10: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 61   to an integer a
4a20: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 20  nd.      ** use 
4a30: 69 74 20 61 73 20 74 68 65 20 76 61 72 69 61 62  it as the variab
4a40: 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20  le number */.   
4a50: 20 20 20 69 36 34 20 69 3b 0a 20 20 20 20 20 20     i64 i;.      
4a60: 69 6e 74 20 62 4f 6b 20 3d 20 30 3d 3d 73 71 6c  int bOk = 0==sql
4a70: 69 74 65 33 41 74 6f 69 36 34 28 26 7a 5b 31 5d  ite3Atoi64(&z[1]
4a80: 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c 49 54  , &i, n-1, SQLIT
4a90: 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 70  E_UTF8);.      p
4aa0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
4ab0: 78 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20 20  x = (ynVar)i;.  
4ac0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
4ad0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
4ae0: 63 61 73 65 28 20 69 3d 3d 31 20 29 3b 0a 20 20  case( i==1 );.  
4af0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
4b00: 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  =db->aLimit[SQLI
4b10: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
4b20: 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29 3b 0a 20  E_NUMBER]-1 );. 
4b30: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
4b40: 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ==db->aLimit[SQL
4b50: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
4b60: 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a 20 20  LE_NUMBER] );.  
4b70: 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 7c      if( bOk==0 |
4b80: 7c 20 69 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e 61  | i<1 || i>db->a
4b90: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
4ba0: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
4bb0: 45 52 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ER] ){.        s
4bc0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4bd0: 50 61 72 73 65 2c 20 22 76 61 72 69 61 62 6c 65  Parse, "variable
4be0: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62 65 20   number must be 
4bf0: 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64 20 3f  between ?1 and ?
4c00: 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %d",.           
4c10: 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49   db->aLimit[SQLI
4c20: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
4c30: 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20 20 20 20  E_NUMBER]);.    
4c40: 20 20 20 20 78 20 3d 20 30 3b 0a 20 20 20 20 20      x = 0;.     
4c50: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e 70   }.      if( i>p
4c60: 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20  Parse->nVar ){. 
4c70: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
4c80: 56 61 72 20 3d 20 28 69 6e 74 29 69 3b 0a 20 20  Var = (int)i;.  
4c90: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
4ca0: 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  .      /* Wildca
4cb0: 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c  rds like ":aaa",
4cc0: 20 22 24 61 61 61 22 20 6f 72 20 22 40 61 61 61   "$aaa" or "@aaa
4cd0: 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73 61  ".  Reuse the sa
4ce0: 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  me variable.    
4cf0: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74    ** number as t
4d00: 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61  he prior appeara
4d10: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
4d20: 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20  name, or if the 
4d30: 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68 61  name.      ** ha
4d40: 73 20 6e 65 76 65 72 20 61 70 70 65 61 72 65 64  s never appeared
4d50: 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74   before, reuse t
4d60: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
4d70: 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2f   number.      */
4d80: 0a 20 20 20 20 20 20 79 6e 56 61 72 20 69 3b 0a  .      ynVar i;.
4d90: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
4da0: 3c 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3b 20  <pParse->nzVar; 
4db0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
4dc0: 28 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b  ( pParse->azVar[
4dd0: 69 5d 20 26 26 20 6d 65 6d 63 6d 70 28 70 50 61  i] && memcmp(pPa
4de0: 72 73 65 2d 3e 61 7a 56 61 72 5b 69 5d 2c 7a 2c  rse->azVar[i],z,
4df0: 6e 2b 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  n+1)==0 ){.     
4e00: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
4e10: 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72  umn = x = (ynVar
4e20: 29 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  )i+1;.          
4e30: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
4e40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
4e50: 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20 70 45  f( x==0 ) x = pE
4e60: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28  xpr->iColumn = (
4e70: 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d  ynVar)(++pParse-
4e80: 3e 6e 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20  >nVar);.    }.  
4e90: 20 20 69 66 28 20 78 3e 30 20 29 7b 0a 20 20 20    if( x>0 ){.   
4ea0: 20 20 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d     if( x>pParse-
4eb0: 3e 6e 7a 56 61 72 20 29 7b 0a 20 20 20 20 20 20  >nzVar ){.      
4ec0: 20 20 63 68 61 72 20 2a 2a 61 3b 0a 20 20 20 20    char **a;.    
4ed0: 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44      a = sqlite3D
4ee0: 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 50 61  bRealloc(db, pPa
4ef0: 72 73 65 2d 3e 61 7a 56 61 72 2c 20 78 2a 73 69  rse->azVar, x*si
4f00: 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20  zeof(a[0]));.   
4f10: 20 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 20       if( a==0 ) 
4f20: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 72 72 6f  return;  /* Erro
4f30: 72 20 72 65 70 6f 72 74 65 64 20 74 68 72 6f 75  r reported throu
4f40: 67 68 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  gh db->mallocFai
4f50: 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  led */.        p
4f60: 50 61 72 73 65 2d 3e 61 7a 56 61 72 20 3d 20 61  Parse->azVar = a
4f70: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
4f80: 28 26 61 5b 70 50 61 72 73 65 2d 3e 6e 7a 56 61  (&a[pParse->nzVa
4f90: 72 5d 2c 20 30 2c 20 28 78 2d 70 50 61 72 73 65  r], 0, (x-pParse
4fa0: 2d 3e 6e 7a 56 61 72 29 2a 73 69 7a 65 6f 66 28  ->nzVar)*sizeof(
4fb0: 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 20 20  a[0]));.        
4fc0: 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 20 3d 20  pParse->nzVar = 
4fd0: 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  x;.      }.     
4fe0: 20 69 66 28 20 7a 5b 30 5d 21 3d 27 3f 27 20 7c   if( z[0]!='?' |
4ff0: 7c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b  | pParse->azVar[
5000: 78 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  x-1]==0 ){.     
5010: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
5020: 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56  (db, pParse->azV
5030: 61 72 5b 78 2d 31 5d 29 3b 0a 20 20 20 20 20 20  ar[x-1]);.      
5040: 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b    pParse->azVar[
5050: 78 2d 31 5d 20 3d 20 73 71 6c 69 74 65 33 44 62  x-1] = sqlite3Db
5060: 53 74 72 4e 44 75 70 28 64 62 2c 20 7a 2c 20 6e  StrNDup(db, z, n
5070: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5080: 0a 20 20 7d 20 0a 20 20 69 66 28 20 21 70 50 61  .  } .  if( !pPa
5090: 72 73 65 2d 3e 6e 45 72 72 20 26 26 20 70 50 61  rse->nErr && pPa
50a0: 72 73 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61 4c  rse->nVar>db->aL
50b0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
50c0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
50d0: 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  R] ){.    sqlite
50e0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
50f0: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20  , "too many SQL 
5100: 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d  variables");.  }
5110: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73  .}../*.** Recurs
5120: 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20  ively delete an 
5130: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
5140: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5150: 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74  ExprDelete(sqlit
5160: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29  e3 *db, Expr *p)
5170: 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  {.  if( p==0 ) r
5180: 65 74 75 72 6e 3b 0a 20 20 2f 2a 20 53 61 6e 69  eturn;.  /* Sani
5190: 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65 72 74  ty check: Assert
51a0: 20 74 68 61 74 20 74 68 65 20 49 6e 74 56 61 6c   that the IntVal
51b0: 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69  ue is non-negati
51c0: 76 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20  ve if it exists 
51d0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  */.  assert( !Ex
51e0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
51f0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c   EP_IntValue) ||
5200: 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20   p->u.iValue>=0 
5210: 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  );.  if( !ExprHa
5220: 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20  sAnyProperty(p, 
5230: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
5240: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
5250: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
5260: 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eft);.    sqlite
5270: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
5280: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  p->pRight);.    
5290: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
52a0: 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63  erty(p, EP_Reduc
52b0: 65 64 29 20 26 26 20 28 70 2d 3e 66 6c 61 67 73  ed) && (p->flags
52c0: 32 20 26 20 45 50 32 5f 4d 61 6c 6c 6f 63 65 64  2 & EP2_Malloced
52d0: 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20  Token)!=0 ){.   
52e0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
52f0: 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  (db, p->u.zToken
5300: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
5310: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
5320: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
5330: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
5340: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
5350: 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29  b, p->x.pSelect)
5360: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5370: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
5380: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
5390: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  x.pList);.    }.
53a0: 20 20 7d 0a 20 20 69 66 28 20 21 45 78 70 72 48    }.  if( !ExprH
53b0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
53c0: 5f 53 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20  _Static) ){.    
53d0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
53e0: 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , p);.  }.}../*.
53f0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
5400: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c  mber of bytes al
5410: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
5420: 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63  expression struc
5430: 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20  ture .** passed 
5440: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
5450: 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61  ument. This is a
5460: 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50  lways one of EXP
5470: 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45  R_FULLSIZE,.** E
5480: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
5490: 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  or EXPR_TOKENONL
54a0: 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  YSIZE..*/.static
54b0: 20 69 6e 74 20 65 78 70 72 53 74 72 75 63 74 53   int exprStructS
54c0: 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ize(Expr *p){.  
54d0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
54e0: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
54f0: 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45 58  nly) ) return EX
5500: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
5510: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
5520: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65  roperty(p, EP_Re
5530: 64 75 63 65 64 29 20 29 20 72 65 74 75 72 6e 20  duced) ) return 
5540: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
5550: 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ;.  return EXPR_
5560: 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a  FULLSIZE;.}../*.
5570: 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72  ** The dupedExpr
5580: 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73  *Size() routines
5590: 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68 65   each return the
55a0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
55b0: 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20   required.** to 
55c0: 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20  store a copy of 
55d0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72  an expression or
55e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
55f0: 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20 69  .  They differ i
5600: 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66  n.** how much of
5610: 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65 61   the tree is mea
5620: 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  sured..**.**    
5630: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
5640: 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20  Size()     Size 
5650: 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72  of only the Expr
5660: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20   structure .**  
5670: 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65     dupedExprNode
5680: 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a  Size()       Siz
5690: 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63  e of Expr + spac
56a0: 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20  e for token.**  
56b0: 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a 65     dupedExprSize
56c0: 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78 70  ()           Exp
56d0: 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74  r + token + subt
56e0: 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a  ree components.*
56f0: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
5700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
5740: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
5750: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66 75  rStructSize() fu
5760: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
5770: 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20  wo values OR-ed 
5780: 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28  together:  .** (
5790: 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65 71  1) the space req
57a0: 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79  uired for a copy
57b0: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
57c0: 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20  ucture only and 
57d0: 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78  .** (2) the EP_x
57e0: 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e  xx flags that in
57f0: 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65 20  dicate what the 
5800: 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20 73  structure size s
5810: 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65  hould be..** The
5820: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69   return values i
5830: 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a  s always one of:
5840: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52  .**.**      EXPR
5850: 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20  _FULLSIZE.**    
5860: 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49    EXPR_REDUCEDSI
5870: 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65  ZE   | EP_Reduce
5880: 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54  d.**      EXPR_T
5890: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45  OKENONLYSIZE | E
58a0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a  P_TokenOnly.**.*
58b0: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
58c0: 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20  e structure can 
58d0: 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b  be found by mask
58e0: 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76  ing the return v
58f0: 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20  alue.** of this 
5900: 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78 66  routine with 0xf
5910: 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63  ff.  The flags c
5920: 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d  an be found by m
5930: 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65  asking the.** re
5940: 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20  turn value with 
5950: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
5960: 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  kenOnly..**.** N
5970: 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66 6c  ote that with fl
5980: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
5990: 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  UCE, this routin
59a0: 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c  es works on full
59b0: 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75  -size.** (unredu
59c0: 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74  ced) Expr object
59d0: 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69  s as they or ori
59e0: 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63  ginally construc
59f0: 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  ted by the parse
5a00: 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70  r..** During exp
5a10: 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
5a20: 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  , extra informat
5a30: 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20  ion is computed 
5a40: 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a  and moved into.*
5a50: 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66  * later parts of
5a60: 20 74 65 68 20 45 78 70 72 20 6f 62 6a 65 63 74   teh Expr object
5a70: 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61 20   and that extra 
5a80: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68  information migh
5a90: 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a  t get chopped.**
5aa0: 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70 72   off if the expr
5ab0: 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65  ession is reduce
5ac0: 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  d.  Note also th
5ad0: 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77  at it does not w
5ae0: 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61  ork to.** make a
5af0: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20   EXPRDUP_REDUCE 
5b00: 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75 63 65  copy of a reduce
5b10: 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49  d expression.  I
5b20: 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a  t is only legal.
5b30: 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61 20 70  ** to reduce a p
5b40: 72 69 73 74 69 6e 65 20 65 78 70 72 65 73 73 69  ristine expressi
5b50: 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74 68 65  on tree from the
5b60: 20 70 61 72 73 65 72 2e 20 20 54 68 65 20 69 6d   parser.  The im
5b70: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20  plementation.** 
5b80: 6f 66 20 64 75 70 65 64 45 78 70 72 53 74 72 75  of dupedExprStru
5b90: 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e  ctSize() contain
5ba0: 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65 72 74   multiple assert
5bb0: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  () statements th
5bc0: 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  at attempt.** to
5bd0: 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 63 6f   enforce this co
5be0: 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61  nstraint..*/.sta
5bf0: 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70  tic int dupedExp
5c00: 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72  rStructSize(Expr
5c10: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
5c20: 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20  .  int nSize;.  
5c30: 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 45  assert( flags==E
5c40: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 7c 7c  XPRDUP_REDUCE ||
5c50: 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20   flags==0 ); /* 
5c60: 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76 61  Only one flag va
5c70: 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20  lue allowed */. 
5c80: 20 69 66 28 20 30 3d 3d 28 66 6c 61 67 73 26 45   if( 0==(flags&E
5c90: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 20 29  XPRDUP_REDUCE) )
5ca0: 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58  {.    nSize = EX
5cb0: 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d  PR_FULLSIZE;.  }
5cc0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
5cd0: 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f  ( !ExprHasAnyPro
5ce0: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
5cf0: 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
5d00: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
5d10: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
5d20: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
5d30: 29 20 29 3b 20 0a 20 20 20 20 61 73 73 65 72 74  ) ); .    assert
5d40: 28 20 28 70 2d 3e 66 6c 61 67 73 32 20 26 20 45  ( (p->flags2 & E
5d50: 50 32 5f 4d 61 6c 6c 6f 63 65 64 54 6f 6b 65 6e  P2_MallocedToken
5d60: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
5d70: 72 74 28 20 28 70 2d 3e 66 6c 61 67 73 32 20 26  rt( (p->flags2 &
5d80: 20 45 50 32 5f 49 72 72 65 64 75 63 69 62 6c 65   EP2_Irreducible
5d90: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  )==0 );.    if( 
5da0: 70 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 70  p->pLeft || p->p
5db0: 52 69 67 68 74 20 7c 7c 20 70 2d 3e 78 2e 70 4c  Right || p->x.pL
5dc0: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 53 69  ist ){.      nSi
5dd0: 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55 43 45  ze = EXPR_REDUCE
5de0: 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64 75 63  DSIZE | EP_Reduc
5df0: 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ed;.    }else{. 
5e00: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50       nSize = EXP
5e10: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20  R_TOKENONLYSIZE 
5e20: 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a  | EP_TokenOnly;.
5e30: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
5e40: 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a  rn nSize;.}../*.
5e50: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
5e60: 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 70 61   returns the spa
5e70: 63 65 20 69 6e 20 62 79 74 65 73 20 72 65 71 75  ce in bytes requ
5e80: 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  ired to store th
5e90: 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68  e copy .** of th
5ea0: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  e Expr structure
5eb0: 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74   and a copy of t
5ec0: 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e  he Expr.u.zToken
5ed0: 20 73 74 72 69 6e 67 20 28 69 66 20 74 68 61 74   string (if that
5ee0: 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 64 65  .** string is de
5ef0: 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69  fined.).*/.stati
5f00: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 4e  c int dupedExprN
5f10: 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a 70 2c  odeSize(Expr *p,
5f20: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
5f30: 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64  nt nByte = duped
5f40: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  ExprStructSize(p
5f50: 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66 66 66  , flags) & 0xfff
5f60: 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  ;.  if( !ExprHas
5f70: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49  Property(p, EP_I
5f80: 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75  ntValue) && p->u
5f90: 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e  .zToken ){.    n
5fa0: 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  Byte += sqlite3S
5fb0: 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f  trlen30(p->u.zTo
5fc0: 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65  ken)+1;.  }.  re
5fd0: 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74  turn ROUND8(nByt
5fe0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  e);.}../*.** Ret
5ff0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
6000: 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  f bytes required
6010: 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 75 70   to create a dup
6020: 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20 0a 2a  licate of the .*
6030: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73  * expression pas
6040: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
6050: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 73   argument. The s
6060: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
6070: 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74  s a.** mask cont
6080: 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50 5f 58  aining EXPRDUP_X
6090: 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20  XX flags..**.** 
60a0: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
60b0: 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70 61 63  ed includes spac
60c0: 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f  e to create a co
60d0: 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73  py of the Expr s
60e0: 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20  truct.** itself 
60f0: 61 6e 64 20 74 68 65 20 62 75 66 66 65 72 20 72  and the buffer r
6100: 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 45 78  eferred to by Ex
6110: 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20  pr.u.zToken, if 
6120: 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  any..**.** If th
6130: 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  e EXPRDUP_REDUCE
6140: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
6150: 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  en the return va
6160: 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a  lue includes .**
6170: 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c 69 63   space to duplic
6180: 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64  ate all Expr nod
6190: 65 73 20 69 6e 20 74 68 65 20 74 72 65 65 20 66  es in the tree f
61a0: 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e 70 4c  ormed by Expr.pL
61b0: 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72  eft .** and Expr
61c0: 2e 70 52 69 67 68 74 20 76 61 72 69 61 62 6c 65  .pRight variable
61d0: 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72 20 61  s (but not for a
61e0: 6e 79 20 73 74 72 75 63 74 75 72 65 73 20 70 6f  ny structures po
61f0: 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20  inted to or .** 
6200: 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d 20 74  descended from t
6210: 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20  he Expr.x.pList 
6220: 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63  or Expr.x.pSelec
6230: 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f  t variables)..*/
6240: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65  .static int dupe
6250: 64 45 78 70 72 53 69 7a 65 28 45 78 70 72 20 2a  dExprSize(Expr *
6260: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
6270: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a   int nByte = 0;.
6280: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6e    if( p ){.    n
6290: 42 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72  Byte = dupedExpr
62a0: 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67  NodeSize(p, flag
62b0: 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67  s);.    if( flag
62c0: 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  s&EXPRDUP_REDUCE
62d0: 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20   ){.      nByte 
62e0: 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  += dupedExprSize
62f0: 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73  (p->pLeft, flags
6300: 29 20 2b 20 64 75 70 65 64 45 78 70 72 53 69 7a  ) + dupedExprSiz
6310: 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61  e(p->pRight, fla
6320: 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  gs);.    }.  }. 
6330: 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d   return nByte;.}
6340: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
6350: 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72  ction is similar
6360: 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 44   to sqlite3ExprD
6370: 75 70 28 29 2c 20 65 78 63 65 70 74 20 74 68 61  up(), except tha
6380: 74 20 69 66 20 70 7a 42 75 66 66 65 72 20 0a 2a  t if pzBuffer .*
6390: 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  * is not NULL th
63a0: 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20  en *pzBuffer is 
63b0: 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74  assumed to point
63c0: 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c 61 72   to a buffer lar
63d0: 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f  ge enough .** to
63e0: 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20   store the copy 
63f0: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2c  of expression p,
6400: 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 70   the copies of p
6410: 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69  ->u.zToken.** (i
6420: 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 61  f applicable), a
6430: 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66  nd the copies of
6440: 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e   the p->pLeft an
6450: 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78 70 72  d p->pRight expr
6460: 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61  essions,.** if a
6470: 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72  ny. Before retur
6480: 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72 20  ning, *pzBuffer 
6490: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 66 69  is set to the fi
64a0: 72 73 74 20 62 79 74 65 20 70 61 73 73 65 64 20  rst byte passed 
64b0: 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f  the.** portion o
64c0: 66 20 74 68 65 20 62 75 66 66 65 72 20 63 6f 70  f the buffer cop
64d0: 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68 69 73  ied into by this
64e0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
64f0: 61 74 69 63 20 45 78 70 72 20 2a 65 78 70 72 44  atic Expr *exprD
6500: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
6510: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
6520: 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65  gs, u8 **pzBuffe
6530: 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  r){.  Expr *pNew
6540: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
6550: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
6560: 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  lue to return */
6570: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
6580: 63 6f 6e 73 74 20 69 6e 74 20 69 73 52 65 64 75  const int isRedu
6590: 63 65 64 20 3d 20 28 66 6c 61 67 73 26 45 58 50  ced = (flags&EXP
65a0: 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
65b0: 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a 20 20    u8 *zAlloc;.  
65c0: 20 20 75 33 32 20 73 74 61 74 69 63 46 6c 61 67    u32 staticFlag
65d0: 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73 65 72   = 0;..    asser
65e0: 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c  t( pzBuffer==0 |
65f0: 7c 20 69 73 52 65 64 75 63 65 64 20 29 3b 0a 0a  | isReduced );..
6600: 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
6610: 74 20 77 68 65 72 65 20 74 6f 20 77 72 69 74 65  t where to write
6620: 20 74 68 65 20 6e 65 77 20 45 78 70 72 20 73 74   the new Expr st
6630: 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20 20  ructure. */.    
6640: 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a  if( pzBuffer ){.
6650: 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a        zAlloc = *
6660: 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 20 20  pzBuffer;.      
6670: 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45 50 5f  staticFlag = EP_
6680: 53 74 61 74 69 63 3b 0a 20 20 20 20 7d 65 6c 73  Static;.    }els
6690: 65 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20  e{.      zAlloc 
66a0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
66b0: 63 52 61 77 28 64 62 2c 20 64 75 70 65 64 45 78  cRaw(db, dupedEx
66c0: 70 72 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  prSize(p, flags)
66d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  );.    }.    pNe
66e0: 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c  w = (Expr *)zAll
66f0: 6f 63 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65  oc;..    if( pNe
6700: 77 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65  w ){.      /* Se
6710: 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74 68  t nNewSize to th
6720: 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64  e size allocated
6730: 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75   for the structu
6740: 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20  re pointed to.  
6750: 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20      ** by pNew. 
6760: 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20 45  This is either E
6770: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58  XPR_FULLSIZE, EX
6780: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f  PR_REDUCEDSIZE o
6790: 72 0a 20 20 20 20 20 20 2a 2a 20 45 58 50 52 5f  r.      ** EXPR_
67a0: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e  TOKENONLYSIZE. n
67b0: 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20  Token is set to 
67c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
67d0: 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20  tes consumed.   
67e0: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f 70     ** by the cop
67f0: 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54  y of the p->u.zT
6800: 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20  oken string (if 
6810: 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  any)..      */. 
6820: 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67       const unsig
6830: 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20  ned nStructSize 
6840: 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  = dupedExprStruc
6850: 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b  tSize(p, flags);
6860: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
6870: 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72   nNewSize = nStr
6880: 75 63 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b  uctSize & 0xfff;
6890: 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65  .      int nToke
68a0: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21 45 78  n;.      if( !Ex
68b0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
68c0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26   EP_IntValue) &&
68d0: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a   p->u.zToken ){.
68e0: 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d          nToken =
68f0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6900: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20  (p->u.zToken) + 
6910: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
6920: 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d          nToken =
6930: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
6940: 20 20 69 66 28 20 69 73 52 65 64 75 63 65 64 20    if( isReduced 
6950: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
6960: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
6970: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
6980: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
6990: 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70  memcpy(zAlloc, p
69a0: 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20  , nNewSize);.   
69b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
69c0: 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20 65 78    int nSize = ex
69d0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b  prStructSize(p);
69e0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
69f0: 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65  zAlloc, p, nSize
6a00: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  );.        memse
6a10: 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d  t(&zAlloc[nSize]
6a20: 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49  , 0, EXPR_FULLSI
6a30: 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20  ZE-nSize);.     
6a40: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74   }..      /* Set
6a50: 20 74 68 65 20 45 50 5f 52 65 64 75 63 65 64 2c   the EP_Reduced,
6a60: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61   EP_TokenOnly, a
6a70: 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c 61  nd EP_Static fla
6a80: 67 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  gs appropriately
6a90: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  . */.      pNew-
6aa0: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52  >flags &= ~(EP_R
6ab0: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
6ac0: 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 29 3b 0a  nly|EP_Static);.
6ad0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
6ae0: 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a 65  s |= nStructSize
6af0: 20 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45   & (EP_Reduced|E
6b00: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20  P_TokenOnly);.  
6b10: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
6b20: 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b 0a 0a  |= staticFlag;..
6b30: 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68        /* Copy th
6b40: 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74  e p->u.zToken st
6b50: 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f  ring, if any. */
6b60: 0a 20 20 20 20 20 20 69 66 28 20 6e 54 6f 6b 65  .      if( nToke
6b70: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  n ){.        cha
6b80: 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65 77  r *zToken = pNew
6b90: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68  ->u.zToken = (ch
6ba0: 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77  ar*)&zAlloc[nNew
6bb0: 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20 6d  Size];.        m
6bc0: 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d  emcpy(zToken, p-
6bd0: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  >u.zToken, nToke
6be0: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  n);.      }..   
6bf0: 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e 66     if( 0==((p->f
6c00: 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67 73  lags|pNew->flags
6c10: 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ) & EP_TokenOnly
6c20: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
6c30: 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77  Fill in the pNew
6c40: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70  ->x.pSelect or p
6c50: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d  New->x.pList mem
6c60: 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ber. */.        
6c70: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
6c80: 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c  rty(p, EP_xIsSel
6c90: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
6ca0: 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63    pNew->x.pSelec
6cb0: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
6cc0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53  tDup(db, p->x.pS
6cd0: 65 6c 65 63 74 2c 20 69 73 52 65 64 75 63 65 64  elect, isReduced
6ce0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
6cf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
6d00: 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71 6c 69  ->x.pList = sqli
6d10: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
6d20: 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 69  b, p->x.pList, i
6d30: 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20 20 20  sReduced);.     
6d40: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
6d50: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70      /* Fill in p
6d60: 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70  New->pLeft and p
6d70: 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a  New->pRight. */.
6d80: 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
6d90: 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 4e 65  sAnyProperty(pNe
6da0: 77 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50  w, EP_Reduced|EP
6db0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
6dc0: 20 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d         zAlloc +=
6dd0: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
6de0: 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ze(p, flags);.  
6df0: 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
6e00: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
6e10: 45 50 5f 52 65 64 75 63 65 64 29 20 29 7b 0a 20  EP_Reduced) ){. 
6e20: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
6e30: 4c 65 66 74 20 3d 20 65 78 70 72 44 75 70 28 64  Left = exprDup(d
6e40: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50  b, p->pLeft, EXP
6e50: 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41  RDUP_REDUCE, &zA
6e60: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20  lloc);.         
6e70: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20   pNew->pRight = 
6e80: 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  exprDup(db, p->p
6e90: 52 69 67 68 74 2c 20 45 58 50 52 44 55 50 5f 52  Right, EXPRDUP_R
6ea0: 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b  EDUCE, &zAlloc);
6eb0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6ec0: 20 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20     if( pzBuffer 
6ed0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 7a  ){.          *pz
6ee0: 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b  Buffer = zAlloc;
6ef0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6f00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6f10: 70 4e 65 77 2d 3e 66 6c 61 67 73 32 20 3d 20 30  pNew->flags2 = 0
6f20: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 45  ;.        if( !E
6f30: 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
6f40: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
6f50: 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  y) ){.          
6f60: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71  pNew->pLeft = sq
6f70: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
6f80: 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20   p->pLeft, 0);. 
6f90: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
6fa0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
6fb0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52  xprDup(db, p->pR
6fc0: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
6fd0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
6fe0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
6ff0: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pNew;.}../*.** T
7000: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f  he following gro
7010: 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d  up of routines m
7020: 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73 20  ake deep copies 
7030: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a  of expressions,.
7040: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
7050: 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20 61  sts, ID lists, a
7060: 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  nd select statem
7070: 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69 65  ents.  The copie
7080: 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65  s can.** be dele
7090: 74 65 64 20 28 62 79 20 62 65 69 6e 67 20 70 61  ted (by being pa
70a0: 73 73 65 64 20 74 6f 20 74 68 65 69 72 20 72 65  ssed to their re
70b0: 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65  spective ...Dele
70c0: 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a  te() routines).*
70d0: 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65 63 74  * without effect
70e0: 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ing the original
70f0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70  s..**.** The exp
7100: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44  ression list, ID
7110: 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c 69 73  , and source lis
7120: 74 73 20 72 65 74 75 72 6e 20 62 79 20 73 71 6c  ts return by sql
7130: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
7140: 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c  ),.** sqlite3IdL
7150: 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20 73 71  istDup(), and sq
7160: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28  lite3SrcListDup(
7170: 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66 75 72  ) can not be fur
7180: 74 68 65 72 20 65 78 70 61 6e 64 65 64 20 0a 2a  ther expanded .*
7190: 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20  * by subsequent 
71a0: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a  calls to sqlite*
71b0: 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72 6f 75  ListAppend() rou
71c0: 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79  tines..**.** Any
71d0: 20 74 61 62 6c 65 73 20 74 68 61 74 20 74 68 65   tables that the
71e0: 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20 70   SrcList might p
71f0: 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74 20  oint to are not 
7200: 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a  duplicated..**.*
7210: 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 72 61  * The flags para
7220: 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e 73 20 61  meter contains a
7230: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
7240: 74 68 65 20 45 58 50 52 44 55 50 5f 58 58 58 20  the EXPRDUP_XXX 
7250: 66 6c 61 67 73 2e 0a 2a 2a 20 49 66 20 74 68 65  flags..** If the
7260: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20   EXPRDUP_REDUCE 
7270: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
7280: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
7290: 72 65 74 75 72 6e 65 64 20 69 73 20 61 0a 2a 2a  returned is a.**
72a0: 20 74 72 75 6e 63 61 74 65 64 20 76 65 72 73 69   truncated versi
72b0: 6f 6e 20 6f 66 20 74 68 65 20 75 73 75 61 6c 20  on of the usual 
72c0: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 74  Expr structure t
72d0: 68 61 74 20 77 69 6c 6c 20 62 65 20 73 74 6f 72  hat will be stor
72e0: 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66  ed as.** part of
72f0: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
7300: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
7310: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
7320: 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  hema..*/.Expr *s
7330: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 73 71  qlite3ExprDup(sq
7340: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
7350: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
7360: 20 20 72 65 74 75 72 6e 20 65 78 70 72 44 75 70    return exprDup
7370: 28 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30  (db, p, flags, 0
7380: 29 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73  );.}.ExprList *s
7390: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
73a0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
73b0: 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  xprList *p, int 
73c0: 66 6c 61 67 73 29 7b 0a 20 20 45 78 70 72 4c 69  flags){.  ExprLi
73d0: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75  st *pNew;.  stru
73e0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
73f0: 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74   *pItem, *pOldIt
7400: 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  em;.  int i;.  i
7410: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
7420: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
7430: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
7440: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
7450: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
7460: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
7470: 20 70 4e 65 77 2d 3e 69 45 43 75 72 73 6f 72 20   pNew->iECursor 
7480: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78  = 0;.  pNew->nEx
7490: 70 72 20 3d 20 69 20 3d 20 70 2d 3e 6e 45 78 70  pr = i = p->nExp
74a0: 72 3b 0a 20 20 69 66 28 20 28 66 6c 61 67 73 20  r;.  if( (flags 
74b0: 26 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  & EXPRDUP_REDUCE
74c0: 29 3d 3d 30 20 29 20 66 6f 72 28 69 3d 31 3b 20  )==0 ) for(i=1; 
74d0: 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 3d 69  i<p->nExpr; i+=i
74e0: 29 7b 7d 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  ){}.  pNew->a = 
74f0: 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65 33 44  pItem = sqlite3D
7500: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 20  bMallocRaw(db,  
7510: 69 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  i*sizeof(p->a[0]
7520: 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d  ) );.  if( pItem
7530: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
7540: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65  e3DbFree(db, pNe
7550: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
7560: 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65  ;.  } .  pOldIte
7570: 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28  m = p->a;.  for(
7580: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
7590: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70   i++, pItem++, p
75a0: 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  OldItem++){.    
75b0: 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d  Expr *pOldExpr =
75c0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72   pOldItem->pExpr
75d0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78  ;.    pItem->pEx
75e0: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
75f0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70 72  Dup(db, pOldExpr
7600: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 49  , flags);.    pI
7610: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
7620: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
7630: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
7640: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53  );.    pItem->zS
7650: 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53  pan = sqlite3DbS
7660: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
7670: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  em->zSpan);.    
7680: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
7690: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72   = pOldItem->sor
76a0: 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65  tOrder;.    pIte
76b0: 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  m->done = 0;.   
76c0: 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42 79   pItem->iOrderBy
76d0: 43 6f 6c 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  Col = pOldItem->
76e0: 69 4f 72 64 65 72 42 79 43 6f 6c 3b 0a 20 20 20  iOrderByCol;.   
76f0: 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d   pItem->iAlias =
7700: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 41 6c 69 61   pOldItem->iAlia
7710: 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  s;.  }.  return 
7720: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  pNew;.}../*.** I
7730: 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69 67 67  f cursors, trigg
7740: 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64 20 73  ers, views and s
7750: 75 62 71 75 65 72 69 65 73 20 61 72 65 20 61 6c  ubqueries are al
7760: 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a  l omitted from.*
7770: 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74 68 65  * the build, the
7780: 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  n none of the fo
7790: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
77a0: 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a  , except for .**
77b0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
77c0: 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c  p(), can be call
77d0: 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ed. sqlite3Selec
77e0: 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65 74 69  tDup() is someti
77f0: 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69  mes.** called wi
7800: 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65  th a NULL argume
7810: 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  nt..*/.#if !defi
7820: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7830: 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
7840: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
7850: 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65  IGGER) \. || !de
7860: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7870: 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72 63 4c  T_SUBQUERY).SrcL
7880: 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
7890: 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  istDup(sqlite3 *
78a0: 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  db, SrcList *p, 
78b0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 72  int flags){.  Sr
78c0: 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69  cList *pNew;.  i
78d0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74  nt i;.  int nByt
78e0: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  e;.  if( p==0 ) 
78f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74  return 0;.  nByt
7900: 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b  e = sizeof(*p) +
7910: 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69   (p->nSrc>0 ? si
7920: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20  zeof(p->a[0]) * 
7930: 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29  (p->nSrc-1) : 0)
7940: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
7950: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
7960: 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  , nByte );.  if(
7970: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
7980: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72  n 0;.  pNew->nSr
7990: 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63  c = pNew->nAlloc
79a0: 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f   = p->nSrc;.  fo
79b0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63  r(i=0; i<p->nSrc
79c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
79d0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
79e0: 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65  *pNewItem = &pNe
79f0: 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72  w->a[i];.    str
7a00: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
7a10: 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d   *pOldItem = &p-
7a20: 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65  >a[i];.    Table
7a30: 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65 77   *pTab;.    pNew
7a40: 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20 3d 20  Item->pSchema = 
7a50: 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68 65 6d  pOldItem->pSchem
7a60: 61 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  a;.    pNewItem-
7a70: 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c  >zDatabase = sql
7a80: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
7a90: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61   pOldItem->zData
7aa0: 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  base);.    pNewI
7ab0: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
7ac0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
7ad0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
7ae0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
7af0: 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65  >zAlias = sqlite
7b00: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
7b10: 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ldItem->zAlias);
7b20: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6a  .    pNewItem->j
7b30: 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64 49 74  ointype = pOldIt
7b40: 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  em->jointype;.  
7b50: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72    pNewItem->iCur
7b60: 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  sor = pOldItem->
7b70: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65  iCursor;.    pNe
7b80: 77 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  wItem->addrFillS
7b90: 75 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 61  ub = pOldItem->a
7ba0: 64 64 72 46 69 6c 6c 53 75 62 3b 0a 20 20 20 20  ddrFillSub;.    
7bb0: 70 4e 65 77 49 74 65 6d 2d 3e 72 65 67 52 65 74  pNewItem->regRet
7bc0: 75 72 6e 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  urn = pOldItem->
7bd0: 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 70  regReturn;.    p
7be0: 4e 65 77 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65  NewItem->isCorre
7bf0: 6c 61 74 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d  lated = pOldItem
7c00: 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 3b 0a  ->isCorrelated;.
7c10: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 76 69      pNewItem->vi
7c20: 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 70 4f 6c  aCoroutine = pOl
7c30: 64 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74  dItem->viaCorout
7c40: 69 6e 65 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ine;.    pNewIte
7c50: 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69  m->zIndex = sqli
7c60: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
7c70: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 49 6e 64 65 78  pOldItem->zIndex
7c80: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
7c90: 3e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 70 4f  >notIndexed = pO
7ca0: 6c 64 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78  ldItem->notIndex
7cb0: 65 64 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ed;.    pNewItem
7cc0: 2d 3e 70 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49  ->pIndex = pOldI
7cd0: 74 65 6d 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  tem->pIndex;.   
7ce0: 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d   pTab = pNewItem
7cf0: 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  ->pTab = pOldIte
7d00: 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
7d10: 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70   pTab ){.      p
7d20: 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  Tab->nRef++;.   
7d30: 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d   }.    pNewItem-
7d40: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
7d50: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
7d60: 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pOldItem->pSelec
7d70: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  t, flags);.    p
7d80: 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73  NewItem->pOn = s
7d90: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
7da0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c  , pOldItem->pOn,
7db0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
7dc0: 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20  wItem->pUsing = 
7dd0: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
7de0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  (db, pOldItem->p
7df0: 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77  Using);.    pNew
7e00: 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20  Item->colUsed = 
7e10: 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pOldItem->colUse
7e20: 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  d;.  }.  return 
7e30: 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a  pNew;.}.IdList *
7e40: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
7e50: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64  (sqlite3 *db, Id
7e60: 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69  List *p){.  IdLi
7e70: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
7e80: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
7e90: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
7ea0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7eb0: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
7ec0: 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28  (*pNew) );.  if(
7ed0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
7ee0: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64  n 0;.  pNew->nId
7ef0: 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65   = p->nId;.  pNe
7f00: 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62  w->a = sqlite3Db
7f10: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70 2d  MallocRaw(db, p-
7f20: 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  >nId*sizeof(p->a
7f30: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  [0]) );.  if( pN
7f40: 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  ew->a==0 ){.    
7f50: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
7f60: 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74  , pNew);.    ret
7f70: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20  urn 0;.  }.  /* 
7f80: 4e 6f 74 65 20 74 68 61 74 20 62 65 63 61 75 73  Note that becaus
7f90: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
7fa0: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72  e allocation for
7fb0: 20 70 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a 20   p->a[] is not. 
7fc0: 20 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20   ** necessarily 
7fd0: 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 2c 20  a power of two, 
7fe0: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70  sqlite3IdListApp
7ff0: 65 6e 64 28 29 20 6d 61 79 20 6e 6f 74 20 62 65  end() may not be
8000: 20 63 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20   called.  ** on 
8010: 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63 72  the duplicate cr
8020: 65 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  eated by this fu
8030: 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72  nction. */.  for
8040: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20  (i=0; i<p->nId; 
8050: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
8060: 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e   IdList_item *pN
8070: 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e  ewItem = &pNew->
8080: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
8090: 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f   IdList_item *pO
80a0: 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69  ldItem = &p->a[i
80b0: 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  ];.    pNewItem-
80c0: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
80d0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
80e0: 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  dItem->zName);. 
80f0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78     pNewItem->idx
8100: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78   = pOldItem->idx
8110: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
8120: 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73  New;.}.Select *s
8130: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
8140: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c  sqlite3 *db, Sel
8150: 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  ect *p, int flag
8160: 73 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e  s){.  Select *pN
8170: 65 77 2c 20 2a 70 50 72 69 6f 72 3b 0a 20 20 69  ew, *pPrior;.  i
8180: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
8190: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
81a0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
81b0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  db, sizeof(*p) )
81c0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
81d0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
81e0: 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c  ew->pEList = sql
81f0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
8200: 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66  db, p->pEList, f
8210: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
8220: 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
8230: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
8240: 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  Src, flags);.  p
8250: 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71  New->pWhere = sq
8260: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
8270: 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67   p->pWhere, flag
8280: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f  s);.  pNew->pGro
8290: 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
82a0: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
82b0: 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61 67 73  >pGroupBy, flags
82c0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  );.  pNew->pHavi
82d0: 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ng = sqlite3Expr
82e0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69  Dup(db, p->pHavi
82f0: 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  ng, flags);.  pN
8300: 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  ew->pOrderBy = s
8310: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
8320: 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  p(db, p->pOrderB
8330: 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  y, flags);.  pNe
8340: 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  w->op = p->op;. 
8350: 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20   pNew->pPrior = 
8360: 70 50 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 33  pPrior = sqlite3
8370: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d  SelectDup(db, p-
8380: 3e 70 50 72 69 6f 72 2c 20 66 6c 61 67 73 29 3b  >pPrior, flags);
8390: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 20 29 20  .  if( pPrior ) 
83a0: 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
83b0: 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e  pNew;.  pNew->pN
83c0: 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ext = 0;.  pNew-
83d0: 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  >pLimit = sqlite
83e0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
83f0: 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a  pLimit, flags);.
8400: 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20    pNew->pOffset 
8410: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
8420: 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c  (db, p->pOffset,
8430: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
8440: 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70  >iLimit = 0;.  p
8450: 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30  New->iOffset = 0
8460: 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61  ;.  pNew->selFla
8470: 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  gs = p->selFlags
8480: 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68 65 6d   & ~SF_UsesEphem
8490: 65 72 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e 70 52  eral;.  pNew->pR
84a0: 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20  ightmost = 0;.  
84b0: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
84c0: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[0] = -1;.  pN
84d0: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
84e0: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [1] = -1;.  pNew
84f0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
8500: 5d 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  ] = -1;.  return
8510: 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53   pNew;.}.#else.S
8520: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
8530: 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20  lectDup(sqlite3 
8540: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  *db, Select *p, 
8550: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73  int flags){.  as
8560: 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20  sert( p==0 );.  
8570: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
8580: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  if.../*.** Add a
8590: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
85a0: 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78  the end of an ex
85b0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
85c0: 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69  If pList is.** i
85d0: 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74  nitially NULL, t
85e0: 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77  hen create a new
85f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
8600: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
8610: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
8620: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
8630: 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69 73 20   entire list is 
8640: 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c  freed and.** NUL
8650: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  L is returned.  
8660: 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72  If non-NULL is r
8670: 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 69 74  eturned, then it
8680: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a   is guaranteed.*
8690: 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 65  * that the new e
86a0: 6e 74 72 79 20 77 61 73 20 73 75 63 63 65 73 73  ntry was success
86b0: 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a  fully appended..
86c0: 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  */.ExprList *sql
86d0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
86e0: 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nd(.  Parse *pPa
86f0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
8700: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
8710: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
8720: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  pList,        /*
8730: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
8740: 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20  o append. Might 
8750: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
8760: 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
8770: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
8780: 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65  on to be appende
8790: 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  d. Might be NULL
87a0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
87b0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
87c0: 62 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  b;.  if( pList==
87d0: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
87e0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
87f0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
8800: 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20  ExprList) );.   
8810: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
8820: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  .      goto no_m
8830: 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  em;.    }.    pL
8840: 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33  ist->a = sqlite3
8850: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
8860: 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
8870: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  0]));.    if( pL
8880: 69 73 74 2d 3e 61 3d 3d 30 20 29 20 67 6f 74 6f  ist->a==0 ) goto
8890: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65   no_mem;.  }else
88a0: 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78   if( (pList->nEx
88b0: 70 72 20 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78  pr & (pList->nEx
88c0: 70 72 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20  pr-1))==0 ){.   
88d0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
88e0: 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61 73  _item *a;.    as
88f0: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
8900: 70 72 3e 30 20 29 3b 0a 20 20 20 20 61 20 3d 20  pr>0 );.    a = 
8910: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
8920: 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 70  (db, pList->a, p
8930: 4c 69 73 74 2d 3e 6e 45 78 70 72 2a 32 2a 73 69  List->nExpr*2*si
8940: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
8950: 29 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30  ));.    if( a==0
8960: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e   ){.      goto n
8970: 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  o_mem;.    }.   
8980: 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20   pList->a = a;. 
8990: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69   }.  assert( pLi
89a0: 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66  st->a!=0 );.  if
89b0: 28 20 31 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ( 1 ){.    struc
89c0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
89d0: 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d  *pItem = &pList-
89e0: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b  >a[pList->nExpr+
89f0: 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  +];.    memset(p
8a00: 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Item, 0, sizeof(
8a10: 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49  *pItem));.    pI
8a20: 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  tem->pExpr = pEx
8a30: 70 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  pr;.  }.  return
8a40: 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a   pList;..no_mem:
8a50: 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64       .  /* Avoid
8a60: 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20   leaking memory 
8a70: 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61  if malloc has fa
8a80: 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  iled. */.  sqlit
8a90: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
8aa0: 20 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74   pExpr);.  sqlit
8ab0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
8ac0: 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72  (db, pList);.  r
8ad0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
8ae0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69  * Set the ExprLi
8af0: 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65  st.a[].zName ele
8b00: 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74  ment of the most
8b10: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
8b20: 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65  item.** on the e
8b30: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
8b40: 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68  **.** pList migh
8b50: 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77  t be NULL follow
8b60: 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72  ing an OOM error
8b70: 2e 20 20 42 75 74 20 70 4e 61 6d 65 20 73 68 6f  .  But pName sho
8b80: 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20  uld never be.** 
8b90: 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f  NULL.  If a memo
8ba0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
8bb0: 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d  ils, the pParse-
8bc0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
8bd0: 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74  d flag.** is set
8be0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8bf0: 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
8c00: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
8c10: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
8c20: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
8c30: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
8c40: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
8c50: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
8c60: 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f  add the span. */
8c70: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  .  Token *pName,
8c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
8c90: 6d 65 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a  me to be added *
8ca0: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
8cb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8cc0: 72 75 65 20 74 6f 20 63 61 75 73 65 20 74 68 65  rue to cause the
8cd0: 20 6e 61 6d 65 20 74 6f 20 62 65 20 64 65 71 75   name to be dequ
8ce0: 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  oted */.){.  ass
8cf0: 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c  ert( pList!=0 ||
8d00: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
8d10: 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a  locFailed!=0 );.
8d20: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
8d30: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
8d40: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
8d50: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
8d60: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
8d70: 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74    pItem = &pList
8d80: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
8d90: 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
8da0: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pItem->zName==0
8db0: 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a   );.    pItem->z
8dc0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
8dd0: 53 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e  StrNDup(pParse->
8de0: 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  db, pName->z, pN
8df0: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28  ame->n);.    if(
8e00: 20 64 65 71 75 6f 74 65 20 26 26 20 70 49 74 65   dequote && pIte
8e10: 6d 2d 3e 7a 4e 61 6d 65 20 29 20 73 71 6c 69 74  m->zName ) sqlit
8e20: 65 33 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d  e3Dequote(pItem-
8e30: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  >zName);.  }.}..
8e40: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78  /*.** Set the Ex
8e50: 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e  prList.a[].zSpan
8e60: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
8e70: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
8e80: 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74  ded item.** on t
8e90: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
8ea0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  st..**.** pList 
8eb0: 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f  might be NULL fo
8ec0: 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65  llowing an OOM e
8ed0: 72 72 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e  rror.  But pSpan
8ee0: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
8ef0: 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20  .** NULL.  If a 
8f00: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
8f10: 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61  n fails, the pPa
8f20: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
8f30: 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73  ailed flag.** is
8f40: 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   set..*/.void sq
8f50: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
8f60: 53 70 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  Span(.  Parse *p
8f70: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
8f80: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
8f90: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
8fa0: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
8fb0: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
8fc0: 20 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e   to add the span
8fd0: 2e 20 2a 2f 0a 20 20 45 78 70 72 53 70 61 6e 20  . */.  ExprSpan 
8fe0: 2a 70 53 70 61 6e 20 20 20 20 20 20 20 20 20 2f  *pSpan         /
8ff0: 2a 20 54 68 65 20 73 70 61 6e 20 74 6f 20 62 65  * The span to be
9000: 20 61 64 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73   added */.){.  s
9010: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
9020: 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
9030: 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64  t( pList!=0 || d
9040: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21  b->mallocFailed!
9050: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  =0 );.  if( pLis
9060: 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  t ){.    struct 
9070: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
9080: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
9090: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d  [pList->nExpr-1]
90a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
90b0: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
90c0: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
90d0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
90e0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53  pItem->pExpr==pS
90f0: 70 61 6e 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20  pan->pExpr );.  
9100: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9110: 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e  db, pItem->zSpan
9120: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53  );.    pItem->zS
9130: 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53  pan = sqlite3DbS
9140: 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72  trNDup(db, (char
9150: 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c  *)pSpan->zStart,
9160: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9180: 20 20 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e       (int)(pSpan
9190: 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e  ->zEnd - pSpan->
91a0: 7a 53 74 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a  zStart));.  }.}.
91b0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  ./*.** If the ex
91c0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45  pression list pE
91d0: 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f  List contains mo
91e0: 72 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65  re than iLimit e
91f0: 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76  lements,.** leav
9200: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
9210: 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  ge in pParse..*/
9220: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
9230: 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68  rListCheckLength
9240: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
9250: 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  e,.  ExprList *p
9260: 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63  EList,.  const c
9270: 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a  har *zObject.){.
9280: 20 20 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73    int mx = pPars
9290: 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  e->db->aLimit[SQ
92a0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
92b0: 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  N];.  testcase( 
92c0: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
92d0: 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20  ->nExpr==mx );. 
92e0: 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73   testcase( pELis
92f0: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
9300: 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66  pr==mx+1 );.  if
9310: 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
9320: 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a  st->nExpr>mx ){.
9330: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
9340: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
9350: 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   many columns in
9360: 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a   %s", zObject);.
9370: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
9380: 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78  ete an entire ex
9390: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
93a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
93b0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c  prListDelete(sql
93c0: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69  ite3 *db, ExprLi
93d0: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
93e0: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78  t i;.  struct Ex
93f0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
9400: 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  em;.  if( pList=
9410: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
9420: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21  ssert( pList->a!
9430: 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78  =0 || pList->nEx
9440: 70 72 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70  pr==0 );.  for(p
9450: 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
9460: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
9470: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
9480: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
9490: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  prDelete(db, pIt
94a0: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
94b0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
94c0: 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
94d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
94e0: 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53  ee(db, pItem->zS
94f0: 70 61 6e 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  pan);.  }.  sqli
9500: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c  te3DbFree(db, pL
9510: 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74  ist->a);.  sqlit
9520: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69  e3DbFree(db, pLi
9530: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  st);.}../*.** Th
9540: 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
9550: 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b   Walker callback
9560: 73 2e 20 20 57 61 6c 6b 65 72 2e 75 2e 70 69 20  s.  Walker.u.pi 
9570: 69 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  is a pointer.** 
9580: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20  to an integer.  
9590: 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
95a0: 72 65 20 63 68 65 63 6b 69 6e 67 20 61 6e 20 65  re checking an e
95b0: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 73 65 65  xpression to see
95c0: 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 61 20 63  .** if it is a c
95d0: 6f 6e 73 74 61 6e 74 2e 20 20 53 65 74 20 2a 57  onstant.  Set *W
95e0: 61 6c 6b 65 72 2e 75 2e 70 69 20 74 6f 20 30 20  alker.u.pi to 0 
95f0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
9600: 6e 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 73  n is.** not cons
9610: 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  tant..**.** Thes
9620: 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
9630: 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
9640: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 66 6f  implement the fo
9650: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
9660: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
9670: 43 6f 6e 73 74 61 6e 74 28 29 0a 2a 2a 20 20 20  Constant().**   
9680: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
9690: 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29  onstantNotJoin()
96a0: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
96b0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
96c0: 75 6e 63 74 69 6f 6e 28 29 0a 2a 2a 0a 2a 2f 0a  unction().**.*/.
96d0: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e  static int exprN
96e0: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61  odeIsConstant(Wa
96f0: 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
9700: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20 20  xpr *pExpr){..  
9710: 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e 75  /* If pWalker->u
9720: 2e 69 20 69 73 20 33 20 74 68 65 6e 20 61 6e 79  .i is 3 then any
9730: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 65 78 70   term of the exp
9740: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d  ression that com
9750: 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65  es from.  ** the
9760: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
9770: 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e 20 64  uses of a join d
9780: 69 73 71 75 61 6c 69 66 69 65 73 20 74 68 65 20  isqualifies the 
9790: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20  expression.  ** 
97a0: 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69  from being consi
97b0: 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20  dered constant. 
97c0: 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72  */.  if( pWalker
97d0: 2d 3e 75 2e 69 3d 3d 33 20 26 26 20 45 78 70 72  ->u.i==3 && Expr
97e0: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
97f0: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
9800: 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65  n) ){.    pWalke
9810: 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 20 20  r->u.i = 0;.    
9820: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
9830: 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  ;.  }..  switch(
9840: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
9850: 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66 75    /* Consider fu
9860: 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f  nctions to be co
9870: 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74 68  nstant if all th
9880: 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61 72  eir arguments ar
9890: 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a  e constant.    *
98a0: 2a 20 61 6e 64 20 70 57 61 6c 6b 65 72 2d 3e 75  * and pWalker->u
98b0: 2e 69 3d 3d 32 20 2a 2f 0a 20 20 20 20 63 61 73  .i==2 */.    cas
98c0: 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  e TK_FUNCTION:. 
98d0: 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72       if( pWalker
98e0: 2d 3e 75 2e 69 3d 3d 32 20 29 20 72 65 74 75 72  ->u.i==2 ) retur
98f0: 6e 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  n 0;.      /* Fa
9900: 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  ll through */.  
9910: 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20    case TK_ID:.  
9920: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
9930: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
9940: 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  G_FUNCTION:.    
9950: 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
9960: 4d 4e 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  MN:.      testca
9970: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
9980: 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20 74 65  K_ID );.      te
9990: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
99a0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
99b0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
99c0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
99d0: 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
99e0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
99f0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
9a00: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
9a10: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30  pWalker->u.i = 0
9a20: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  ;.      return W
9a30: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 64 65  RC_Abort;.    de
9a40: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 74 65 73  fault:.      tes
9a50: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
9a60: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 20 2f  ==TK_SELECT ); /
9a70: 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  * selectNodeIsCo
9a80: 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64 69 73 61  nstant will disa
9a90: 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 74 65  llow */.      te
9aa0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
9ab0: 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 20  p==TK_EXISTS ); 
9ac0: 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43  /* selectNodeIsC
9ad0: 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64 69 73  onstant will dis
9ae0: 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72  allow */.      r
9af0: 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
9b00: 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ue;.  }.}.static
9b10: 20 69 6e 74 20 73 65 6c 65 63 74 4e 6f 64 65 49   int selectNodeI
9b20: 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72  sConstant(Walker
9b30: 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
9b40: 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55  t *NotUsed){.  U
9b50: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
9b60: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70 57 61 6c  NotUsed);.  pWal
9b70: 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20  ker->u.i = 0;.  
9b80: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
9b90: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65  ;.}.static int e
9ba0: 78 70 72 49 73 43 6f 6e 73 74 28 45 78 70 72 20  xprIsConst(Expr 
9bb0: 2a 70 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61 67  *p, int initFlag
9bc0: 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
9bd0: 20 77 2e 75 2e 69 20 3d 20 69 6e 69 74 46 6c 61   w.u.i = initFla
9be0: 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  g;.  w.xExprCall
9bf0: 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49  back = exprNodeI
9c00: 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78  sConstant;.  w.x
9c10: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
9c20: 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e   selectNodeIsCon
9c30: 73 74 61 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33  stant;.  sqlite3
9c40: 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b  WalkExpr(&w, p);
9c50: 0a 20 20 72 65 74 75 72 6e 20 77 2e 75 2e 69 3b  .  return w.u.i;
9c60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
9c70: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
9c80: 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  e.  Return 1 if 
9c90: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
9ca0: 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e  s constant.** an
9cb0: 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76  d 0 if it involv
9cc0: 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20  es variables or 
9cd0: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a  function calls..
9ce0: 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
9cf0: 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66  rposes of this f
9d00: 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c  unction, a doubl
9d10: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
9d20: 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69  (ex: "abc").** i
9d30: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76  s considered a v
9d40: 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69  ariable but a si
9d50: 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  ngle-quoted stri
9d60: 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69  ng (ex: 'abc') i
9d70: 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e  s.** a constant.
9d80: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
9d90: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78  xprIsConstant(Ex
9da0: 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  pr *p){.  return
9db0: 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20   exprIsConst(p, 
9dc0: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  1);.}../*.** Wal
9dd0: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
9de0: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20  tree.  Return 1 
9df0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
9e00: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
9e10: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72   that does no or
9e20: 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74 68 65  iginate from the
9e30: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
9e40: 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a  uses of a join..
9e50: 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 69  ** Return 0 if i
9e60: 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61  t involves varia
9e70: 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e  bles or function
9e80: 20 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20   calls or terms 
9e90: 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72  from.** an ON or
9ea0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a   USING clause..*
9eb0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
9ec0: 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
9ed0: 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72  in(Expr *p){.  r
9ee0: 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73  eturn exprIsCons
9ef0: 74 28 70 2c 20 33 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  t(p, 3);.}../*.*
9f00: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
9f10: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
9f20: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
9f30: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
9f40: 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74  nt.** or a funct
9f50: 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f  ion call with co
9f60: 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73  nstant arguments
9f70: 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20  .  Return and 0 
9f80: 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  if there.** are 
9f90: 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a  any variables..*
9fa0: 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
9fb0: 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75  poses of this fu
9fc0: 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65  nction, a double
9fd0: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
9fe0: 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73  ex: "abc").** is
9ff0: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61   considered a va
a000: 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e  riable but a sin
a010: 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  gle-quoted strin
a020: 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73  g (ex: 'abc') is
a030: 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a  .** a constant..
a040: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
a050: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
a060: 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 29 7b  nction(Expr *p){
a070: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
a080: 43 6f 6e 73 74 28 70 2c 20 32 29 3b 0a 7d 0a 0a  Const(p, 2);.}..
a090: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
a0a0: 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20  ression p codes 
a0b0: 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67  a constant integ
a0c0: 65 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c  er that is small
a0d0: 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69   enough.** to fi
a0e0: 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e  t in a 32-bit in
a0f0: 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20  teger, return 1 
a100: 61 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c 75  and put the valu
a110: 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  e of the integer
a120: 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20  .** in *pValue. 
a130: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
a140: 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74  on is not an int
a150: 65 67 65 72 20 6f 72 20 69 66 20 69 74 20 69 73  eger or if it is
a160: 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66   too big.** to f
a170: 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33  it in a signed 3
a180: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72  2-bit integer, r
a190: 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76  eturn 0 and leav
a1a0: 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e  e *pValue unchan
a1b0: 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
a1c0: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
a1d0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70  (Expr *p, int *p
a1e0: 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72 63  Value){.  int rc
a1f0: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61   = 0;..  /* If a
a200: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
a210: 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74 65 72  an integer liter
a220: 61 6c 20 74 68 61 74 20 66 69 74 73 20 69 6e 20  al that fits in 
a230: 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 0a  a signed 32-bit.
a240: 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 74 68    ** integer, th
a250: 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56 61 6c  en the EP_IntVal
a260: 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68 61 76  ue flag will hav
a270: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  e already been s
a280: 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  et */.  assert( 
a290: 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45  p->op!=TK_INTEGE
a2a0: 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 20 26  R || (p->flags &
a2b0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30   EP_IntValue)!=0
a2c0: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  .           || s
a2d0: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70  qlite3GetInt32(p
a2e0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63 29  ->u.zToken, &rc)
a2f0: 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d  ==0 );..  if( p-
a300: 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
a310: 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70 56 61  alue ){.    *pVa
a320: 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61 6c 75  lue = p->u.iValu
a330: 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  e;.    return 1;
a340: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70  .  }.  switch( p
a350: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
a360: 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20   TK_UPLUS: {.   
a370: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 45     rc = sqlite3E
a380: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e  xprIsInteger(p->
a390: 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a  pLeft, pValue);.
a3a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a3b0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
a3c0: 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69  MINUS: {.      i
a3d0: 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20  nt v;.      if( 
a3e0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
a3f0: 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26  eger(p->pLeft, &
a400: 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  v) ){.        *p
a410: 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20  Value = -v;.    
a420: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
a430: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
a440: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
a450: 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  lt: break;.  }. 
a460: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a470: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53  *.** Return FALS
a480: 45 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  E if there is no
a490: 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
a4a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20   expression can 
a4b0: 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  be NULL..**.** I
a4c0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
a4d0: 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f   might be NULL o
a4e0: 72 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  r if the express
a4f0: 69 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c  ion is too compl
a500: 65 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65  ex.** to tell re
a510: 74 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a  turn TRUE.  .**.
a520: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a530: 69 73 20 75 73 65 64 20 61 73 20 61 6e 20 6f 70  is used as an op
a540: 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73  timization, to s
a550: 6b 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70  kip OP_IsNull op
a560: 63 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65  codes.** when we
a570: 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 76 61 6c   know that a val
a580: 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c  ue cannot be NUL
a590: 4c 2e 20 20 48 65 6e 63 65 2c 20 61 20 66 61 6c  L.  Hence, a fal
a5a0: 73 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28  se positive.** (
a5b0: 72 65 74 75 72 6e 69 6e 67 20 54 52 55 45 20 77  returning TRUE w
a5c0: 68 65 6e 20 69 6e 20 66 61 63 74 20 74 68 65 20  hen in fact the 
a5d0: 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e  expression can n
a5e0: 65 76 65 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69  ever be NULL) mi
a5f0: 67 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c  ght.** be a smal
a600: 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69  l performance hi
a610: 74 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69  t but is otherwi
a620: 73 65 20 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e  se harmless.  On
a630: 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61   the other.** ha
a640: 6e 64 2c 20 61 20 66 61 6c 73 65 20 6e 65 67 61  nd, a false nega
a650: 74 69 76 65 20 28 72 65 74 75 72 6e 69 6e 67 20  tive (returning 
a660: 46 41 4c 53 45 20 77 68 65 6e 20 74 68 65 20 72  FALSE when the r
a670: 65 73 75 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e  esult could be N
a680: 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b  ULL).** will lik
a690: 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  ely result in an
a6a0: 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65   incorrect answe
a6b0: 72 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e 20 64  r.  So when in d
a6c0: 6f 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  oubt, return.** 
a6d0: 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  TRUE..*/.int sql
a6e0: 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c  ite3ExprCanBeNul
a6f0: 6c 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 29  l(const Expr *p)
a700: 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77 68 69  {.  u8 op;.  whi
a710: 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50  le( p->op==TK_UP
a720: 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b  LUS || p->op==TK
a730: 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70  _UMINUS ){ p = p
a740: 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20  ->pLeft; }.  op 
a750: 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  = p->op;.  if( o
a760: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
a770: 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20   op = p->op2;.  
a780: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
a790: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
a7a0: 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  R:.    case TK_S
a7b0: 54 52 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20  TRING:.    case 
a7c0: 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61  TK_FLOAT:.    ca
a7d0: 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20  se TK_BLOB:.    
a7e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
a7f0: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
a800: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 1;.  }.}..
a810: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
a820: 6e 20 4f 50 5f 49 73 4e 75 6c 6c 20 69 6e 73 74  n OP_IsNull inst
a830: 72 75 63 74 69 6f 6e 20 74 68 61 74 20 74 65 73  ruction that tes
a840: 74 73 20 72 65 67 69 73 74 65 72 20 69 52 65 67  ts register iReg
a850: 20 61 6e 64 20 6a 75 6d 70 73 0a 2a 2a 20 74 6f   and jumps.** to
a860: 20 6c 6f 63 61 74 69 6f 6e 20 69 44 65 73 74 20   location iDest 
a870: 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  if the value in 
a880: 69 52 65 67 20 69 73 20 4e 55 4c 4c 2e 20 20 54  iReg is NULL.  T
a890: 68 65 20 76 61 6c 75 65 20 69 6e 20 69 52 65 67  he value in iReg
a8a0: 20 0a 2a 2a 20 77 61 73 20 63 6f 6d 70 75 74 65   .** was compute
a8b0: 64 20 62 79 20 70 45 78 70 72 2e 20 20 49 66 20  d by pExpr.  If 
a8c0: 77 65 20 63 61 6e 20 6c 6f 6f 6b 20 61 74 20 70  we can look at p
a8d0: 45 78 70 72 20 61 74 20 63 6f 6d 70 69 6c 65 2d  Expr at compile-
a8e0: 74 69 6d 65 20 61 6e 64 0a 2a 2a 20 64 65 74 65  time and.** dete
a8f0: 72 6d 69 6e 65 20 74 68 61 74 20 69 74 20 63 61  rmine that it ca
a900: 6e 20 6e 65 76 65 72 20 67 65 6e 65 72 61 74 65  n never generate
a910: 20 61 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68   a NULL, then th
a920: 65 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 65 72  e OP_IsNull oper
a930: 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  ation.** can be 
a940: 6f 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64  omitted..*/.void
a950: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
a960: 49 73 4e 75 6c 6c 4a 75 6d 70 28 0a 20 20 56 64  IsNullJump(.  Vd
a970: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
a980: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 75 6e    /* The VDBE un
a990: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
a9a0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 45 78 70 72   */.  const Expr
a9b0: 20 2a 70 45 78 70 72 2c 20 20 2f 2a 20 4f 6e 6c   *pExpr,  /* Onl
a9c0: 79 20 67 65 6e 65 72 61 74 65 20 4f 50 5f 49 73  y generate OP_Is
a9d0: 4e 75 6c 6c 20 69 66 20 74 68 69 73 20 65 78 70  Null if this exp
a9e0: 72 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 2a 2f  r can be NULL */
a9f0: 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20  .  int iReg,    
aa00: 20 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74         /* Test t
aa10: 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73  he value in this
aa20: 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 4e 55   register for NU
aa30: 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 44 65 73  LL */.  int iDes
aa40: 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  t           /* J
aa50: 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20  ump here if the 
aa60: 76 61 6c 75 65 20 69 73 20 6e 75 6c 6c 20 2a 2f  value is null */
aa70: 0a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  .){.  if( sqlite
aa80: 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
aa90: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73 71 6c  Expr) ){.    sql
aaa0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
aab0: 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65  , OP_IsNull, iRe
aac0: 67 2c 20 69 44 65 73 74 29 3b 0a 20 20 7d 0a 7d  g, iDest);.  }.}
aad0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
aae0: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
aaf0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
ab00: 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 63 68 20   constant which 
ab10: 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68  would be.** unch
ab20: 61 6e 67 65 64 20 62 79 20 4f 50 5f 41 66 66 69  anged by OP_Affi
ab30: 6e 69 74 79 20 77 69 74 68 20 74 68 65 20 61 66  nity with the af
ab40: 66 69 6e 69 74 79 20 67 69 76 65 6e 20 69 6e 20  finity given in 
ab50: 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72  the second.** ar
ab60: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  gument..**.** Th
ab70: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
ab80: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
ab90: 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69  if the OP_Affini
aba0: 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20  ty operation.** 
abb0: 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e 20  can be omitted. 
abc0: 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 20 72   When in doubt r
abd0: 65 74 75 72 6e 20 46 41 4c 53 45 2e 20 20 41 20  eturn FALSE.  A 
abe0: 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 0a 2a  false negative.*
abf0: 2a 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 20 20  * is harmless.  
ac00: 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65  A false positive
ac10: 2c 20 68 6f 77 65 76 65 72 2c 20 63 61 6e 20 72  , however, can r
ac20: 65 73 75 6c 74 20 69 6e 20 74 68 65 20 77 72 6f  esult in the wro
ac30: 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f  ng.** answer..*/
ac40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
ac50: 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
ac60: 68 61 6e 67 65 28 63 6f 6e 73 74 20 45 78 70 72  hange(const Expr
ac70: 20 2a 70 2c 20 63 68 61 72 20 61 66 66 29 7b 0a   *p, char aff){.
ac80: 20 20 75 38 20 6f 70 3b 0a 20 20 69 66 28 20 61    u8 op;.  if( a
ac90: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
aca0: 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ONE ) return 1;.
acb0: 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d    while( p->op==
acc0: 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f  TK_UPLUS || p->o
acd0: 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20  p==TK_UMINUS ){ 
ace0: 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a  p = p->pLeft; }.
acf0: 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20    op = p->op;.  
ad00: 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  if( op==TK_REGIS
ad10: 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70  TER ) op = p->op
ad20: 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  2;.  switch( op 
ad30: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
ad40: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
ad50: 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49  return aff==SQLI
ad60: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c  TE_AFF_INTEGER |
ad70: 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
ad80: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d  F_NUMERIC;.    }
ad90: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
ada0: 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  AT: {.      retu
adb0: 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  rn aff==SQLITE_A
adc0: 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66 3d 3d  FF_REAL || aff==
add0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
ade0: 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  IC;.    }.    ca
adf0: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
ae00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66        return aff
ae10: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
ae20: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  T;.    }.    cas
ae30: 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
ae40: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
ae50: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
ae60: 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61  OLUMN: {.      a
ae70: 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62 6c 65  ssert( p->iTable
ae80: 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e  >=0 );  /* p can
ae90: 6e 6f 74 20 62 65 20 70 61 72 74 20 6f 66 20 61  not be part of a
aea0: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
aeb0: 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  t */.      retur
aec0: 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20  n p->iColumn<0. 
aed0: 20 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66           && (aff
aee0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
aef0: 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  EGER || aff==SQL
af00: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29  ITE_AFF_NUMERIC)
af10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
af20: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  ult: {.      ret
af30: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
af40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
af50: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
af60: 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72  en string is a r
af70: 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ow-id column nam
af80: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
af90: 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63  3IsRowid(const c
afa0: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73  har *z){.  if( s
afb0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
afc0: 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29   "_ROWID_")==0 )
afd0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
afe0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
aff0: 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29  z, "ROWID")==0 )
b000: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
b010: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
b020: 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72  z, "OID")==0 ) r
b030: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
b040: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
b050: 74 75 72 6e 20 74 72 75 65 20 69 66 20 77 65 20  turn true if we 
b060: 61 72 65 20 61 62 6c 65 20 74 6f 20 74 68 65 20  are able to the 
b070: 49 4e 20 6f 70 65 72 61 74 6f 72 20 6f 70 74 69  IN operator opti
b080: 6d 69 7a 61 74 69 6f 6e 20 6f 6e 20 61 0a 2a 2a  mization on a.**
b090: 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
b0a0: 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 78  rm.**.**       x
b0b0: 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
b0c0: 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 20 74 68 65  .**.** Where the
b0d0: 20 53 45 4c 45 43 54 2e 2e 2e 20 63 6c 61 75 73   SELECT... claus
b0e0: 65 20 69 73 20 61 73 20 73 70 65 63 69 66 69 65  e is as specifie
b0f0: 64 20 62 79 20 74 68 65 20 70 61 72 61 6d 65 74  d by the paramet
b100: 65 72 20 74 6f 20 74 68 69 73 0a 2a 2a 20 72 6f  er to this.** ro
b110: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
b120: 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 70   Select object p
b130: 61 73 73 65 64 20 69 6e 20 68 61 73 20 61 6c 72  assed in has alr
b140: 65 61 64 79 20 62 65 65 6e 20 70 72 65 70 72 6f  eady been prepro
b150: 63 65 73 73 65 64 20 61 6e 64 20 6e 6f 0a 2a 2a  cessed and no.**
b160: 20 65 72 72 6f 72 73 20 68 61 76 65 20 62 65 65   errors have bee
b170: 6e 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 23 69 66 6e  n found..*/.#ifn
b180: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b190: 53 55 42 51 55 45 52 59 0a 73 74 61 74 69 63 20  SUBQUERY.static 
b1a0: 69 6e 74 20 69 73 43 61 6e 64 69 64 61 74 65 46  int isCandidateF
b1b0: 6f 72 49 6e 4f 70 74 28 53 65 6c 65 63 74 20 2a  orInOpt(Select *
b1c0: 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  p){.  SrcList *p
b1d0: 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  Src;.  ExprList 
b1e0: 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65  *pEList;.  Table
b1f0: 20 2a 70 54 61 62 3b 0a 20 20 69 66 28 20 70 3d   *pTab;.  if( p=
b200: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
b210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b220: 20 2f 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73   /* right-hand s
b230: 69 64 65 20 6f 66 20 49 4e 20 69 73 20 53 45 4c  ide of IN is SEL
b240: 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ECT */.  if( p->
b250: 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20  pPrior ) return 
b260: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
b270: 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e  /* Not a compoun
b280: 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66  d SELECT */.  if
b290: 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
b2a0: 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
b2b0: 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20 20  Aggregate) ){.  
b2c0: 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e    testcase( (p->
b2d0: 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
b2e0: 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
b2f0: 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
b300: 6e 63 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  nct );.    testc
b310: 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ase( (p->selFlag
b320: 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
b330: 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
b340: 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b  =SF_Aggregate );
b350: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f  .    return 0; /
b360: 2a 20 4e 6f 20 44 49 53 54 49 4e 43 54 20 6b 65  * No DISTINCT ke
b370: 79 77 6f 72 64 20 61 6e 64 20 6e 6f 20 61 67 67  yword and no agg
b380: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
b390: 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   */.  }.  assert
b3a0: 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
b3b0: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
b3c0: 20 2f 2a 20 48 61 73 20 6e 6f 20 47 52 4f 55 50   /* Has no GROUP
b3d0: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
b3e0: 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20  if( p->pLimit ) 
b3f0: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
b400: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f         /* Has no
b410: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f   LIMIT clause */
b420: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
b430: 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20  ffset==0 );     
b440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
b450: 4c 49 4d 49 54 20 6d 65 61 6e 73 20 6e 6f 20 4f  LIMIT means no O
b460: 46 46 53 45 54 20 2a 2f 0a 20 20 69 66 28 20 70  FFSET */.  if( p
b470: 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
b480: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
b490: 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45 52    /* Has no WHER
b4a0: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53  E clause */.  pS
b4b0: 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
b4c0: 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20  assert( pSrc!=0 
b4d0: 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  );.  if( pSrc->n
b4e0: 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20  Src!=1 ) return 
b4f0: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  0;          /* S
b500: 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 46 52  ingle term in FR
b510: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  OM clause */.  i
b520: 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  f( pSrc->a[0].pS
b530: 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 30  elect ) return 0
b540: 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73  ;     /* FROM is
b550: 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20   not a subquery 
b560: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 70 54 61  or view */.  pTa
b570: 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  b = pSrc->a[0].p
b580: 54 61 62 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  Tab;.  if( NEVER
b590: 28 70 54 61 62 3d 3d 30 29 20 29 20 72 65 74 75  (pTab==0) ) retu
b5a0: 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 0;.  assert( 
b5b0: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
b5c0: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   );            /
b5d0: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  * FROM clause is
b5e0: 20 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a 20   not a view */. 
b5f0: 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
b600: 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Tab) ) return 0;
b610: 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20          /* FROM 
b620: 63 6c 61 75 73 65 20 6e 6f 74 20 61 20 76 69 72  clause not a vir
b630: 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tual table */.  
b640: 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
b650: 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  st;.  if( pEList
b660: 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
b670: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  urn 0;       /* 
b680: 4f 6e 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  One column in th
b690: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
b6a0: 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b    if( pEList->a[
b6b0: 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  0].pExpr->op!=TK
b6c0: 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e  _COLUMN ) return
b6d0: 20 30 3b 20 2f 2a 20 52 65 73 75 6c 74 20 69 73   0; /* Result is
b6e0: 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 72   a column */.  r
b6f0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
b700: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
b710: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a  _SUBQUERY */../*
b720: 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 4f  .** Code an OP_O
b730: 6e 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  nce instruction 
b740: 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  and allocate spa
b750: 63 65 20 66 6f 72 20 69 74 73 20 66 6c 61 67 2e  ce for its flag.
b760: 20 52 65 74 75 72 6e 20 74 68 65 20 0a 2a 2a 20   Return the .** 
b770: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
b780: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ew instruction..
b790: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f  */.int sqlite3Co
b7a0: 64 65 4f 6e 63 65 28 50 61 72 73 65 20 2a 70 50  deOnce(Parse *pP
b7b0: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
b7c0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
b7d0: 65 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 20  e(pParse);      
b7e0: 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69  /* Virtual machi
b7f0: 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  ne being coded *
b800: 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  /.  return sqlit
b810: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
b820: 4f 50 5f 4f 6e 63 65 2c 20 70 50 61 72 73 65 2d  OP_Once, pParse-
b830: 3e 6e 4f 6e 63 65 2b 2b 29 3b 0a 7d 0a 0a 2f 2a  >nOnce++);.}../*
b840: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
b850: 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  n is used by the
b860: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
b870: 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20  of the IN (...) 
b880: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65  operator..** The
b890: 20 70 58 20 70 61 72 61 6d 65 74 65 72 20 69 73   pX parameter is
b8a0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
b8b0: 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  on the RHS of th
b8c0: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77  e IN operator, w
b8d0: 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65  hich.** might be
b8e0: 20 65 69 74 68 65 72 20 61 20 6c 69 73 74 20 6f   either a list o
b8f0: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72  f expressions or
b900: 20 61 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a   a subquery..**.
b910: 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  ** The job of th
b920: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
b930: 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20   find or create 
b940: 61 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20  a b-tree object 
b950: 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75  that can.** be u
b960: 73 65 64 20 65 69 74 68 65 72 20 74 6f 20 74 65  sed either to te
b970: 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  st for membershi
b980: 70 20 69 6e 20 74 68 65 20 52 48 53 20 73 65 74  p in the RHS set
b990: 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74   or to iterate t
b9a0: 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65  hrough.** all me
b9b0: 6d 62 65 72 73 20 6f 66 20 74 68 65 20 52 48 53  mbers of the RHS
b9c0: 20 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 64   set, skipping d
b9d0: 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  uplicates..**.**
b9e0: 20 41 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65   A cursor is ope
b9f0: 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72 65  ned on the b-tre
ba00: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68  e object that th
ba10: 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
ba20: 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 61 6e 64 20  operator.** and 
ba30: 70 58 2d 3e 69 54 61 62 6c 65 20 69 73 20 73 65  pX->iTable is se
ba40: 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  t to the index o
ba50: 66 20 74 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a  f that cursor..*
ba60: 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
ba70: 64 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  d value of this 
ba80: 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63 61 74  function indicat
ba90: 65 73 20 74 68 65 20 62 2d 74 72 65 65 20 74 79  es the b-tree ty
baa0: 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  pe, as follows:.
bab0: 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  **.**   IN_INDEX
bac0: 5f 52 4f 57 49 44 20 2d 20 54 68 65 20 63 75 72  _ROWID - The cur
bad0: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
bae0: 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  n a database tab
baf0: 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  le..**   IN_INDE
bb00: 58 5f 49 4e 44 45 58 20 2d 20 54 68 65 20 63 75  X_INDEX - The cu
bb10: 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
bb20: 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 69 6e  on a database in
bb30: 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  dex..**   IN_IND
bb40: 45 58 5f 45 50 48 20 2d 20 20 20 54 68 65 20 63  EX_EPH -   The c
bb50: 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
bb60: 20 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20   on a specially 
bb70: 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20  created and.**  
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb90: 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70 68 65    populated ephe
bba0: 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a  remal table..**.
bbb0: 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 62  ** An existing b
bbc0: 2d 74 72 65 65 20 6d 69 67 68 74 20 62 65 20 75  -tree might be u
bbd0: 73 65 64 20 69 66 20 74 68 65 20 52 48 53 20 65  sed if the RHS e
bbe0: 78 70 72 65 73 73 69 6f 6e 20 70 58 20 69 73 20  xpression pX is 
bbf0: 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73 75 62 71  a simple.** subq
bc00: 75 65 72 79 20 73 75 63 68 20 61 73 3a 0a 2a 2a  uery such as:.**
bc10: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c  .**     SELECT <
bc20: 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61  column> FROM <ta
bc30: 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble>.**.** If th
bc40: 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
bc50: 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69  operator is a li
bc60: 73 74 20 6f 72 20 61 20 6d 6f 72 65 20 63 6f 6d  st or a more com
bc70: 70 6c 65 78 20 73 75 62 71 75 65 72 79 2c 20 74  plex subquery, t
bc80: 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68 65 6d 65  hen.** an epheme
bc90: 72 61 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20  ral table might 
bca0: 6e 65 65 64 20 74 6f 20 62 65 20 67 65 6e 65 72  need to be gener
bcb0: 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 52 48  ated from the RH
bcc0: 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a 20 70 58  S and then.** pX
bcd0: 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65 20 74 6f  ->iTable made to
bce0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 65 70   point to the ep
bcf0: 68 65 72 6d 65 72 61 6c 20 74 61 62 6c 65 20 69  hermeral table i
bd00: 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a 2a 20  nstead of an.** 
bd10: 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 2e 20  existing table. 
bd20: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
bd30: 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72 61 6d 65  rNotFound parame
bd40: 74 65 72 20 69 73 20 30 2c 20 74 68 65 6e 20 74  ter is 0, then t
bd50: 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62  he b-tree will b
bd60: 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  e used to iterat
bd70: 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65  e.** through the
bd80: 20 73 65 74 20 6d 65 6d 62 65 72 73 2c 20 73 6b   set members, sk
bd90: 69 70 70 69 6e 67 20 61 6e 79 20 64 75 70 6c 69  ipping any dupli
bda0: 63 61 74 65 73 2e 20 49 6e 20 74 68 69 73 20 63  cates. In this c
bdb0: 61 73 65 20 61 6e 0a 2a 2a 20 65 70 68 65 72 65  ase an.** ephere
bdc0: 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 62  mal table must b
bdd0: 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 74 68  e used unless th
bde0: 65 20 73 65 6c 65 63 74 65 64 20 3c 63 6f 6c 75  e selected <colu
bdf0: 6d 6e 3e 20 69 73 20 67 75 61 72 61 6e 74 65 65  mn> is guarantee
be00: 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71 75  d.** to be uniqu
be10: 65 20 2d 20 65 69 74 68 65 72 20 62 65 63 61 75  e - either becau
be20: 73 65 20 69 74 20 69 73 20 61 6e 20 49 4e 54 45  se it is an INTE
be30: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
be40: 6f 72 20 69 74 0a 2a 2a 20 68 61 73 20 61 20 55  or it.** has a U
be50: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
be60: 20 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78   or UNIQUE index
be70: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
be80: 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72 61 6d 65  rNotFound parame
be90: 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  ter is not 0, th
bea0: 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 77 69  en the b-tree wi
beb0: 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66  ll be used .** f
bec0: 6f 72 20 66 61 73 74 20 73 65 74 20 6d 65 6d 62  or fast set memb
bed0: 65 72 73 68 69 70 20 74 65 73 74 73 2e 20 49 6e  ership tests. In
bee0: 20 74 68 69 73 20 63 61 73 65 20 61 6e 20 65 70   this case an ep
bef0: 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75  heremal table mu
bf00: 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20 75  st .** be used u
bf10: 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 3e 20 69  nless <column> i
bf20: 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
bf30: 4d 41 52 59 20 4b 45 59 20 6f 72 20 61 6e 20 69  MARY KEY or an i
bf40: 6e 64 65 78 20 63 61 6e 20 0a 2a 2a 20 62 65 20  ndex can .** be 
bf50: 66 6f 75 6e 64 20 77 69 74 68 20 3c 63 6f 6c 75  found with <colu
bf60: 6d 6e 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d  mn> as its left-
bf70: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a  most column..**.
bf80: 2a 2a 20 57 68 65 6e 20 74 68 65 20 62 2d 74 72  ** When the b-tr
bf90: 65 65 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  ee is being used
bfa0: 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20   for membership 
bfb0: 74 65 73 74 73 2c 20 74 68 65 20 63 61 6c 6c 69  tests, the calli
bfc0: 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6e  ng function.** n
bfd0: 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20 77 68 65  eeds to know whe
bfe0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
bff0: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
c000: 6e 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 0a  ns an SQL NULL .
c010: 2a 2a 20 76 61 6c 75 65 20 69 6e 20 6f 72 64 65  ** value in orde
c020: 72 20 74 6f 20 63 6f 72 72 65 63 74 6c 79 20 65  r to correctly e
c030: 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69  valuate expressi
c040: 6f 6e 73 20 6c 69 6b 65 20 22 58 20 49 4e 20 28  ons like "X IN (
c050: 59 2c 20 5a 29 22 2e 0a 2a 2a 20 49 66 20 74 68  Y, Z)"..** If th
c060: 65 72 65 20 69 73 20 61 6e 79 20 63 68 61 6e 63  ere is any chanc
c070: 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29  e that the (...)
c080: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61   might contain a
c090: 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a   NULL value at.*
c0a0: 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20  * runtime, then 
c0b0: 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c  a register is al
c0c0: 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
c0d0: 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
c0e0: 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70  written.** to *p
c0f0: 72 4e 6f 74 46 6f 75 6e 64 2e 20 49 66 20 74 68  rNotFound. If th
c100: 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
c110: 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20   that the (...) 
c120: 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55  contains a.** NU
c130: 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a  LL value, then *
c140: 70 72 4e 6f 74 46 6f 75 6e 64 20 69 73 20 6c 65  prNotFound is le
c150: 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
c160: 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65  .** If a registe
c170: 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  r is allocated a
c180: 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20  nd its location 
c190: 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 4e 6f 74  stored in *prNot
c1a0: 46 6f 75 6e 64 2c 20 74 68 65 6e 0a 2a 2a 20 69  Found, then.** i
c1b0: 74 73 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  ts initial value
c1c0: 20 69 73 20 4e 55 4c 4c 2e 20 20 49 66 20 74 68   is NULL.  If th
c1d0: 65 20 28 2e 2e 2e 29 20 64 6f 65 73 20 6e 6f 74  e (...) does not
c1e0: 20 72 65 6d 61 69 6e 20 63 6f 6e 73 74 61 6e 74   remain constant
c1f0: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 75 72 61  .** for the dura
c200: 74 69 6f 6e 20 6f 66 20 74 68 65 20 71 75 65 72  tion of the quer
c210: 79 20 28 69 2e 65 2e 20 74 68 65 20 53 45 4c 45  y (i.e. the SELE
c220: 43 54 20 77 69 74 68 69 6e 20 74 68 65 20 28 2e  CT within the (.
c230: 2e 2e 29 0a 2a 2a 20 69 73 20 61 20 63 6f 72 72  ..).** is a corr
c240: 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 29  elated subquery)
c250: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
c260: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  of the allocated
c270: 20 72 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20   register is.** 
c280: 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 65 61  reset to NULL ea
c290: 63 68 20 74 69 6d 65 20 74 68 65 20 73 75 62 71  ch time the subq
c2a0: 75 65 72 79 20 69 73 20 72 65 72 75 6e 2e 20 54  uery is rerun. T
c2b0: 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 0a 2a  his allows the.*
c2c0: 2a 20 63 61 6c 6c 65 72 20 74 6f 20 75 73 65 20  * caller to use 
c2d0: 76 64 62 65 20 63 6f 64 65 20 65 71 75 69 76 61  vdbe code equiva
c2e0: 6c 65 6e 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c  lent to the foll
c2f0: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  owing:.**.**   i
c300: 66 28 20 72 65 67 69 73 74 65 72 3d 3d 4e 55 4c  f( register==NUL
c310: 4c 20 29 7b 0a 2a 2a 20 20 20 20 20 68 61 73 5f  L ){.**     has_
c320: 6e 75 6c 6c 20 3d 20 3c 74 65 73 74 20 69 66 20  null = <test if 
c330: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63  data structure c
c340: 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a  ontains null>.**
c350: 20 20 20 20 20 72 65 67 69 73 74 65 72 20 3d 20       register = 
c360: 31 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 69  1.**   }.**.** i
c370: 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
c380: 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 3c 74 65   running the <te
c390: 73 74 20 69 66 20 64 61 74 61 20 73 74 72 75 63  st if data struc
c3a0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 6e 75  ture contains nu
c3b0: 6c 6c 3e 0a 2a 2a 20 74 65 73 74 20 6d 6f 72 65  ll>.** test more
c3c0: 20 6f 66 74 65 6e 20 74 68 61 6e 20 69 73 20 6e   often than is n
c3d0: 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 23 69 66  ecessary..*/.#if
c3e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c3f0: 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71  _SUBQUERY.int sq
c400: 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
c410: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
c420: 45 78 70 72 20 2a 70 58 2c 20 69 6e 74 20 2a 70  Expr *pX, int *p
c430: 72 4e 6f 74 46 6f 75 6e 64 29 7b 0a 20 20 53 65  rNotFound){.  Se
c440: 6c 65 63 74 20 2a 70 3b 20 20 20 20 20 20 20 20  lect *p;        
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c460: 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f      /* SELECT to
c470: 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 49 4e   the right of IN
c480: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   operator */.  i
c490: 6e 74 20 65 54 79 70 65 20 3d 20 30 3b 20 20 20  nt eType = 0;   
c4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4b0: 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
c4c0: 52 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e  RHS table. IN_IN
c4d0: 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69  DEX_* */.  int i
c4e0: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
c4f0: 61 62 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20  ab++;           
c500: 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 68   /* Cursor of th
c510: 65 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20  e RHS table */. 
c520: 20 69 6e 74 20 6d 75 73 74 42 65 55 6e 69 71 75   int mustBeUniqu
c530: 65 20 3d 20 28 70 72 4e 6f 74 46 6f 75 6e 64 3d  e = (prNotFound=
c540: 3d 30 29 3b 20 20 20 2f 2a 20 54 72 75 65 20 69  =0);   /* True i
c550: 66 20 52 48 53 20 6d 75 73 74 20 62 65 20 75 6e  f RHS must be un
c560: 69 71 75 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ique */.  Vdbe *
c570: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
c580: 62 65 28 70 50 61 72 73 65 29 3b 20 20 20 20 20  be(pParse);     
c590: 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69  /* Virtual machi
c5a0: 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  ne being coded *
c5b0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 58 2d  /..  assert( pX-
c5c0: 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 0a 20  >op==TK_IN );.. 
c5d0: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
c5e0: 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
c5f0: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 63  table or index c
c600: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20  an be used to.  
c610: 2a 2a 20 73 61 74 69 73 66 79 20 74 68 65 20 71  ** satisfy the q
c620: 75 65 72 79 2e 20 20 54 68 69 73 20 69 73 20 70  uery.  This is p
c630: 72 65 66 65 72 61 62 6c 65 20 74 6f 20 67 65 6e  referable to gen
c640: 65 72 61 74 69 6e 67 20 61 20 6e 65 77 20 0a 20  erating a new . 
c650: 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 74 61   ** ephemeral ta
c660: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20  ble..  */.  p = 
c670: 28 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  (ExprHasProperty
c680: 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pX, EP_xIsSelec
c690: 74 29 20 3f 20 70 58 2d 3e 78 2e 70 53 65 6c 65  t) ? pX->x.pSele
c6a0: 63 74 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 41  ct : 0);.  if( A
c6b0: 4c 57 41 59 53 28 70 50 61 72 73 65 2d 3e 6e 45  LWAYS(pParse->nE
c6c0: 72 72 3d 3d 30 29 20 26 26 20 69 73 43 61 6e 64  rr==0) && isCand
c6d0: 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29  idateForInOpt(p)
c6e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
c6f0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
c700: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
c710: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
c720: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62  ction */.    Tab
c730: 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
c740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c750: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61      /* Table <ta
c760: 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 45 78 70  ble>. */.    Exp
c770: 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20  r *pExpr;       
c780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c790: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
c7a0: 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20  n <column> */.  
c7b0: 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
c7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
c7e0: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 3c 63 6f 6c  x of column <col
c7f0: 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  umn> */.    int 
c800: 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
c810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c820: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69     /* Database i
c830: 64 78 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 0a  dx for pTab */..
c840: 20 20 20 20 61 73 73 65 72 74 28 20 70 20 29 3b      assert( p );
c850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c860: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
c870: 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
c880: 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
c890: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
c8a0: 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 20 20 20  EList!=0 );     
c8b0: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
c8c0: 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
c8d0: 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
c8e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
c8f0: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
c900: 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65 63 61 75  r!=0 ); /* Becau
c910: 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
c920: 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
c930: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
c940: 53 72 63 21 3d 30 20 29 3b 20 20 20 20 20 20 20  Src!=0 );       
c950: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
c960: 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
c970: 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
c980: 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53      pTab = p->pS
c990: 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20  rc->a[0].pTab;. 
c9a0: 20 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45     pExpr = p->pE
c9b0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
c9c0: 3b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 45 78  ;.    iCol = pEx
c9d0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
c9e0: 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20  .    /* Code an 
c9f0: 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 20  OP_VerifyCookie 
ca00: 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b  and OP_TableLock
ca10: 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f   for <table>. */
ca20: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
ca30: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
ca40: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
ca50: 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  a);.    sqlite3C
ca60: 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
ca70: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
ca80: 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
ca90: 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
caa0: 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
cab0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
cac0: 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
cad0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  on is only calle
cae0: 64 20 66 72 6f 6d 20 74 77 6f 20 70 6c 61 63 65  d from two place
caf0: 73 2e 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73  s. In both cases
cb00: 20 74 68 65 20 76 64 62 65 0a 20 20 20 20 2a 2a   the vdbe.    **
cb10: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
cb20: 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20 53 6f 20  n allocated. So 
cb30: 61 73 73 75 6d 65 20 73 71 6c 69 74 65 33 47 65  assume sqlite3Ge
cb40: 74 56 64 62 65 28 29 20 69 73 20 61 6c 77 61 79  tVdbe() is alway
cb50: 73 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73  s.    ** success
cb60: 66 75 6c 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f  ful here..    */
cb70: 0a 20 20 20 20 61 73 73 65 72 74 28 76 29 3b 0a  .    assert(v);.
cb80: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
cb90: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64 64  {.      int iAdd
cba0: 72 3b 0a 0a 20 20 20 20 20 20 69 41 64 64 72 20  r;..      iAddr 
cbb0: 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63  = sqlite3CodeOnc
cbc0: 65 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20  e(pParse);..    
cbd0: 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
cbe0: 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c  le(pParse, iTab,
cbf0: 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
cc00: 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20  penRead);.      
cc10: 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
cc20: 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20 20 20 73  _ROWID;..      s
cc30: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
cc40: 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20  re(v, iAddr);.  
cc50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
cc60: 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
cc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc80: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
cc90: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  variable */..   
cca0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74     /* The collat
ccb0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65  ion sequence use
ccc0: 64 20 62 79 20 74 68 65 20 63 6f 6d 70 61 72 69  d by the compari
ccd0: 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64 65 78  son. If an index
cce0: 20 69 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20   is to.      ** 
ccf0: 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65  be used in place
cd00: 20 6f 66 20 61 20 74 65 6d 70 2d 74 61 62 6c 65   of a temp-table
cd10: 2c 20 69 74 20 6d 75 73 74 20 62 65 20 6f 72 64  , it must be ord
cd20: 65 72 65 64 20 61 63 63 6f 72 64 69 6e 67 0a 20  ered according. 
cd30: 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20       ** to this 
cd40: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
cd50: 63 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 43 6f  ce.  */.      Co
cd60: 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d 20 73 71  llSeq *pReq = sq
cd70: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
cd80: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
cd90: 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 45 78  , pX->pLeft, pEx
cda0: 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  pr);..      /* C
cdb0: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 66  heck that the af
cdc0: 66 69 6e 69 74 79 20 74 68 61 74 20 77 69 6c 6c  finity that will
cdd0: 20 62 65 20 75 73 65 64 20 74 6f 20 70 65 72 66   be used to perf
cde0: 6f 72 6d 20 74 68 65 20 0a 20 20 20 20 20 20 2a  orm the .      *
cdf0: 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  * comparison is 
ce00: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
ce10: 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  affinity of the 
ce20: 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20 20 20 20 20  column. If.     
ce30: 20 2a 2a 20 69 74 20 69 73 20 6e 6f 74 2c 20 69   ** it is not, i
ce40: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
ce50: 65 20 74 6f 20 75 73 65 20 61 6e 79 20 69 6e 64  e to use any ind
ce60: 65 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ex..      */.   
ce70: 20 20 20 69 6e 74 20 61 66 66 69 6e 69 74 79 5f     int affinity_
ce80: 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  ok = sqlite3Inde
ce90: 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20  xAffinityOk(pX, 
cea0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
ceb0: 2e 61 66 66 69 6e 69 74 79 29 3b 0a 0a 20 20 20  .affinity);..   
cec0: 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
ced0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26  ->pIndex; pIdx &
cee0: 26 20 65 54 79 70 65 3d 3d 30 20 26 26 20 61 66  & eType==0 && af
cef0: 66 69 6e 69 74 79 5f 6f 6b 3b 20 70 49 64 78 3d  finity_ok; pIdx=
cf00: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
cf10: 20 20 20 20 20 20 69 66 28 20 28 70 49 64 78 2d        if( (pIdx-
cf20: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43  >aiColumn[0]==iC
cf30: 6f 6c 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  ol).         && 
cf40: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
cf50: 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20  eq(db, ENC(db), 
cf60: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c  pIdx->azColl[0],
cf70: 20 30 29 3d 3d 70 52 65 71 0a 20 20 20 20 20 20   0)==pReq.      
cf80: 20 20 20 26 26 20 28 21 6d 75 73 74 42 65 55 6e     && (!mustBeUn
cf90: 69 71 75 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e  ique || (pIdx->n
cfa0: 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70 49 64  Column==1 && pId
cfb0: 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
cfc0: 6f 6e 65 29 29 0a 20 20 20 20 20 20 20 20 29 7b  one)).        ){
cfd0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
cfe0: 41 64 64 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Addr;.          
cff0: 63 68 61 72 20 2a 70 4b 65 79 3b 0a 20 20 0a 20  char *pKey;.  . 
d000: 20 20 20 20 20 20 20 20 20 70 4b 65 79 20 3d 20           pKey = 
d010: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 49  (char *)sqlite3I
d020: 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72  ndexKeyinfo(pPar
d030: 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  se, pIdx);.     
d040: 20 20 20 20 20 69 41 64 64 72 20 3d 20 73 71 6c       iAddr = sql
d050: 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61  ite3CodeOnce(pPa
d060: 72 73 65 29 3b 0a 20 20 0a 20 20 20 20 20 20 20  rse);.  .       
d070: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d080: 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  dOp4(v, OP_OpenR
d090: 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d  ead, iTab, pIdx-
d0a0: 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20  >tnum, iDb,.    
d0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0c0: 20 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 2c             pKey,
d0d0: 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
d0e0: 46 46 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  FF);.          V
d0f0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
d100: 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  %s", pIdx->zName
d110: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 54  ));.          eT
d120: 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49  ype = IN_INDEX_I
d130: 4e 44 45 58 3b 0a 0a 20 20 20 20 20 20 20 20 20  NDEX;..         
d140: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
d150: 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a  Here(v, iAddr);.
d160: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 72            if( pr
d170: 4e 6f 74 46 6f 75 6e 64 20 26 26 20 21 70 54 61  NotFound && !pTa
d180: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f  b->aCol[iCol].no
d190: 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  tNull ){.       
d1a0: 20 20 20 20 20 2a 70 72 4e 6f 74 46 6f 75 6e 64       *prNotFound
d1b0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
d1c0: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  m;.            s
d1d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d1e0: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
d1f0: 2a 70 72 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20 20  *prNotFound);.  
d200: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d210: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
d220: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79  }.  }..  if( eTy
d230: 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  pe==0 ){.    /* 
d240: 43 6f 75 6c 64 20 6e 6f 74 20 66 6f 75 6e 64 20  Could not found 
d250: 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  an existing tabl
d260: 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 75 73  e or index to us
d270: 65 20 61 73 20 74 68 65 20 52 48 53 20 62 2d 74  e as the RHS b-t
d280: 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77  ree..    ** We w
d290: 69 6c 6c 20 68 61 76 65 20 74 6f 20 67 65 6e 65  ill have to gene
d2a0: 72 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61  rate an ephemera
d2b0: 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f 20 74 68  l table to do th
d2c0: 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20  e job..    */.  
d2d0: 20 20 64 6f 75 62 6c 65 20 73 61 76 65 64 4e 51    double savedNQ
d2e0: 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73  ueryLoop = pPars
d2f0: 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  e->nQueryLoop;. 
d300: 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e     int rMayHaveN
d310: 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54 79  ull = 0;.    eTy
d320: 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50  pe = IN_INDEX_EP
d330: 48 3b 0a 20 20 20 20 69 66 28 20 70 72 4e 6f 74  H;.    if( prNot
d340: 46 6f 75 6e 64 20 29 7b 0a 20 20 20 20 20 20 2a  Found ){.      *
d350: 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 72 4d 61  prNotFound = rMa
d360: 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50  yHaveNull = ++pP
d370: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
d380: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d390: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
d3a0: 30 2c 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 29 3b  0, *prNotFound);
d3b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d3c0: 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 72    testcase( pPar
d3d0: 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3e 28  se->nQueryLoop>(
d3e0: 64 6f 75 62 6c 65 29 31 20 29 3b 0a 20 20 20 20  double)1 );.    
d3f0: 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
d400: 4c 6f 6f 70 20 3d 20 28 64 6f 75 62 6c 65 29 31  Loop = (double)1
d410: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e  ;.      if( pX->
d420: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pLeft->iColumn<0
d430: 20 26 26 20 21 45 78 70 72 48 61 73 41 6e 79 50   && !ExprHasAnyP
d440: 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78  roperty(pX, EP_x
d450: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
d460: 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f       eType = IN_
d470: 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20  INDEX_ROWID;.   
d480: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
d490: 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
d4a0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 58 2c 20  ect(pParse, pX, 
d4b0: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54  rMayHaveNull, eT
d4c0: 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f  ype==IN_INDEX_RO
d4d0: 57 49 44 29 3b 0a 20 20 20 20 70 50 61 72 73 65  WID);.    pParse
d4e0: 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73  ->nQueryLoop = s
d4f0: 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
d500: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d    }else{.    pX-
d510: 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a  >iTable = iTab;.
d520: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79    }.  return eTy
d530: 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  pe;.}.#endif../*
d540: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
d550: 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62  e for scalar sub
d560: 71 75 65 72 69 65 73 20 75 73 65 64 20 61 73 20  queries used as 
d570: 61 20 73 75 62 71 75 65 72 79 20 65 78 70 72 65  a subquery expre
d580: 73 73 69 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a  ssion, EXISTS,.*
d590: 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72  * or IN operator
d5a0: 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a  s.  Examples:.**
d5b0: 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20  .**     (SELECT 
d5c0: 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20  a FROM b)       
d5d0: 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a     -- subquery.*
d5e0: 2a 20 20 20 20 20 45 58 49 53 54 53 20 28 53 45  *     EXISTS (SE
d5f0: 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
d600: 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71 75   -- EXISTS subqu
d610: 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20  ery.**     x IN 
d620: 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20  (4,5,11)        
d630: 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72        -- IN oper
d640: 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f  ator with list o
d650: 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  n right-hand sid
d660: 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53  e.**     x IN (S
d670: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
d680: 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74      -- IN operat
d690: 6f 72 20 77 69 74 68 20 73 75 62 71 75 65 72 79  or with subquery
d6a0: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a   on the right.**
d6b0: 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70 61  .** The pExpr pa
d6c0: 72 61 6d 65 74 65 72 20 64 65 73 63 72 69 62 65  rameter describe
d6d0: 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
d6e0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
d6f0: 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f  he IN.** operato
d700: 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a  r or subquery..*
d710: 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
d720: 72 20 69 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e  r isRowid is non
d730: 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78 70 72  -zero, then expr
d740: 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20  ession pExpr is 
d750: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
d760: 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   be of the form 
d770: 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20  "<rowid> IN (?, 
d780: 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65 20 3c 72  ?, ?)", where <r
d790: 6f 77 69 64 3e 20 69 73 20 61 20 72 65 66 65 72  owid> is a refer
d7a0: 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20  ence.** to some 
d7b0: 69 6e 74 65 67 65 72 20 6b 65 79 20 63 6f 6c 75  integer key colu
d7c0: 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 20 42 2d  mn of a table B-
d7d0: 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61  Tree. In this ca
d7e0: 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e  se, use an.** in
d7f0: 74 6b 65 79 20 42 2d 54 72 65 65 20 74 6f 20 73  tkey B-Tree to s
d800: 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20  tore the set of 
d810: 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69  IN(...) values i
d820: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73  nstead of the us
d830: 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20  ual.** (slower) 
d840: 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
d850: 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a  keys B-Tree..**.
d860: 2a 2a 20 49 66 20 72 4d 61 79 48 61 76 65 4e 75  ** If rMayHaveNu
d870: 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ll is non-zero, 
d880: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
d890: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  the operation is
d8a0: 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61   an IN.** (not a
d8b0: 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54   SELECT or EXIST
d8c0: 53 29 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  S) and that the 
d8d0: 52 48 53 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  RHS might contai
d8e0: 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 46 75 72  ns NULLs..** Fur
d8f0: 74 68 65 72 6d 6f 72 65 2c 20 74 68 65 20 49 4e  thermore, the IN
d900: 20 69 73 20 69 6e 20 61 20 57 48 45 52 45 20 63   is in a WHERE c
d910: 6c 61 75 73 65 20 61 6e 64 20 74 68 61 74 20 77  lause and that w
d920: 65 20 72 65 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a  e really want.**
d930: 20 74 6f 20 69 74 65 72 61 74 65 20 6f 76 65 72   to iterate over
d940: 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
d950: 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 6f  IN operator in o
d960: 72 64 65 72 20 74 6f 20 71 75 69 63 6b 6c 79 20  rder to quickly 
d970: 6c 6f 63 61 74 65 0a 2a 2a 20 61 6c 6c 20 63 6f  locate.** all co
d980: 72 72 65 73 70 6f 6e 64 69 6e 67 20 4c 48 53 20  rresponding LHS 
d990: 65 6c 65 6d 65 6e 74 73 2e 20 20 41 6c 6c 20 74  elements.  All t
d9a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
d9b0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 0a 2a   is initialize.*
d9c0: 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20 67  * the register g
d9d0: 69 76 65 6e 20 62 79 20 72 4d 61 79 48 61 76 65  iven by rMayHave
d9e0: 4e 75 6c 6c 20 74 6f 20 4e 55 4c 4c 2e 20 20 43  Null to NULL.  C
d9f0: 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  alling routines 
da00: 77 69 6c 6c 20 74 61 6b 65 0a 2a 2a 20 63 61 72  will take.** car
da10: 65 20 6f 66 20 63 68 61 6e 67 69 6e 67 20 74 68  e of changing th
da20: 69 73 20 72 65 67 69 73 74 65 72 20 76 61 6c 75  is register valu
da30: 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66  e to non-NULL if
da40: 20 74 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c   the RHS is NULL
da50: 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  -free..**.** If 
da60: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20  rMayHaveNull is 
da70: 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73  zero, that means
da80: 20 74 68 61 74 20 74 68 65 20 73 75 62 71 75 65   that the subque
da90: 72 79 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  ry is being used
daa0: 0a 2a 2a 20 66 6f 72 20 6d 65 6d 62 65 72 73 68  .** for membersh
dab0: 69 70 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 2e  ip testing only.
dac0: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65    There is no ne
dad0: 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ed to initialize
dae0: 20 61 6e 79 0a 2a 2a 20 72 65 67 69 73 74 65 72   any.** register
daf0: 73 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  s to indicate th
db00: 65 20 70 72 65 73 65 6e 73 65 20 6f 72 20 61 62  e presense or ab
db10: 73 65 6e 63 65 20 6f 66 20 4e 55 4c 4c 73 20 6f  sence of NULLs o
db20: 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a 0a 2a 2a  n the RHS..**.**
db30: 20 46 6f 72 20 61 20 53 45 4c 45 43 54 20 6f 72   For a SELECT or
db40: 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72   EXISTS operator
db50: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 67  , return the reg
db60: 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73  ister that holds
db70: 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20   the.** result. 
db80: 20 46 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72   For IN operator
db90: 73 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72  s or if an error
dba0: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 72 65 74   occurs, the ret
dbb0: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 30 2e 0a  urn value is 0..
dbc0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
dbd0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
dbe0: 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65 53  int sqlite3CodeS
dbf0: 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61 72 73  ubselect(.  Pars
dc00: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
dc10: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
dc20: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
dc30: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
dc40: 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20 53      /* The IN, S
dc50: 45 4c 45 43 54 2c 20 6f 72 20 45 58 49 53 54 53  ELECT, or EXISTS
dc60: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   operator */.  i
dc70: 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c  nt rMayHaveNull,
dc80: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
dc90: 65 72 20 74 68 61 74 20 72 65 63 6f 72 64 73 20  er that records 
dca0: 77 68 65 74 68 65 72 20 4e 55 4c 4c 73 20 65 78  whether NULLs ex
dcb0: 69 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20 20  ist in RHS */.  
dcc0: 69 6e 74 20 69 73 52 6f 77 69 64 20 20 20 20 20  int isRowid     
dcd0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
dce0: 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f 70  ue, LHS of IN op
dcf0: 65 72 61 74 6f 72 20 69 73 20 61 20 72 6f 77 69  erator is a rowi
dd00: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 74 65  d */.){.  int te
dd10: 73 74 41 64 64 72 20 3d 20 2d 31 3b 20 20 20 20  stAddr = -1;    
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd30: 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65    /* One-time te
dd40: 73 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  st address */.  
dd50: 69 6e 74 20 72 52 65 67 20 3d 20 30 3b 20 20 20  int rReg = 0;   
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd70: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
dd80: 74 65 72 20 73 74 6f 72 69 6e 67 20 72 65 73 75  ter storing resu
dd90: 6c 74 69 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20  lting */.  Vdbe 
dda0: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
ddb0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
ddc0: 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
ddd0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c   return 0;.  sql
dde0: 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
ddf0: 68 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a  h(pParse);..  /*
de00: 20 54 68 69 73 20 63 6f 64 65 20 6d 75 73 74 20   This code must 
de10: 62 65 20 72 75 6e 20 69 6e 20 69 74 73 20 65 6e  be run in its en
de20: 74 69 72 65 74 79 20 65 76 65 72 79 20 74 69 6d  tirety every tim
de30: 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65  e it is encounte
de40: 72 65 64 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20  red.  ** if any 
de50: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
de60: 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20   is true:.  **. 
de70: 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
de80: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
de90: 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
dea0: 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a  bquery.  **    *
deb0: 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
dec0: 20 73 69 64 65 20 69 73 20 61 6e 20 65 78 70 72   side is an expr
ded0: 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74  ession list cont
dee0: 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73  aining variables
def0: 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61  .  **    *  We a
df00: 72 65 20 69 6e 73 69 64 65 20 61 20 74 72 69 67  re inside a trig
df10: 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ger.  **.  ** If
df20: 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76   all of the abov
df30: 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65  e are false, the
df40: 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68 69  n we can run thi
df50: 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65  s code just once
df60: 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20 72  .  ** save the r
df70: 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75 73  esults, and reus
df80: 65 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  e the same resul
df90: 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20  t on subsequent 
dfa0: 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a  invocations..  *
dfb0: 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  /.  if( !ExprHas
dfc0: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
dfd0: 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29  r, EP_VarSelect)
dfe0: 20 29 7b 0a 20 20 20 20 74 65 73 74 41 64 64 72   ){.    testAddr
dff0: 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e   = sqlite3CodeOn
e000: 63 65 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a  ce(pParse);.  }.
e010: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e020: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
e030: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
e040: 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68 61  in==2 ){.    cha
e050: 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65  r *zMsg = sqlite
e060: 33 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  3MPrintf(.      
e070: 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 45    pParse->db, "E
e080: 58 45 43 55 54 45 20 25 73 25 73 20 53 55 42 51  XECUTE %s%s SUBQ
e090: 55 45 52 59 20 25 64 22 2c 20 74 65 73 74 41 64  UERY %d", testAd
e0a0: 64 72 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c  dr>=0?"":"CORREL
e0b0: 41 54 45 44 20 22 2c 0a 20 20 20 20 20 20 20 20  ATED ",.        
e0c0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pExpr->op==TK_IN
e0d0: 3f 22 4c 49 53 54 22 3a 22 53 43 41 4c 41 52 22  ?"LIST":"SCALAR"
e0e0: 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
e0f0: 65 6c 65 63 74 49 64 0a 20 20 20 20 29 3b 0a 20  electId.    );. 
e100: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e110: 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
e120: 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
e130: 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73  ectId, 0, 0, zMs
e140: 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
e150: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77    }.#endif..  sw
e160: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
e170: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
e180: 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20  N: {.      char 
e190: 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20  affinity;       
e1a0: 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
e1b0: 74 79 20 6f 66 20 74 68 65 20 4c 48 53 20 6f 66  ty of the LHS of
e1c0: 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20   the IN */.     
e1d0: 20 4b 65 79 49 6e 66 6f 20 6b 65 79 49 6e 66 6f   KeyInfo keyInfo
e1e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
e1f0: 4b 65 79 69 6e 66 6f 20 66 6f 72 20 74 68 65 20  Keyinfo for the 
e200: 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c 65 20  generated table 
e210: 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
e220: 75 38 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30  u8 sortOrder = 0
e230: 3b 20 20 20 20 2f 2a 20 46 61 6b 65 20 61 53 6f  ;    /* Fake aSo
e240: 72 74 4f 72 64 65 72 20 66 6f 72 20 6b 65 79 49  rtOrder for keyI
e250: 6e 66 6f 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  nfo */.      int
e260: 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20   addr;          
e270: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
e280: 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70  ess of OP_OpenEp
e290: 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
e2a0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
e2b0: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
e2c0: 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20  ->pLeft; /* the 
e2d0: 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  LHS of the IN op
e2e0: 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20  erator */..     
e2f0: 20 69 66 28 20 72 4d 61 79 48 61 76 65 4e 75 6c   if( rMayHaveNul
e300: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
e310: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
e320: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 4d  , OP_Null, 0, rM
e330: 61 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20  ayHaveNull);.   
e340: 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 66 66 69     }..      affi
e350: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78  nity = sqlite3Ex
e360: 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74  prAffinity(pLeft
e370: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65  );..      /* Whe
e380: 74 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20  ther this is an 
e390: 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29  'x IN(SELECT...)
e3a0: 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65  ' or an 'x IN(<e
e3b0: 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20  xprlist>)'.     
e3c0: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69   ** expression i
e3d0: 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65  t is handled the
e3e0: 20 73 61 6d 65 20 77 61 79 2e 20 20 41 6e 20 65   same way.  An e
e3f0: 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69  phemeral table i
e400: 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c  s .      ** fill
e410: 65 64 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66  ed with single-f
e420: 69 65 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20  ield index keys 
e430: 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65  representing the
e440: 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a   results.      *
e450: 2a 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43  * from the SELEC
e460: 54 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69  T or the <exprli
e470: 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  st>..      **.  
e480: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78      ** If the 'x
e490: 27 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ' expression is 
e4a0: 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20  a column value, 
e4b0: 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e  or the SELECT...
e4c0: 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
e4d0: 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f  ent returns a co
e4e0: 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e  lumn value, then
e4f0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
e500: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63   that.      ** c
e510: 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f  olumn is used to
e520: 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78   build the index
e530: 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27   keys. If both '
e540: 78 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20  x' and the.     
e550: 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74   ** SELECT... st
e560: 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75  atement are colu
e570: 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69  mns, then numeri
e580: 63 20 61 66 66 69 6e 69 74 79 20 69 73 20 75 73  c affinity is us
e590: 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65  ed.      ** if e
e5a0: 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73  ither column has
e5b0: 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45   NUMERIC or INTE
e5c0: 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66  GER affinity. If
e5d0: 20 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a   neither.      *
e5e0: 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45  * 'x' nor the SE
e5f0: 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e  LECT... statemen
e600: 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74  t are columns, t
e610: 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69  hen numeric affi
e620: 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73  nity.      ** is
e630: 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   used..      */.
e640: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
e650: 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ble = pParse->nT
e660: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72  ab++;.      addr
e670: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
e680: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
e690: 70 68 65 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d  phemeral, pExpr-
e6a0: 3e 69 54 61 62 6c 65 2c 20 21 69 73 52 6f 77 69  >iTable, !isRowi
e6b0: 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 4d  d);.      if( rM
e6c0: 61 79 48 61 76 65 4e 75 6c 6c 3d 3d 30 20 29 20  ayHaveNull==0 ) 
e6d0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
e6e0: 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f  eP5(v, BTREE_UNO
e6f0: 52 44 45 52 45 44 29 3b 0a 20 20 20 20 20 20 6d  RDERED);.      m
e700: 65 6d 73 65 74 28 26 6b 65 79 49 6e 66 6f 2c 20  emset(&keyInfo, 
e710: 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 49 6e 66  0, sizeof(keyInf
e720: 6f 29 29 3b 0a 20 20 20 20 20 20 6b 65 79 49 6e  o));.      keyIn
e730: 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 31 3b 0a 20  fo.nField = 1;. 
e740: 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 53 6f       keyInfo.aSo
e750: 72 74 4f 72 64 65 72 20 3d 20 26 73 6f 72 74 4f  rtOrder = &sortO
e760: 72 64 65 72 3b 0a 0a 20 20 20 20 20 20 69 66 28  rder;..      if(
e770: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
e780: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
e790: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
e7a0: 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20   /* Case 1:     
e7b0: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
e7c0: 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ...).        **.
e7d0: 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72          ** Gener
e7e0: 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74  ate code to writ
e7f0: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
e800: 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f   the select into
e810: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
e820: 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
e830: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70  allocated and op
e840: 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20  ened above..    
e850: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 53      */.        S
e860: 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a  electDest dest;.
e870: 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
e880: 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20   *pEList;..     
e890: 20 20 20 61 73 73 65 72 74 28 20 21 69 73 52 6f     assert( !isRo
e8a0: 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 73  wid );.        s
e8b0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
e8c0: 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
e8d0: 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  Set, pExpr->iTab
e8e0: 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 64 65 73  le);.        des
e8f0: 74 2e 61 66 66 53 64 73 74 20 3d 20 28 75 38 29  t.affSdst = (u8)
e900: 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20  affinity;.      
e910: 20 20 61 73 73 65 72 74 28 20 28 70 45 78 70 72    assert( (pExpr
e920: 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30 46  ->iTable&0x0000F
e930: 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61  FFF)==pExpr->iTa
e940: 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ble );.        p
e950: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  Expr->x.pSelect-
e960: 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >iLimit = 0;.   
e970: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
e980: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
e990: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  Expr->x.pSelect,
e9a0: 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20   &dest) ){.     
e9b0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
e9c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e9d0: 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   pEList = pExpr-
e9e0: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
e9f0: 73 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  st;.        if( 
ea00: 41 4c 57 41 59 53 28 70 45 4c 69 73 74 21 3d 30  ALWAYS(pEList!=0
ea10: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
ea20: 72 3e 30 29 20 29 7b 20 0a 20 20 20 20 20 20 20  r>0) ){ .       
ea30: 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c     keyInfo.aColl
ea40: 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  [0] = sqlite3Bin
ea50: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
ea60: 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
ea70: 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20  >pLeft,.        
ea80: 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b        pEList->a[
ea90: 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  0].pExpr);.     
eaa0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
eab0: 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70   if( ALWAYS(pExp
eac0: 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29  r->x.pList!=0) )
ead0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
eae0: 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 2:     expr IN
eaf0: 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20   (exprlist).    
eb00: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
eb10: 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65  * For each expre
eb20: 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20  ssion, build an 
eb30: 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74  index key from t
eb40: 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e  he evaluation an
eb50: 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f  d.        ** sto
eb60: 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d  re it in the tem
eb70: 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66  porary table. If
eb80: 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c   <expr> is a col
eb90: 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20  umn, then use.  
eba0: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f        ** that co
ebb0: 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77  lumns affinity w
ebc0: 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64  hen building ind
ebd0: 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70  ex keys. If <exp
ebe0: 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20  r> is not.      
ebf0: 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75    ** a column, u
ec00: 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  se numeric affin
ec10: 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ity..        */.
ec20: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
ec30: 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
ec40: 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
ec50: 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  x.pList;.       
ec60: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
ec70: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
ec80: 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32        int r1, r2
ec90: 2c 20 72 33 3b 0a 0a 20 20 20 20 20 20 20 20 69  , r3;..        i
eca0: 66 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a  f( !affinity ){.
ecb0: 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69            affini
ecc0: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
ecd0: 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
ece0: 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e          keyInfo.
ecf0: 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74  aColl[0] = sqlit
ed00: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
ed10: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
ed20: 66 74 29 3b 0a 20 20 20 20 20 20 20 20 6b 65 79  ft);.        key
ed30: 49 6e 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72 20  Info.aSortOrder 
ed40: 3d 20 26 73 6f 72 74 4f 72 64 65 72 3b 0a 0a 20  = &sortOrder;.. 
ed50: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74         /* Loop t
ed60: 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
ed70: 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c  ession in <exprl
ed80: 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ist>. */.       
ed90: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
eda0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
edb0: 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71  .        r2 = sq
edc0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
edd0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
ede0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
edf0: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
ee00: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 66  , r2);.        f
ee10: 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70  or(i=pList->nExp
ee20: 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  r, pItem=pList->
ee30: 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  a; i>0; i--, pIt
ee40: 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
ee50: 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74   Expr *pE2 = pIt
ee60: 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
ee70: 20 20 20 20 20 69 6e 74 20 69 56 61 6c 54 6f 49       int iValToI
ee80: 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  ns;..          /
ee90: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
eea0: 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  ion is not const
eeb0: 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ant then we will
eec0: 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20   need to.       
eed0: 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68     ** disable th
eee0: 65 20 74 65 73 74 20 74 68 61 74 20 77 61 73 20  e test that was 
eef0: 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20  generated above 
ef00: 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a  that makes sure.
ef10: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
ef20: 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63  s code only exec
ef30: 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61  utes once.  Beca
ef40: 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f  use for a non-co
ef50: 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 20 20 20  nstant.         
ef60: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77   ** expression w
ef70: 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75 6e 20  e need to rerun 
ef80: 74 68 69 73 20 63 6f 64 65 20 65 61 63 68 20 74  this code each t
ef90: 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ime..          *
efa0: 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
efb0: 74 65 73 74 41 64 64 72 3e 3d 30 20 26 26 20 21  testAddr>=0 && !
efc0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
efd0: 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20  stant(pE2) ){.  
efe0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
eff0: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
f000: 70 28 76 2c 20 74 65 73 74 41 64 64 72 29 3b 0a  p(v, testAddr);.
f010: 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
f020: 41 64 64 72 20 3d 20 2d 31 3b 0a 20 20 20 20 20  Addr = -1;.     
f030: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
f040: 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
f050: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  e expression and
f060: 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20   insert it into 
f070: 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a  the temp table *
f080: 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
f090: 69 73 52 6f 77 69 64 20 26 26 20 73 71 6c 69 74  isRowid && sqlit
f0a0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
f0b0: 70 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29  pE2, &iValToIns)
f0c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
f0d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f0e0: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e  3(v, OP_InsertIn
f0f0: 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
f100: 2c 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29  , r2, iValToIns)
f110: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
f120: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
f130: 33 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  3 = sqlite3ExprC
f140: 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
f150: 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20  , pE2, r1);.    
f160: 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f          if( isRo
f170: 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  wid ){.         
f180: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f190: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73  AddOp2(v, OP_Mus
f1a0: 74 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20  tBeInt, r3,.    
f1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
f1d0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
f1e0: 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20  dr(v)+2);.      
f1f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f200: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
f210: 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69  Insert, pExpr->i
f220: 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a  Table, r2, r3);.
f230: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
f240: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
f250: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f260: 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
f270: 6f 72 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20  ord, r3, 1, r2, 
f280: 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20  &affinity, 1);. 
f290: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
f2a0: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
f2b0: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
f2c0: 73 65 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20 20  se, r3, 1);.    
f2d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f2e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f2f0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78  P_IdxInsert, pEx
f300: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 29 3b  pr->iTable, r2);
f310: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
f320: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
f330: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
f340: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
f350: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
f360: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
f370: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
f380: 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  arse, r2);.     
f390: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 69 73   }.      if( !is
f3a0: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
f3b0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
f3c0: 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76  geP4(v, addr, (v
f3d0: 6f 69 64 20 2a 29 26 6b 65 79 49 6e 66 6f 2c 20  oid *)&keyInfo, 
f3e0: 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
f3f0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
f400: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
f410: 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20  e TK_EXISTS:.   
f420: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
f430: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
f440: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
f450: 20 68 61 73 20 74 6f 20 62 65 20 61 20 73 63 61   has to be a sca
f460: 6c 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65 6e  lar SELECT.  Gen
f470: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75  erate code to pu
f480: 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 76  t the.      ** v
f490: 61 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65 6c  alue of this sel
f4a0: 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20  ect in a memory 
f4b0: 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64 20  cell and record 
f4c0: 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20  the number.     
f4d0: 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72   ** of the memor
f4e0: 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d  y cell in iColum
f4f0: 6e 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 61  n.  If this is a
f500: 6e 20 45 58 49 53 54 53 2c 20 77 72 69 74 65 0a  n EXISTS, write.
f510: 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65        ** an inte
f520: 67 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74  ger 0 (not exist
f530: 73 29 20 6f 72 20 31 20 28 65 78 69 73 74 73 29  s) or 1 (exists)
f540: 20 69 6e 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63   into a memory c
f550: 65 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ell.      ** and
f560: 20 72 65 63 6f 72 64 20 74 68 61 74 20 6d 65 6d   record that mem
f570: 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c  ory cell in iCol
f580: 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  umn..      */.  
f590: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
f5a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f5b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
f5c0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ECT statement to
f5d0: 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   encode */.     
f5e0: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
f5f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f600: 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f         /* How to
f610: 20 64 65 61 6c 20 77 69 74 68 20 53 45 4c 45 43   deal with SELEC
f620: 74 20 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20  t result */..   
f630: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
f640: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  pr->op==TK_EXIST
f650: 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
f660: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
f670: 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
f680: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
f690: 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ->op==TK_EXISTS 
f6a0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
f6b0: 5f 53 45 4c 45 43 54 20 29 3b 0a 0a 20 20 20 20  _SELECT );..    
f6c0: 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
f6d0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
f6e0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
f6f0: 3b 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70  ;.      pSel = p
f700: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b  Expr->x.pSelect;
f710: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
f720: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
f730: 73 74 2c 20 30 2c 20 2b 2b 70 50 61 72 73 65 2d  st, 0, ++pParse-
f740: 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69 66  >nMem);.      if
f750: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
f760: 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20  SELECT ){.      
f770: 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
f780: 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  RT_Mem;.        
f790: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f7a0: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
f7b0: 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a   dest.iSDParm);.
f7c0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
f7d0: 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75  ent((v, "Init su
f7e0: 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29  bquery result"))
f7f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f800: 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73         dest.eDes
f810: 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a  t = SRT_Exists;.
f820: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f830: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f840: 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73 74  Integer, 0, dest
f850: 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  .iSDParm);.     
f860: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
f870: 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53 20  v, "Init EXISTS 
f880: 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
f890: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
f8a0: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
f8b0: 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69  e->db, pSel->pLi
f8c0: 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65 6c  mit);.      pSel
f8d0: 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74  ->pLimit = sqlit
f8e0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
f8f0: 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30  TK_INTEGER, 0, 0
f900: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f920: 20 20 20 20 26 73 71 6c 69 74 65 33 49 6e 74 54      &sqlite3IntT
f930: 6f 6b 65 6e 73 5b 31 5d 29 3b 0a 20 20 20 20 20  okens[1]);.     
f940: 20 70 53 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20   pSel->iLimit = 
f950: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  0;.      if( sql
f960: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
f970: 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20  e, pSel, &dest) 
f980: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
f990: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
f9a0: 20 20 20 72 52 65 67 20 3d 20 64 65 73 74 2e 69     rReg = dest.i
f9b0: 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 45 78  SDParm;.      Ex
f9c0: 70 72 53 65 74 49 72 72 65 64 75 63 69 62 6c 65  prSetIrreducible
f9d0: 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 62  (pExpr);.      b
f9e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
f9f0: 0a 20 20 69 66 28 20 74 65 73 74 41 64 64 72 3e  .  if( testAddr>
fa00: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
fa10: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
fa20: 20 74 65 73 74 41 64 64 72 29 3b 0a 20 20 7d 0a   testAddr);.  }.
fa30: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
fa40: 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
fa50: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 52 65 67  ;..  return rReg
fa60: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
fa70: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
fa80: 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  RY */..#ifndef S
fa90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
faa0: 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  ERY./*.** Genera
fab0: 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 49  te code for an I
fac0: 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  N expression..**
fad0: 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 53  .**      x IN (S
fae0: 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20  ELECT ...).**   
faf0: 20 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c 20     x IN (value, 
fb00: 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a  value, ...).**.*
fb10: 2a 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20  * The left-hand 
fb20: 73 69 64 65 20 28 4c 48 53 29 20 69 73 20 61 20  side (LHS) is a 
fb30: 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f  scalar expressio
fb40: 6e 2e 20 20 54 68 65 20 72 69 67 68 74 2d 68 61  n.  The right-ha
fb50: 6e 64 20 73 69 64 65 20 28 52 48 53 29 0a 2a 2a  nd side (RHS).**
fb60: 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20   is an array of 
fb70: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 76 61 6c  zero or more val
fb80: 75 65 73 2e 20 20 54 68 65 20 65 78 70 72 65 73  ues.  The expres
fb90: 73 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20  sion is true if 
fba0: 74 68 65 20 4c 48 53 20 69 73 0a 2a 2a 20 63 6f  the LHS is.** co
fbb0: 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74  ntained within t
fbc0: 68 65 20 52 48 53 2e 20 20 54 68 65 20 76 61 6c  he RHS.  The val
fbd0: 75 65 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ue of the expres
fbe0: 73 69 6f 6e 20 69 73 20 75 6e 6b 6e 6f 77 6e 20  sion is unknown 
fbf0: 28 4e 55 4c 4c 29 0a 2a 2a 20 69 66 20 74 68 65  (NULL).** if the
fc00: 20 4c 48 53 20 69 73 20 4e 55 4c 4c 20 6f 72 20   LHS is NULL or 
fc10: 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f  if the LHS is no
fc20: 74 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  t contained with
fc30: 69 6e 20 74 68 65 20 52 48 53 20 61 6e 64 20 74  in the RHS and t
fc40: 68 65 0a 2a 2a 20 52 48 53 20 63 6f 6e 74 61 69  he.** RHS contai
fc50: 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e  ns one or more N
fc60: 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a  ULL values..**.*
fc70: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
fc80: 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 77 69  enerates code wi
fc90: 6c 6c 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49  ll jump to destI
fca0: 66 46 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48  fFalse if the LH
fcb0: 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e  S is not .** con
fcc0: 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68  tained within th
fcd0: 65 20 52 48 53 2e 20 20 49 66 20 64 75 65 20 74  e RHS.  If due t
fce0: 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f  o NULLs we canno
fcf0: 74 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  t determine if t
fd00: 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e  he LHS.** is con
fd10: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48  tained in the RH
fd20: 53 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64  S then jump to d
fd30: 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74  estIfNull.  If t
fd40: 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61 69  he LHS is contai
fd50: 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  ned.** within th
fd60: 65 20 52 48 53 20 74 68 65 6e 20 66 61 6c 6c 20  e RHS then fall 
fd70: 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 73 74 61 74  through..*/.stat
fd80: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45  ic void sqlite3E
fd90: 78 70 72 43 6f 64 65 49 4e 28 0a 20 20 50 61 72  xprCodeIN(.  Par
fda0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
fdb0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
fdc0: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
fdd0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
fde0: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
fdf0: 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20 65       /* The IN e
fe00: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
fe10: 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  nt destIfFalse, 
fe20: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
fe30: 65 20 69 66 20 4c 48 53 20 69 73 20 6e 6f 74 20  e if LHS is not 
fe40: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
fe50: 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65   RHS */.  int de
fe60: 73 74 49 66 4e 75 6c 6c 20 20 20 20 20 20 20 20  stIfNull        
fe70: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
fe80: 74 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  the results are 
fe90: 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e  unknown due to N
fea0: 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ULLs */.){.  int
feb0: 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30   rRhsHasNull = 0
fec0: 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74  ;  /* Register t
fed0: 68 61 74 20 69 73 20 74 72 75 65 20 69 66 20 52  hat is true if R
fee0: 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c  HS contains NULL
fef0: 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 63 68 61   values */.  cha
ff00: 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20  r affinity;     
ff10: 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e     /* Comparison
ff20: 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65   affinity to use
ff30: 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b   */.  int eType;
ff40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ff50: 79 70 65 20 6f 66 20 74 68 65 20 52 48 53 20 2a  ype of the RHS *
ff60: 2f 0a 20 20 69 6e 74 20 72 31 3b 20 20 20 20 20  /.  int r1;     
ff70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
ff80: 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73  porary use regis
ff90: 74 65 72 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ter */.  Vdbe *v
ffa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
ffb0: 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  * Statement unde
ffc0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
ffd0: 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  /..  /* Compute 
ffe0: 74 68 65 20 52 48 53 2e 20 20 20 41 66 74 65 72  the RHS.   After
fff0: 20 74 68 69 73 20 73 74 65 70 2c 20 74 68 65 20   this step, the 
10000 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f  table with curso
10010 72 0a 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54  r.  ** pExpr->iT
10020 61 62 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69  able will contai
10030 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20 74 68  ns the values th
10040 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 52  at make up the R
10050 48 53 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 70  HS..  */.  v = p
10060 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
10070 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20  assert( v!=0 ); 
10080 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74        /* OOM det
10090 65 63 74 65 64 20 70 72 69 6f 72 20 74 6f 20 74  ected prior to t
100a0 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  his routine */. 
100b0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
100c0 28 28 76 2c 20 22 62 65 67 69 6e 20 49 4e 20 65  ((v, "begin IN e
100d0 78 70 72 22 29 29 3b 0a 20 20 65 54 79 70 65 20  xpr"));.  eType 
100e0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  = sqlite3FindInI
100f0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 45 78  ndex(pParse, pEx
10100 70 72 2c 20 26 72 52 68 73 48 61 73 4e 75 6c 6c  pr, &rRhsHasNull
10110 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  );..  /* Figure 
10120 6f 75 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  out the affinity
10130 20 74 6f 20 75 73 65 20 74 6f 20 63 72 65 61 74   to use to creat
10140 65 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68 65  e a key from the
10150 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 6f 66   results.  ** of
10160 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
10170 20 61 66 66 69 6e 69 74 79 53 74 72 20 73 74 6f   affinityStr sto
10180 72 65 73 20 61 20 73 74 61 74 69 63 20 73 74 72  res a static str
10190 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ing suitable for
101a0 0a 20 20 2a 2a 20 50 34 20 6f 66 20 4f 50 5f 4d  .  ** P4 of OP_M
101b0 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a  akeRecord..  */.
101c0 20 20 61 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d    affinity = com
101d0 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28  parisonAffinity(
101e0 70 45 78 70 72 29 3b 0a 0a 20 20 2f 2a 20 43 6f  pExpr);..  /* Co
101f0 64 65 20 74 68 65 20 4c 48 53 2c 20 74 68 65 20  de the LHS, the 
10200 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78  <expr> from "<ex
10210 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 0a 20  pr> IN (...)".. 
10220 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
10230 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
10240 65 29 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74  e);.  r1 = sqlit
10250 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
10260 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  rse);.  sqlite3E
10270 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
10280 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 72 31  pExpr->pLeft, r1
10290 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
102a0 4c 48 53 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  LHS is NULL, the
102b0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  n the result is 
102c0 65 69 74 68 65 72 20 66 61 6c 73 65 20 6f 72 20  either false or 
102d0 4e 55 4c 4c 20 64 65 70 65 6e 64 69 6e 67 0a 20  NULL depending. 
102e0 20 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72 20 74   ** on whether t
102f0 68 65 20 52 48 53 20 69 73 20 65 6d 70 74 79 20  he RHS is empty 
10300 6f 72 20 6e 6f 74 2c 20 72 65 73 70 65 63 74 69  or not, respecti
10310 76 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  vely..  */.  if(
10320 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73   destIfNull==des
10330 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20  tIfFalse ){.    
10340 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72 20  /* Shortcut for 
10350 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
10360 77 68 65 72 65 20 74 68 65 20 66 61 6c 73 65 20  where the false 
10370 61 6e 64 20 4e 55 4c 4c 20 6f 75 74 63 6f 6d 65  and NULL outcome
10380 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65  s are.    ** the
10390 20 73 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 73 71   same. */.    sq
103a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
103b0 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31  v, OP_IsNull, r1
103c0 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
103d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
103e0 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
103f0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
10400 4e 6f 74 4e 75 6c 6c 2c 20 72 31 29 3b 0a 20 20  NotNull, r1);.  
10410 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10420 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
10430 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
10440 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
10450 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10460 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
10470 20 30 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b   0, destIfNull);
10480 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10490 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
104a0 31 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65  1);.  }..  if( e
104b0 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
104c0 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49  OWID ){.    /* I
104d0 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
104e0 20 52 48 53 20 69 73 20 74 68 65 20 52 4f 57 49   RHS is the ROWI
104f0 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74 72 65  D of table b-tre
10500 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  e.    */.    sql
10510 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10520 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
10530 72 31 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  r1, destIfFalse)
10540 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10550 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f  eAddOp3(v, OP_No
10560 74 45 78 69 73 74 73 2c 20 70 45 78 70 72 2d 3e  tExists, pExpr->
10570 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61  iTable, destIfFa
10580 6c 73 65 2c 20 72 31 29 3b 0a 20 20 7d 65 6c 73  lse, r1);.  }els
10590 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  e{.    /* In thi
105a0 73 20 63 61 73 65 2c 20 74 68 65 20 52 48 53 20  s case, the RHS 
105b0 69 73 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  is an index b-tr
105c0 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ee..    */.    s
105d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
105e0 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c  (v, OP_Affinity,
105f0 20 72 31 2c 20 31 2c 20 30 2c 20 26 61 66 66 69   r1, 1, 0, &affi
10600 6e 69 74 79 2c 20 31 29 3b 0a 0a 20 20 20 20 2f  nity, 1);..    /
10610 2a 20 49 66 20 74 68 65 20 73 65 74 20 6d 65 6d  * If the set mem
10620 62 65 72 73 68 69 70 20 74 65 73 74 20 66 61 69  bership test fai
10630 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  ls, then the res
10640 75 6c 74 20 6f 66 20 74 68 65 20 0a 20 20 20 20  ult of the .    
10650 2a 2a 20 22 78 20 49 4e 20 28 2e 2e 2e 29 22 20  ** "x IN (...)" 
10660 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20  expression must 
10670 62 65 20 65 69 74 68 65 72 20 30 20 6f 72 20 4e  be either 0 or N
10680 55 4c 4c 2e 20 49 66 20 74 68 65 20 73 65 74 0a  ULL. If the set.
10690 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
106a0 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20  no NULL values, 
106b0 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
106c0 69 73 20 30 2e 20 49 66 20 74 68 65 20 73 65 74  is 0. If the set
106d0 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e   .    ** contain
106e0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55  s one or more NU
106f0 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20  LL values, then 
10700 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
10710 65 0a 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73  e.    ** express
10720 69 6f 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c  ion is also NULL
10730 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10740 20 72 52 68 73 48 61 73 4e 75 6c 6c 3d 3d 30 20   rRhsHasNull==0 
10750 7c 7c 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d  || destIfFalse==
10760 64 65 73 74 49 66 4e 75 6c 6c 20 29 7b 0a 20 20  destIfNull ){.  
10770 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
10780 63 68 20 72 75 6e 73 20 69 66 20 69 74 20 69 73  ch runs if it is
10790 20 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d 70 69 6c   known at compil
107a0 65 20 74 69 6d 65 20 74 68 61 74 20 74 68 65 20  e time that the 
107b0 52 48 53 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e  RHS.      ** can
107c0 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c  not contain NULL
107d0 20 76 61 6c 75 65 73 2e 20 54 68 69 73 20 68 61   values. This ha
107e0 70 70 65 6e 73 20 61 73 20 74 68 65 20 72 65 73  ppens as the res
107f0 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ult.      ** of 
10800 61 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e  a "NOT NULL" con
10810 73 74 72 61 69 6e 74 20 69 6e 20 74 68 65 20 64  straint in the d
10820 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a  atabase schema..
10830 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
10840 2a 20 41 6c 73 6f 20 72 75 6e 20 74 68 69 73 20  * Also run this 
10850 62 72 61 6e 63 68 20 69 66 20 4e 55 4c 4c 20 69  branch if NULL i
10860 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
10870 46 41 4c 53 45 0a 20 20 20 20 20 20 2a 2a 20 66  FALSE.      ** f
10880 6f 72 20 74 68 69 73 20 70 61 72 74 69 63 75 6c  or this particul
10890 61 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a  ar IN operator..
108a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
108b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
108c0 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  Int(v, OP_NotFou
108d0 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
108e0 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  e, destIfFalse, 
108f0 72 31 2c 20 31 29 3b 0a 0a 20 20 20 20 7d 65 6c  r1, 1);..    }el
10900 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20  se{.      /* In 
10910 74 68 69 73 20 62 72 61 6e 63 68 2c 20 74 68 65  this branch, the
10920 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6d   RHS of the IN m
10930 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e  ight contain a N
10940 55 4c 4c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ULL and.      **
10950 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
10960 20 61 20 4e 55 4c 4c 20 6f 6e 20 74 68 65 20 52   a NULL on the R
10970 48 53 20 6d 61 6b 65 73 20 61 20 64 69 66 66 65  HS makes a diffe
10980 72 65 6e 63 65 20 69 6e 20 74 68 65 0a 20 20 20  rence in the.   
10990 20 20 20 2a 2a 20 6f 75 74 63 6f 6d 65 2e 0a 20     ** outcome.. 
109a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
109b0 74 20 6a 31 2c 20 6a 32 2c 20 6a 33 3b 0a 0a 20  t j1, j2, j3;.. 
109c0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63 68       /* First ch
109d0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
109e0 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e  e LHS is contain
109f0 65 64 20 69 6e 20 74 68 65 20 52 48 53 2e 20 20  ed in the RHS.  
10a00 49 66 20 73 6f 2c 0a 20 20 20 20 20 20 2a 2a 20  If so,.      ** 
10a10 74 68 65 6e 20 74 68 65 20 70 72 65 73 65 6e 63  then the presenc
10a20 65 20 6f 66 20 4e 55 4c 4c 73 20 69 6e 20 74 68  e of NULLs in th
10a30 65 20 52 48 53 20 64 6f 65 73 20 6e 6f 74 20 6d  e RHS does not m
10a40 61 74 74 65 72 2c 20 73 6f 20 6a 75 6d 70 0a 20  atter, so jump. 
10a50 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 61 6c 6c       ** over all
10a60 20 6f 66 20 74 68 65 20 63 6f 64 65 20 74 68 61   of the code tha
10a70 74 20 66 6f 6c 6c 6f 77 73 2e 0a 20 20 20 20 20  t follows..     
10a80 20 2a 2f 0a 20 20 20 20 20 20 6a 31 20 3d 20 73   */.      j1 = s
10a90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
10aa0 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
10ab0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
10ac0 30 2c 20 72 31 2c 20 31 29 3b 0a 0a 20 20 20 20  0, r1, 1);..    
10ad0 20 20 2f 2a 20 48 65 72 65 20 77 65 20 62 65 67    /* Here we beg
10ae0 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  in generating co
10af0 64 65 20 74 68 61 74 20 72 75 6e 73 20 69 66 20  de that runs if 
10b00 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 0a 20  the LHS is not. 
10b10 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65       ** containe
10b20 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53  d within the RHS
10b30 2e 20 20 47 65 6e 65 72 61 74 65 20 61 64 64 69  .  Generate addi
10b40 74 69 6f 6e 61 6c 20 63 6f 64 65 20 74 68 61 74  tional code that
10b50 0a 20 20 20 20 20 20 2a 2a 20 74 65 73 74 73 20  .      ** tests 
10b60 74 68 65 20 52 48 53 20 66 6f 72 20 4e 55 4c 4c  the RHS for NULL
10b70 73 2e 20 20 49 66 20 74 68 65 20 52 48 53 20 63  s.  If the RHS c
10b80 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 20 74  ontains a NULL t
10b90 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6a 75 6d  hen.      ** jum
10ba0 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e  p to destIfNull.
10bb0 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e    If there are n
10bc0 6f 20 4e 55 4c 4c 73 20 69 6e 20 74 68 65 20 52  o NULLs in the R
10bd0 48 53 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a  HS then.      **
10be0 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66 46   jump to destIfF
10bf0 61 6c 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  alse..      */. 
10c00 20 20 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65       j2 = sqlite
10c10 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
10c20 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 52 68 73 48  P_NotNull, rRhsH
10c30 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 6a  asNull);.      j
10c40 33 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  3 = sqlite3VdbeA
10c50 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
10c60 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
10c70 62 6c 65 2c 20 30 2c 20 72 52 68 73 48 61 73 4e  ble, 0, rRhsHasN
10c80 75 6c 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  ull, 1);.      s
10c90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10ca0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
10cb0 2d 31 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 29  -1, rRhsHasNull)
10cc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10cd0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
10ce0 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
10cf0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10d00 50 5f 41 64 64 49 6d 6d 2c 20 72 52 68 73 48 61  P_AddImm, rRhsHa
10d10 73 4e 75 6c 6c 2c 20 31 29 3b 0a 20 20 20 20 20  sNull, 1);.     
10d20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
10d30 48 65 72 65 28 76 2c 20 6a 32 29 3b 0a 0a 20 20  Here(v, j2);..  
10d40 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74      /* Jump to t
10d50 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 74  he appropriate t
10d60 61 72 67 65 74 20 64 65 70 65 6e 64 69 6e 67 20  arget depending 
10d70 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
10d80 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 52  t.      ** the R
10d90 48 53 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55  HS contains a NU
10da0 4c 4c 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  LL.      */.    
10db0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10dc0 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 52  Op2(v, OP_If, rR
10dd0 68 73 48 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49  hsHasNull, destI
10de0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
10df0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10e00 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64  v, OP_Goto, 0, d
10e10 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 0a 20 20  estIfFalse);..  
10e20 20 20 20 20 2f 2a 20 54 68 65 20 4f 50 5f 46 6f      /* The OP_Fo
10e30 75 6e 64 20 61 74 20 74 68 65 20 74 6f 70 20 6f  und at the top o
10e40 66 20 74 68 69 73 20 62 72 61 6e 63 68 20 6a 75  f this branch ju
10e50 6d 70 73 20 68 65 72 65 20 77 68 65 6e 20 74 72  mps here when tr
10e60 75 65 2c 20 0a 20 20 20 20 20 20 2a 2a 20 63 61  ue, .      ** ca
10e70 75 73 69 6e 67 20 74 68 65 20 6f 76 65 72 61 6c  using the overal
10e80 6c 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 20  l IN expression 
10e90 65 76 61 6c 75 61 74 69 6f 6e 20 74 6f 20 66 61  evaluation to fa
10ea0 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 20 20 20 20  ll through..    
10eb0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
10ec0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
10ed0 2c 20 6a 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , j1);.    }.  }
10ee0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
10ef0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
10f00 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 45   r1);.  sqlite3E
10f10 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
10f20 73 65 2c 20 31 29 3b 0a 20 20 56 64 62 65 43 6f  se, 1);.  VdbeCo
10f30 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 49  mment((v, "end I
10f40 4e 20 65 78 70 72 22 29 29 3b 0a 7d 0a 23 65 6e  N expr"));.}.#en
10f50 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
10f60 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
10f70 2f 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20  /*.** Duplicate 
10f80 61 6e 20 38 2d 62 79 74 65 20 76 61 6c 75 65 0a  an 8-byte value.
10f90 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
10fa0 64 75 70 38 62 79 74 65 73 28 56 64 62 65 20 2a  dup8bytes(Vdbe *
10fb0 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69  v, const char *i
10fc0 6e 29 7b 0a 20 20 63 68 61 72 20 2a 6f 75 74 20  n){.  char *out 
10fd0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
10fe0 63 52 61 77 28 73 71 6c 69 74 65 33 56 64 62 65  cRaw(sqlite3Vdbe
10ff0 44 62 28 76 29 2c 20 38 29 3b 0a 20 20 69 66 28  Db(v), 8);.  if(
11000 20 6f 75 74 20 29 7b 0a 20 20 20 20 6d 65 6d 63   out ){.    memc
11010 70 79 28 6f 75 74 2c 20 69 6e 2c 20 38 29 3b 0a  py(out, in, 8);.
11020 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 75 74    }.  return out
11030 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
11040 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
11050 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65  G_POINT./*.** Ge
11060 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75  nerate an instru
11070 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ction that will 
11080 70 75 74 20 74 68 65 20 66 6c 6f 61 74 69 6e 67  put the floating
11090 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20   point.** value 
110a0 64 65 73 63 72 69 62 65 64 20 62 79 20 7a 5b 30  described by z[0
110b0 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69  ..n-1] into regi
110c0 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a  ster iMem..**.**
110d0 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20   The z[] string 
110e0 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f  will probably no
110f0 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e  t be zero-termin
11100 61 74 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a  ated.  But the .
11110 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65  ** z[n] characte
11120 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  r is guaranteed 
11130 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20  to be something 
11140 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f  that does not lo
11150 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63  ok.** like the c
11160 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74  ontinuation of t
11170 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74  he number..*/.st
11180 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 52 65  atic void codeRe
11190 61 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73  al(Vdbe *v, cons
111a0 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
111b0 65 67 61 74 65 46 6c 61 67 2c 20 69 6e 74 20 69  egateFlag, int i
111c0 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41 4c 57 41  Mem){.  if( ALWA
111d0 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20 20 20 20  YS(z!=0) ){.    
111e0 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20  double value;.  
111f0 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20    char *zV;.    
11200 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26  sqlite3AtoF(z, &
11210 76 61 6c 75 65 2c 20 73 71 6c 69 74 65 33 53 74  value, sqlite3St
11220 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54  rlen30(z), SQLIT
11230 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 61 73 73  E_UTF8);.    ass
11240 65 72 74 28 20 21 73 71 6c 69 74 65 33 49 73 4e  ert( !sqlite3IsN
11250 61 4e 28 76 61 6c 75 65 29 20 29 3b 20 2f 2a 20  aN(value) ); /* 
11260 54 68 65 20 6e 65 77 20 41 74 6f 46 20 6e 65 76  The new AtoF nev
11270 65 72 20 72 65 74 75 72 6e 73 20 4e 61 4e 20 2a  er returns NaN *
11280 2f 0a 20 20 20 20 69 66 28 20 6e 65 67 61 74 65  /.    if( negate
11290 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d  Flag ) value = -
112a0 76 61 6c 75 65 3b 0a 20 20 20 20 7a 56 20 3d 20  value;.    zV = 
112b0 64 75 70 38 62 79 74 65 73 28 76 2c 20 28 63 68  dup8bytes(v, (ch
112c0 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20 20  ar*)&value);.   
112d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
112e0 70 34 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30  p4(v, OP_Real, 0
112f0 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50  , iMem, 0, zV, P
11300 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23  4_REAL);.  }.}.#
11310 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  endif.../*.** Ge
11320 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75  nerate an instru
11330 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ction that will 
11340 70 75 74 20 74 68 65 20 69 6e 74 65 67 65 72 20  put the integer 
11350 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74  describe by.** t
11360 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e  ext z[0..n-1] in
11370 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d  to register iMem
11380 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a  ..**.** Expr.u.z
11390 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73 20  Token is always 
113a0 55 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65  UTF8 and zero-te
113b0 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61  rminated..*/.sta
113c0 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74  tic void codeInt
113d0 65 67 65 72 28 50 61 72 73 65 20 2a 70 50 61 72  eger(Parse *pPar
113e0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
113f0 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e   int negFlag, in
11400 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20  t iMem){.  Vdbe 
11410 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
11420 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  be;.  if( pExpr-
11430 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
11440 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  alue ){.    int 
11450 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61  i = pExpr->u.iVa
11460 6c 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  lue;.    assert(
11470 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28   i>=0 );.    if(
11480 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d   negFlag ) i = -
11490 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  i;.    sqlite3Vd
114a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
114b0 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29  nteger, i, iMem)
114c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
114d0 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76 61  nt c;.    i64 va
114e0 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  lue;.    const c
114f0 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e  har *z = pExpr->
11500 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73  u.zToken;.    as
11510 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20  sert( z!=0 );.  
11520 20 20 63 20 3d 20 73 71 6c 69 74 65 33 41 74 6f    c = sqlite3Ato
11530 69 36 34 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73  i64(z, &value, s
11540 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
11550 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  ), SQLITE_UTF8);
11560 0a 20 20 20 20 69 66 28 20 63 3d 3d 30 20 7c 7c  .    if( c==0 ||
11570 20 28 63 3d 3d 32 20 26 26 20 6e 65 67 46 6c 61   (c==2 && negFla
11580 67 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  g) ){.      char
11590 20 2a 7a 56 3b 0a 20 20 20 20 20 20 69 66 28 20   *zV;.      if( 
115a0 6e 65 67 46 6c 61 67 20 29 7b 20 76 61 6c 75 65  negFlag ){ value
115b0 20 3d 20 63 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45   = c==2 ? SMALLE
115c0 53 54 5f 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75  ST_INT64 : -valu
115d0 65 3b 20 7d 0a 20 20 20 20 20 20 7a 56 20 3d 20  e; }.      zV = 
115e0 64 75 70 38 62 79 74 65 73 28 76 2c 20 28 63 68  dup8bytes(v, (ch
115f0 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20 20  ar*)&value);.   
11600 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11610 64 4f 70 34 28 76 2c 20 4f 50 5f 49 6e 74 36 34  dOp4(v, OP_Int64
11620 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56  , 0, iMem, 0, zV
11630 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20  , P4_INT64);.   
11640 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53   }else{.#ifdef S
11650 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
11660 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20  ING_POINT.      
11670 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
11680 70 50 61 72 73 65 2c 20 22 6f 76 65 72 73 69 7a  pParse, "oversiz
11690 65 64 20 69 6e 74 65 67 65 72 3a 20 25 73 25 73  ed integer: %s%s
116a0 22 2c 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22  ", negFlag ? "-"
116b0 20 3a 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65   : "", z);.#else
116c0 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28  .      codeReal(
116d0 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69  v, z, negFlag, i
116e0 4d 65 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Mem);.#endif.   
116f0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
11700 43 6c 65 61 72 20 61 20 63 61 63 68 65 20 65 6e  Clear a cache en
11710 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  try..*/.static v
11720 6f 69 64 20 63 61 63 68 65 45 6e 74 72 79 43 6c  oid cacheEntryCl
11730 65 61 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ear(Parse *pPars
11740 65 2c 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  e, struct yColCa
11750 63 68 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  che *p){.  if( p
11760 2d 3e 74 65 6d 70 52 65 67 20 29 7b 0a 20 20 20  ->tempReg ){.   
11770 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65   if( pParse->nTe
11780 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28  mpReg<ArraySize(
11790 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
117a0 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  ) ){.      pPars
117b0 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72  e->aTempReg[pPar
117c0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20  se->nTempReg++] 
117d0 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d  = p->iReg;.    }
117e0 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20  .    p->tempReg 
117f0 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  = 0;.  }.}.../*.
11800 2a 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65  ** Record in the
11810 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 74 68   column cache th
11820 61 74 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  at a particular 
11830 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a  column from a.**
11840 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c   particular tabl
11850 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  e is stored in a
11860 20 70 61 72 74 69 63 75 6c 61 72 20 72 65 67 69   particular regi
11870 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ster..*/.void sq
11880 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
11890 6f 72 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ore(Parse *pPars
118a0 65 2c 20 69 6e 74 20 69 54 61 62 2c 20 69 6e 74  e, int iTab, int
118b0 20 69 43 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29   iCol, int iReg)
118c0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
118d0 20 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69   minLru;.  int i
118e0 64 78 4c 72 75 3b 0a 20 20 73 74 72 75 63 74 20  dxLru;.  struct 
118f0 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20  yColCache *p;.. 
11900 20 61 73 73 65 72 74 28 20 69 52 65 67 3e 30 20   assert( iReg>0 
11910 29 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  );  /* Register 
11920 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 77 61  numbers are alwa
11930 79 73 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20  ys positive */. 
11940 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d   assert( iCol>=-
11950 31 20 26 26 20 69 43 6f 6c 3c 33 32 37 36 38 20  1 && iCol<32768 
11960 29 3b 20 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f  );  /* Finite co
11970 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a  lumn numbers */.
11980 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54 45  .  /* The SQLITE
11990 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20 66 6c 61  _ColumnCache fla
119a0 67 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 63  g disables the c
119b0 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 20 20 54 68  olumn cache.  Th
119c0 69 73 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20  is is used.  ** 
119d0 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79  for testing only
119e0 20 2d 20 74 6f 20 76 65 72 69 66 79 20 74 68 61   - to verify tha
119f0 74 20 53 51 4c 69 74 65 20 61 6c 77 61 79 73 20  t SQLite always 
11a00 67 65 74 73 20 74 68 65 20 73 61 6d 65 20 61 6e  gets the same an
11a10 73 77 65 72 0a 20 20 2a 2a 20 77 69 74 68 20 61  swer.  ** with a
11a20 6e 64 20 77 69 74 68 6f 75 74 20 74 68 65 20 63  nd without the c
11a30 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a  olumn cache..  *
11a40 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  /.  if( Optimiza
11a50 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 70 50 61  tionDisabled(pPa
11a60 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  rse->db, SQLITE_
11a70 43 6f 6c 75 6d 6e 43 61 63 68 65 29 20 29 20 72  ColumnCache) ) r
11a80 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72  eturn;..  /* Fir
11a90 73 74 20 72 65 70 6c 61 63 65 20 61 6e 79 20 65  st replace any e
11aa0 78 69 73 74 69 6e 67 20 65 6e 74 72 79 2e 0a 20  xisting entry.. 
11ab0 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c   **.  ** Actuall
11ac0 79 2c 20 74 68 65 20 77 61 79 20 74 68 65 20 63  y, the way the c
11ad0 6f 6c 75 6d 6e 20 63 61 63 68 65 20 69 73 20 63  olumn cache is c
11ae0 75 72 72 65 6e 74 6c 79 20 75 73 65 64 2c 20 77  urrently used, w
11af0 65 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  e are guaranteed
11b00 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f  .  ** that the o
11b10 62 6a 65 63 74 20 77 69 6c 6c 20 6e 65 76 65 72  bject will never
11b20 20 61 6c 72 65 61 64 79 20 62 65 20 69 6e 20 63   already be in c
11b30 61 63 68 65 2e 20 20 56 65 72 69 66 79 20 74 68  ache.  Verify th
11b40 69 73 20 67 75 61 72 61 6e 74 65 65 2e 0a 20 20  is guarantee..  
11b50 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
11b60 47 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  G.  for(i=0, p=p
11b70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
11b80 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
11b90 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
11ba0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
11bb0 3e 69 52 65 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69  >iReg==0 || p->i
11bc0 54 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 70  Table!=iTab || p
11bd0 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20  ->iColumn!=iCol 
11be0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
11bf0 20 2f 2a 20 46 69 6e 64 20 61 6e 20 65 6d 70 74   /* Find an empt
11c00 79 20 73 6c 6f 74 20 61 6e 64 20 72 65 70 6c 61  y slot and repla
11c10 63 65 20 69 74 20 2a 2f 0a 20 20 66 6f 72 28 69  ce it */.  for(i
11c20 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
11c30 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
11c40 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
11c50 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
11c60 20 70 2d 3e 69 52 65 67 3d 3d 30 20 29 7b 0a 20   p->iReg==0 ){. 
11c70 20 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d       p->iLevel =
11c80 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
11c90 65 76 65 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69  evel;.      p->i
11ca0 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20  Table = iTab;.  
11cb0 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d      p->iColumn =
11cc0 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e   iCol;.      p->
11cd0 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20  iReg = iReg;.   
11ce0 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
11cf0 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20  0;.      p->lru 
11d00 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
11d10 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74  Cnt++;.      ret
11d20 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  urn;.    }.  }..
11d30 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68 65    /* Replace the
11d40 20 6c 61 73 74 20 72 65 63 65 6e 74 6c 79 20 75   last recently u
11d50 73 65 64 20 2a 2f 0a 20 20 6d 69 6e 4c 72 75 20  sed */.  minLru 
11d60 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20  = 0x7fffffff;.  
11d70 69 64 78 4c 72 75 20 3d 20 2d 31 3b 0a 20 20 66  idxLru = -1;.  f
11d80 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
11d90 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
11da0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
11db0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
11dc0 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c   if( p->lru<minL
11dd0 72 75 20 29 7b 0a 20 20 20 20 20 20 69 64 78 4c  ru ){.      idxL
11de0 72 75 20 3d 20 69 3b 0a 20 20 20 20 20 20 6d 69  ru = i;.      mi
11df0 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20  nLru = p->lru;. 
11e00 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 41     }.  }.  if( A
11e10 4c 57 41 59 53 28 69 64 78 4c 72 75 3e 3d 30 29  LWAYS(idxLru>=0)
11e20 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61   ){.    p = &pPa
11e30 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69  rse->aColCache[i
11e40 64 78 4c 72 75 5d 3b 0a 20 20 20 20 70 2d 3e 69  dxLru];.    p->i
11e50 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e  Level = pParse->
11e60 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20  iCacheLevel;.   
11e70 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61   p->iTable = iTa
11e80 62 3b 0a 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d  b;.    p->iColum
11e90 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 2d  n = iCol;.    p-
11ea0 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20  >iReg = iReg;.  
11eb0 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
11ec0 3b 0a 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70  ;.    p->lru = p
11ed0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74  Parse->iCacheCnt
11ee0 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
11ef0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64    }.}../*.** Ind
11f00 69 63 61 74 65 20 74 68 61 74 20 72 65 67 69 73  icate that regis
11f10 74 65 72 73 20 62 65 74 77 65 65 6e 20 69 52 65  ters between iRe
11f20 67 2e 2e 69 52 65 67 2b 6e 52 65 67 2d 31 20 61  g..iReg+nReg-1 a
11f30 72 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69  re being overwri
11f40 74 74 65 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74  tten..** Purge t
11f50 68 65 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69  he range of regi
11f60 73 74 65 72 73 20 66 72 6f 6d 20 74 68 65 20 63  sters from the c
11f70 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a  olumn cache..*/.
11f80 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
11f90 43 61 63 68 65 52 65 6d 6f 76 65 28 50 61 72 73  CacheRemove(Pars
11fa0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
11fb0 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  Reg, int nReg){.
11fc0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69    int i;.  int i
11fd0 4c 61 73 74 20 3d 20 69 52 65 67 20 2b 20 6e 52  Last = iReg + nR
11fe0 65 67 20 2d 20 31 3b 0a 20 20 73 74 72 75 63 74  eg - 1;.  struct
11ff0 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
12000 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
12010 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
12020 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
12030 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
12040 20 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52     int r = p->iR
12050 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69  eg;.    if( r>=i
12060 52 65 67 20 26 26 20 72 3c 3d 69 4c 61 73 74 20  Reg && r<=iLast 
12070 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e  ){.      cacheEn
12080 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c  tryClear(pParse,
12090 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52   p);.      p->iR
120a0 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  eg = 0;.    }.  
120b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d  }.}../*.** Remem
120c0 62 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ber the current 
120d0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e  column cache con
120e0 74 65 78 74 2e 20 20 41 6e 79 20 6e 65 77 20 65  text.  Any new e
120f0 6e 74 72 69 65 73 20 61 64 64 65 64 0a 2a 2a 20  ntries added.** 
12100 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 6f 6c  added to the col
12110 75 6d 6e 20 63 61 63 68 65 20 61 66 74 65 72 20  umn cache after 
12120 74 68 69 73 20 63 61 6c 6c 20 61 72 65 20 72 65  this call are re
12130 6d 6f 76 65 64 20 77 68 65 6e 20 74 68 65 0a 2a  moved when the.*
12140 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
12150 70 6f 70 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76  pop occurs..*/.v
12160 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
12170 61 63 68 65 50 75 73 68 28 50 61 72 73 65 20 2a  achePush(Parse *
12180 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73  pParse){.  pPars
12190 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b  e->iCacheLevel++
121a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
121b0 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d  e from the colum
121c0 6e 20 63 61 63 68 65 20 61 6e 79 20 65 6e 74 72  n cache any entr
121d0 69 65 73 20 74 68 61 74 20 77 65 72 65 20 61 64  ies that were ad
121e0 64 65 64 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a  ded since the.**
121f0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 4e 20   the previous N 
12200 50 75 73 68 20 6f 70 65 72 61 74 69 6f 6e 73 2e  Push operations.
12210 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
12220 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 61  , restore the ca
12230 63 68 65 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74  che.** to the st
12240 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 4e 20  ate it was in N 
12250 50 75 73 68 65 73 20 61 67 6f 2e 0a 2a 2f 0a 76  Pushes ago..*/.v
12260 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
12270 61 63 68 65 50 6f 70 28 50 61 72 73 65 20 2a 70  achePop(Parse *p
12280 50 61 72 73 65 2c 20 69 6e 74 20 4e 29 7b 0a 20  Parse, int N){. 
12290 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
122a0 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
122b0 20 61 73 73 65 72 74 28 20 4e 3e 30 20 29 3b 0a   assert( N>0 );.
122c0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
122d0 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e 3d 4e  ->iCacheLevel>=N
122e0 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43   );.  pParse->iC
122f0 61 63 68 65 4c 65 76 65 6c 20 2d 3d 20 4e 3b 0a  acheLevel -= N;.
12300 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
12310 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
12320 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
12330 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
12340 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20      if( p->iReg 
12350 26 26 20 70 2d 3e 69 4c 65 76 65 6c 3e 70 50 61  && p->iLevel>pPa
12360 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
12370 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45   ){.      cacheE
12380 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65  ntryClear(pParse
12390 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69  , p);.      p->i
123a0 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
123b0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e   }.}../*.** When
123c0 20 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e   a cached column
123d0 20 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65   is reused, make
123e0 20 73 75 72 65 20 74 68 61 74 20 69 74 73 20 72   sure that its r
123f0 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f  egister is.** no
12400 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c   longer availabl
12410 65 20 61 73 20 61 20 74 65 6d 70 20 72 65 67 69  e as a temp regi
12420 73 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33  ster.  ticket #3
12430 38 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a  879:  that same.
12440 2a 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67 68  ** register migh
12450 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
12460 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c  e in multiple pl
12470 61 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65  aces, so be sure
12480 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20   to.** get them 
12490 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  all..*/.static v
124a0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
124b0 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28  achePinRegister(
124c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
124d0 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt iReg){.  int 
124e0 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
124f0 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28  Cache *p;.  for(
12500 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
12510 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
12520 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
12530 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
12540 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20  ( p->iReg==iReg 
12550 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70  ){.      p->temp
12560 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
12570 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
12580 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74  rate code to ext
12590 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f  ract the value o
125a0 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  f the iCol-th co
125b0 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e  lumn of a table.
125c0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
125d0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
125e0 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65  nOfTable(.  Vdbe
125f0 20 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *v,        /* T
12600 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f  he VDBE under co
12610 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
12620 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
12630 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e  /* The table con
12640 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75  taining the valu
12650 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43  e */.  int iTabC
12660 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 63 75  ur,    /* The cu
12670 72 73 6f 72 20 66 6f 72 20 74 68 69 73 20 74 61  rsor for this ta
12680 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  ble */.  int iCo
12690 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65  l,       /* Inde
126a0 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  x of the column 
126b0 74 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a 20 20  to extract */.  
126c0 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20 20  int regOut      
126d0 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76  /* Extract the v
126e0 61 6c 75 64 20 69 6e 74 6f 20 74 68 69 73 20 72  alud into this r
126f0 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
12700 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43  if( iCol<0 || iC
12710 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20  ol==pTab->iPKey 
12720 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
12730 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
12740 6f 77 69 64 2c 20 69 54 61 62 43 75 72 2c 20 72  owid, iTabCur, r
12750 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  egOut);.  }else{
12760 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73  .    int op = Is
12770 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20  Virtual(pTab) ? 
12780 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f  OP_VColumn : OP_
12790 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69  Column;.    sqli
127a0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
127b0 20 6f 70 2c 20 69 54 61 62 43 75 72 2c 20 69 43   op, iTabCur, iC
127c0 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  ol, regOut);.  }
127d0 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29  .  if( iCol>=0 )
127e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c  {.    sqlite3Col
127f0 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54  umnDefault(v, pT
12800 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74  ab, iCol, regOut
12810 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
12820 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
12830 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20  at will extract 
12840 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63  the iColumn-th c
12850 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61  olumn from.** ta
12860 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f  ble pTab and sto
12870 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  re the column va
12880 6c 75 65 20 69 6e 20 61 20 72 65 67 69 73 74 65  lue in a registe
12890 72 2e 20 20 41 6e 20 65 66 66 6f 72 74 0a 2a 2a  r.  An effort.**
128a0 20 69 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72   is made to stor
128b0 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  e the column val
128c0 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ue in register i
128d0 52 65 67 2c 20 62 75 74 20 74 68 69 73 20 69 73  Reg, but this is
128e0 0a 2a 2a 20 6e 6f 74 20 67 75 61 72 61 6e 74 65  .** not guarante
128f0 65 64 2e 20 20 54 68 65 20 6c 6f 63 61 74 69 6f  ed.  The locatio
12900 6e 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  n of the column 
12910 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65  value is returne
12920 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  d..**.** There m
12930 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63  ust be an open c
12940 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e  ursor to pTab in
12950 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69   iTable when thi
12960 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
12970 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c  called.  If iCol
12980 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20  umn<0 then code 
12990 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 68 61  is generated tha
129a0 74 20 65 78 74 72 61 63 74 73 20 74 68 65 20 72  t extracts the r
129b0 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  owid..*/.int sql
129c0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
129d0 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a  olumn(.  Parse *
129e0 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72  pParse,   /* Par
129f0 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
12a00 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
12a10 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
12a20 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69  b,     /* Descri
12a30 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62  ption of the tab
12a40 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  le we are readin
12a50 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  g from */.  int 
12a60 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20  iColumn,     /* 
12a70 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62  Index of the tab
12a80 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69  le column */.  i
12a90 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
12aa0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f  /* The cursor po
12ab0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61  inting to the ta
12ac0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ble */.  int iRe
12ad0 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f  g,        /* Sto
12ae0 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  re results here 
12af0 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20 20  */.  u8 p5      
12b00 20 20 20 20 20 20 2f 2a 20 50 35 20 76 61 6c 75        /* P5 valu
12b10 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20  e for OP_Column 
12b20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
12b30 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
12b40 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
12b50 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
12b60 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ..  for(i=0, p=p
12b70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
12b80 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
12b90 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
12ba0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
12bb0 67 3e 30 20 26 26 20 70 2d 3e 69 54 61 62 6c 65  g>0 && p->iTable
12bc0 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 2d 3e 69  ==iTable && p->i
12bd0 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20  Column==iColumn 
12be0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20  ){.      p->lru 
12bf0 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
12c00 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  Cnt++;.      sql
12c10 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e  ite3ExprCachePin
12c20 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c  Register(pParse,
12c30 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20 20   p->iReg);.     
12c40 20 72 65 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b   return p->iReg;
12c50 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61  .    }.  }  .  a
12c60 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
12c70 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
12c80 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
12c90 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65  (v, pTab, iTable
12ca0 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29  , iColumn, iReg)
12cb0 3b 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20 20  ;.  if( p5 ){.  
12cc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
12cd0 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20  ngeP5(v, p5);.  
12ce0 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20 20 73 71  }else{   .    sq
12cf0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
12d00 6f 72 65 28 70 50 61 72 73 65 2c 20 69 54 61 62  ore(pParse, iTab
12d10 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65  le, iColumn, iRe
12d20 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
12d30 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iReg;.}../*.** 
12d40 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e  Clear all column
12d50 20 63 61 63 68 65 20 65 6e 74 72 69 65 73 2e 0a   cache entries..
12d60 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
12d70 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 50 61  xprCacheClear(Pa
12d80 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
12d90 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
12da0 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20  yColCache *p;.. 
12db0 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
12dc0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
12dd0 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
12de0 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
12df0 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20 29     if( p->iReg )
12e00 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74  {.      cacheEnt
12e10 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20  ryClear(pParse, 
12e20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65  p);.      p->iRe
12e30 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
12e40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64  .}../*.** Record
12e50 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 61   the fact that a
12e60 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67  n affinity chang
12e70 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f  e has occurred o
12e80 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69  n iCount.** regi
12e90 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 77  sters starting w
12ea0 69 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76  ith iStart..*/.v
12eb0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
12ec0 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
12ed0 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
12ee0 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e  , int iStart, in
12ef0 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c  t iCount){.  sql
12f00 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
12f10 6f 76 65 28 70 50 61 72 73 65 2c 20 69 53 74 61  ove(pParse, iSta
12f20 72 74 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a  rt, iCount);.}..
12f30 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
12f40 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74  ode to move cont
12f50 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65  ent from registe
12f60 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d  rs iFrom...iFrom
12f70 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20  +nReg-1.** over 
12f80 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67  to iTo..iTo+nReg
12f90 2d 31 2e 20 4b 65 65 70 20 74 68 65 20 63 6f 6c  -1. Keep the col
12fa0 75 6d 6e 20 63 61 63 68 65 20 75 70 2d 74 6f 2d  umn cache up-to-
12fb0 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  date..*/.void sq
12fc0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
12fd0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
12fe0 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
12ff0 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  iTo, int nReg){.
13000 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
13010 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
13020 20 20 61 73 73 65 72 74 28 20 69 46 72 6f 6d 3e    assert( iFrom>
13030 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72  =iTo+nReg || iFr
13040 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a  om+nReg<=iTo );.
13050 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13060 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op3(pParse->pVdb
13070 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f  e, OP_Move, iFro
13080 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 2d 31 29 3b  m, iTo, nReg-1);
13090 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
130a0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
130b0 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
130c0 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
130d0 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70 2d 3e  .    int x = p->
130e0 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 78 3e  iReg;.    if( x>
130f0 3d 69 46 72 6f 6d 20 26 26 20 78 3c 69 46 72 6f  =iFrom && x<iFro
13100 6d 2b 6e 52 65 67 20 29 7b 0a 20 20 20 20 20 20  m+nReg ){.      
13110 70 2d 3e 69 52 65 67 20 2b 3d 20 69 54 6f 2d 69  p->iReg += iTo-i
13120 46 72 6f 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  From;.    }.  }.
13130 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
13140 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
13150 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43  defined(SQLITE_C
13160 4f 56 45 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a  OVERAGE_TEST)./*
13170 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
13180 69 66 20 61 6e 79 20 72 65 67 69 73 74 65 72 20  if any register 
13190 69 6e 20 74 68 65 20 72 61 6e 67 65 20 69 46 72  in the range iFr
131a0 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69  om..iTo (inclusi
131b0 76 65 29 0a 2a 2a 20 69 73 20 75 73 65 64 20 61  ve).** is used a
131c0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f  s part of the co
131d0 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  lumn cache..**.*
131e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
131f0 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 73  s used within as
13200 73 65 72 74 28 29 20 61 6e 64 20 74 65 73 74 63  sert() and testc
13210 61 73 65 28 29 20 6d 61 63 72 6f 73 20 6f 6e 6c  ase() macros onl
13220 79 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f  y.** and does no
13230 74 20 61 70 70 65 61 72 20 69 6e 20 61 20 6e 6f  t appear in a no
13240 72 6d 61 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73  rmal build..*/.s
13250 74 61 74 69 63 20 69 6e 74 20 75 73 65 64 41 73  tatic int usedAs
13260 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73  ColumnCache(Pars
13270 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
13280 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a  From, int iTo){.
13290 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
132a0 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
132b0 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
132c0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
132d0 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
132e0 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
132f0 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69      int r = p->i
13300 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d  Reg;.    if( r>=
13310 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20  iFrom && r<=iTo 
13320 29 20 72 65 74 75 72 6e 20 31 3b 20 20 20 20 2f  ) return 1;    /
13330 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a 20  *NO_TEST*/.  }. 
13340 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
13350 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
13360 42 55 47 20 7c 7c 20 53 51 4c 49 54 45 5f 43 4f  BUG || SQLITE_CO
13370 56 45 52 41 47 45 5f 54 45 53 54 20 2a 2f 0a 0a  VERAGE_TEST */..
13380 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
13390 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72  ode into the cur
133a0 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61  rent Vdbe to eva
133b0 6c 75 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a  luate the given.
133c0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ** expression.  
133d0 41 74 74 65 6d 70 74 20 74 6f 20 73 74 6f 72 65  Attempt to store
133e0 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
133f0 72 65 67 69 73 74 65 72 20 22 74 61 72 67 65 74  register "target
13400 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  "..** Return the
13410 20 72 65 67 69 73 74 65 72 20 77 68 65 72 65 20   register where 
13420 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
13430 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74  ed..**.** With t
13440 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
13450 72 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e 74  re is no guarant
13460 65 65 20 74 68 61 74 20 72 65 73 75 6c 74 73 20  ee that results 
13470 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65  will.** be store
13480 64 20 69 6e 20 74 61 72 67 65 74 2e 20 20 54 68  d in target.  Th
13490 65 20 72 65 73 75 6c 74 20 6d 69 67 68 74 20 62  e result might b
134a0 65 20 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65  e stored in some
134b0 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69 73 74   other.** regist
134c0 65 72 20 69 66 20 69 74 20 69 73 20 63 6f 6e 76  er if it is conv
134d0 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e  enient to do so.
134e0 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75    The calling fu
134f0 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63  nction.** must c
13500 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20  heck the return 
13510 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20 74 68  code and move th
13520 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65  e results to the
13530 20 64 65 73 69 72 65 64 0a 2a 2a 20 72 65 67 69   desired.** regi
13540 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ster..*/.int sql
13550 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
13560 65 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  et(Parse *pParse
13570 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
13580 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64  nt target){.  Vd
13590 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
135a0 70 56 64 62 65 3b 20 20 2f 2a 20 54 68 65 20 56  pVdbe;  /* The V
135b0 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  M under construc
135c0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tion */.  int op
135d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
135e0 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64      /* The opcod
135f0 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  e being coded */
13600 0a 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 74  .  int inReg = t
13610 61 72 67 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  arget;       /* 
13620 52 65 73 75 6c 74 73 20 73 74 6f 72 65 64 20 69  Results stored i
13630 6e 20 72 65 67 69 73 74 65 72 20 69 6e 52 65 67  n register inReg
13640 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65   */.  int regFre
13650 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  e1 = 0;         
13660 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66  /* If non-zero f
13670 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61  ree this tempora
13680 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  ry register */. 
13690 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20   int regFree2 = 
136a0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  0;         /* If
136b0 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74   non-zero free t
136c0 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65  his temporary re
136d0 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
136e0 72 31 2c 20 72 32 2c 20 72 33 2c 20 72 34 3b 20  r1, r2, r3, r4; 
136f0 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73        /* Various
13700 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
13710 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
13720 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
13730 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
13740 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a   connection */..
13750 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
13760 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50  >0 && target<=pP
13770 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  arse->nMem );.  
13780 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
13790 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
137a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
137b0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   );.    return 0
137c0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 78  ;.  }..  if( pEx
137d0 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20  pr==0 ){.    op 
137e0 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  = TK_NULL;.  }el
137f0 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78  se{.    op = pEx
13800 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77  pr->op;.  }.  sw
13810 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
13820 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
13830 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49  MN: {.      AggI
13840 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20  nfo *pAggInfo = 
13850 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b  pExpr->pAggInfo;
13860 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67  .      struct Ag
13870 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20  gInfo_col *pCol 
13880 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  = &pAggInfo->aCo
13890 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a  l[pExpr->iAgg];.
138a0 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67 49        if( !pAggI
138b0 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
138c0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
138d0 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20  t( pCol->iMem>0 
138e0 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
138f0 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20   = pCol->iMem;. 
13900 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13910 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41      }else if( pA
13920 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69  ggInfo->useSorti
13930 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20  ngIdx ){.       
13940 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13950 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
13960 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69   pAggInfo->sorti
13970 6e 67 49 64 78 50 54 61 62 2c 0a 20 20 20 20 20  ngIdxPTab,.     
13980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13990 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
139a0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61  SorterColumn, ta
139b0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62  rget);.        b
139c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
139d0 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65      /* Otherwise
139e0 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f  , fall thru into
139f0 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63   the TK_COLUMN c
13a00 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ase */.    }.   
13a10 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
13a20 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
13a30 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a  pr->iTable<0 ){.
13a40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
13a50 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
13a60 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b 20 63  n coding check c
13a70 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
13a80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
13a90 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30 20 29  arse->ckBase>0 )
13aa0 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  ;.        inReg 
13ab0 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
13ac0 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73   + pParse->ckBas
13ad0 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
13ae0 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
13af0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
13b00 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
13b10 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20   pExpr->pTab,.  
13b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
13b40 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70  Expr->iColumn, p
13b50 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61  Expr->iTable, ta
13b60 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  rget,.          
13b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b80 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
13b90 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
13ba0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
13bb0 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
13bc0 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65  ER: {.      code
13bd0 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20  Integer(pParse, 
13be0 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74  pExpr, 0, target
13bf0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
13c00 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
13c10 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
13c20 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73  NG_POINT.    cas
13c30 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
13c40 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
13c50 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
13c60 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
13c70 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 52 65   );.      codeRe
13c80 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  al(v, pExpr->u.z
13c90 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72 67 65 74  Token, 0, target
13ca0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
13cb0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
13cc0 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
13cd0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
13ce0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
13cf0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
13d00 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 73  alue) );.      s
13d10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
13d20 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
13d30 30 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 70 45  0, target, 0, pE
13d40 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
13d50 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
13d60 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
13d70 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  K_NULL: {.      
13d80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13d90 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
13da0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
13db0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
13dc0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13dd0 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20  _BLOB_LITERAL.  
13de0 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20    case TK_BLOB: 
13df0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  {.      int n;. 
13e00 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
13e10 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  *z;.      char *
13e20 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73  zBlob;.      ass
13e30 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
13e40 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
13e50 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
13e60 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
13e70 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
13e80 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a  x' || pExpr->u.z
13e90 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b  Token[0]=='X' );
13ea0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13eb0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  Expr->u.zToken[1
13ec0 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20  ]=='\'' );.     
13ed0 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a   z = &pExpr->u.z
13ee0 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20  Token[2];.      
13ef0 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
13f00 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20  n30(z) - 1;.    
13f10 20 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d    assert( z[n]==
13f20 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 42  '\'' );.      zB
13f30 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78  lob = sqlite3Hex
13f40 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64  ToBlob(sqlite3Vd
13f50 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a  beDb(v), z, n);.
13f60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13f70 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c  eAddOp4(v, OP_Bl
13f80 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c  ob, n/2, target,
13f90 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59   0, zBlob, P4_DY
13fa0 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 62 72  NAMIC);.      br
13fb0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
13fc0 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41  f.    case TK_VA
13fd0 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20  RIABLE: {.      
13fe0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
13ff0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
14000 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
14010 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
14020 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30  xpr->u.zToken!=0
14030 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14040 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
14050 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20  n[0]!=0 );.     
14060 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14070 70 32 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c  p2(v, OP_Variabl
14080 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  e, pExpr->iColum
14090 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  n, target);.    
140a0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a    if( pExpr->u.z
140b0 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20  Token[1]!=0 ){. 
140c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
140d0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
140e0 5d 3d 3d 27 3f 27 20 0a 20 20 20 20 20 20 20 20  ]=='?' .        
140f0 20 20 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 70       || strcmp(p
14100 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
14110 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45  pParse->azVar[pE
14120 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 29  xpr->iColumn-1])
14130 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ==0 );.        s
14140 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
14150 50 34 28 76 2c 20 2d 31 2c 20 70 50 61 72 73 65  P4(v, -1, pParse
14160 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69  ->azVar[pExpr->i
14170 43 6f 6c 75 6d 6e 2d 31 5d 2c 20 50 34 5f 53 54  Column-1], P4_ST
14180 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ATIC);.      }. 
14190 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
141a0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  }.    case TK_RE
141b0 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  GISTER: {.      
141c0 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69  inReg = pExpr->i
141d0 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 62 72 65  Table;.      bre
141e0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
141f0 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20  se TK_AS: {.    
14200 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
14210 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
14220 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
14230 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  Left, target);. 
14240 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14250 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
14260 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63  _OMIT_CAST.    c
14270 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20  ase TK_CAST: {. 
14280 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
14290 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  ons of the form:
142a0 20 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53     CAST(pLeft AS
142b0 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20   token) */.     
142c0 20 69 6e 74 20 61 66 66 2c 20 74 6f 5f 6f 70 3b   int aff, to_op;
142d0 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
142e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
142f0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
14300 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
14310 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
14320 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
14330 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
14340 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
14350 61 66 66 20 3d 20 73 71 6c 69 74 65 33 41 66 66  aff = sqlite3Aff
14360 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72 2d  inityType(pExpr-
14370 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
14380 20 20 74 6f 5f 6f 70 20 3d 20 61 66 66 20 2d 20    to_op = aff - 
14390 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
143a0 2b 20 4f 50 5f 54 6f 54 65 78 74 3b 0a 20 20 20  + OP_ToText;.   
143b0 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70     assert( to_op
143c0 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 20 20 20 7c  ==OP_ToText    |
143d0 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46  | aff!=SQLITE_AF
143e0 46 5f 54 45 58 54 20 20 20 20 29 3b 0a 20 20 20  F_TEXT    );.   
143f0 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70     assert( to_op
14400 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 20 20 20 7c  ==OP_ToBlob    |
14410 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46  | aff!=SQLITE_AF
14420 46 5f 4e 4f 4e 45 20 20 20 20 29 3b 0a 20 20 20  F_NONE    );.   
14430 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70     assert( to_op
14440 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20 7c  ==OP_ToNumeric |
14450 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46  | aff!=SQLITE_AF
14460 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20  F_NUMERIC );.   
14470 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70     assert( to_op
14480 3d 3d 4f 50 5f 54 6f 49 6e 74 20 20 20 20 20 7c  ==OP_ToInt     |
14490 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46  | aff!=SQLITE_AF
144a0 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20  F_INTEGER );.   
144b0 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70     assert( to_op
144c0 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 20 20 20 7c  ==OP_ToReal    |
144d0 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46  | aff!=SQLITE_AF
144e0 46 5f 52 45 41 4c 20 20 20 20 29 3b 0a 20 20 20  F_REAL    );.   
144f0 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f     testcase( to_
14500 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 29 3b  op==OP_ToText );
14510 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14520 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f   to_op==OP_ToBlo
14530 62 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  b );.      testc
14540 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ase( to_op==OP_T
14550 6f 4e 75 6d 65 72 69 63 20 29 3b 0a 20 20 20 20  oNumeric );.    
14560 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f    testcase( to_o
14570 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 29 3b 0a 20  p==OP_ToInt );. 
14580 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74       testcase( t
14590 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20  o_op==OP_ToReal 
145a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52  );.      if( inR
145b0 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20  eg!=target ){.  
145c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
145d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
145e0 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  opy, inReg, targ
145f0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52  et);.        inR
14600 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
14610 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
14620 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
14630 74 6f 5f 6f 70 2c 20 69 6e 52 65 67 29 3b 0a 20  to_op, inReg);. 
14640 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 75       testcase( u
14650 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65  sedAsColumnCache
14660 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20  (pParse, inReg, 
14670 69 6e 52 65 67 29 20 29 3b 0a 20 20 20 20 20 20  inReg) );.      
14680 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
14690 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
146a0 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 31 29  Parse, inReg, 1)
146b0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
146c0 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
146d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20  QLITE_OMIT_CAST 
146e0 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  */.    case TK_L
146f0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
14700 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
14710 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
14720 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
14730 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
14740 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  Q: {.      asser
14750 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20  t( TK_LT==OP_Lt 
14760 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14770 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b   TK_LE==OP_Le );
14780 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
14790 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  K_GT==OP_Gt );. 
147a0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
147b0 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20  GE==OP_Ge );.   
147c0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51     assert( TK_EQ
147d0 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20  ==OP_Eq );.     
147e0 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d   assert( TK_NE==
147f0 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 74  OP_Ne );.      t
14800 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
14810 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LT );.      test
14820 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20  case( op==TK_LE 
14830 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14840 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a  e( op==TK_GT );.
14850 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14860 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20  op==TK_GE );.   
14870 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14880 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20  =TK_EQ );.      
14890 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
148a0 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 72 31 20  _NE );.      r1 
148b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
148c0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
148d0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
148e0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
148f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
14900 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
14910 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
14920 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
14930 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
14940 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
14950 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
14960 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
14970 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69         r1, r2, i
14980 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f  nReg, SQLITE_STO
14990 52 45 50 32 29 3b 0a 20 20 20 20 20 20 74 65 73  REP2);.      tes
149a0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
149b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
149c0 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
149d0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
149e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
149f0 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65   TK_IS:.    case
14a00 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20   TK_ISNOT: {.   
14a10 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14a20 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
14a30 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
14a40 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  _ISNOT );.      
14a50 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
14a60 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
14a70 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
14a80 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
14a90 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
14aa0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
14ab0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
14ac0 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
14ad0 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f     op = (op==TK_
14ae0 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b  IS) ? TK_EQ : TK
14af0 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  _NE;.      codeC
14b00 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
14b10 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
14b20 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
14b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b40 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c    r1, r2, inReg,
14b50 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20   SQLITE_STOREP2 
14b60 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  | SQLITE_NULLEQ)
14b70 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14b80 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
14b90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14ba0 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
14bb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14bc0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
14bd0 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
14be0 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
14bf0 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  PLUS:.    case T
14c00 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65  K_STAR:.    case
14c10 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63   TK_MINUS:.    c
14c20 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20  ase TK_REM:.    
14c30 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a  case TK_BITAND:.
14c40 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f      case TK_BITO
14c50 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  R:.    case TK_S
14c60 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54  LASH:.    case T
14c70 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61  K_LSHIFT:.    ca
14c80 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20  se TK_RSHIFT: . 
14c90 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41     case TK_CONCA
14ca0 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
14cb0 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e  t( TK_AND==OP_An
14cc0 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
14cd0 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20  t( TK_OR==OP_Or 
14ce0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14cf0 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64   TK_PLUS==OP_Add
14d00 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14d10 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53  ( TK_MINUS==OP_S
14d20 75 62 74 72 61 63 74 20 29 3b 0a 20 20 20 20 20  ubtract );.     
14d30 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d   assert( TK_REM=
14d40 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b  =OP_Remainder );
14d50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
14d60 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74  K_BITAND==OP_Bit
14d70 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  And );.      ass
14d80 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f  ert( TK_BITOR==O
14d90 50 5f 42 69 74 4f 72 20 29 3b 0a 20 20 20 20 20  P_BitOr );.     
14da0 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53   assert( TK_SLAS
14db0 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 0a  H==OP_Divide );.
14dc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14dd0 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66  _LSHIFT==OP_Shif
14de0 74 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 61  tLeft );.      a
14df0 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54  ssert( TK_RSHIFT
14e00 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20  ==OP_ShiftRight 
14e10 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14e20 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43   TK_CONCAT==OP_C
14e30 6f 6e 63 61 74 20 29 3b 0a 20 20 20 20 20 20 74  oncat );.      t
14e40 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
14e50 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73  AND );.      tes
14e60 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52  tcase( op==TK_OR
14e70 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14e80 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20  se( op==TK_PLUS 
14e90 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14ea0 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20  e( op==TK_MINUS 
14eb0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14ec0 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b  e( op==TK_REM );
14ed0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14ee0 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29   op==TK_BITAND )
14ef0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14f00 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29  ( op==TK_BITOR )
14f10 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14f20 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29  ( op==TK_SLASH )
14f30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14f40 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20  ( op==TK_LSHIFT 
14f50 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14f60 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54  e( op==TK_RSHIFT
14f70 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14f80 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41  se( op==TK_CONCA
14f90 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
14fa0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
14fb0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
14fc0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
14fd0 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
14fe0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
14ff0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
15000 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
15010 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71  Free2);.      sq
15020 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
15030 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74  v, op, r2, r1, t
15040 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65  arget);.      te
15050 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
15060 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
15070 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
15080 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
15090 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
150a0 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
150b0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
150c0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
150d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
150e0 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66  Left );.      if
150f0 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
15100 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20  INTEGER ){.     
15110 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70     codeInteger(p
15120 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c  Parse, pLeft, 1,
15130 20 74 61 72 67 65 74 29 3b 0a 23 69 66 6e 64 65   target);.#ifnde
15140 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
15150 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
15160 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65     }else if( pLe
15170 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54  ft->op==TK_FLOAT
15180 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
15190 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
151a0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
151b0 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
151c0 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
151d0 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pLeft->u.zToken,
151e0 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23 65 6e   1, target);.#en
151f0 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  dif.      }else{
15200 0a 20 20 20 20 20 20 20 20 72 65 67 46 72 65 65  .        regFree
15210 31 20 3d 20 72 31 20 3d 20 73 71 6c 69 74 65 33  1 = r1 = sqlite3
15220 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
15230 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
15240 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15250 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
15260 72 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20  r1);.        r2 
15270 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
15280 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
15290 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
152a0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20  Free2);.        
152b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
152c0 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74  3(v, OP_Subtract
152d0 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74  , r2, r1, target
152e0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
152f0 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
15300 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
15310 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74    inReg = target
15320 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
15330 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
15340 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73  _BITNOT:.    cas
15350 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
15360 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
15370 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29  NOT==OP_BitNot )
15380 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15390 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29  TK_NOT==OP_Not )
153a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
153b0 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20  ( op==TK_BITNOT 
153c0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
153d0 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b  e( op==TK_NOT );
153e0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
153f0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
15400 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
15410 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
15420 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
15430 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
15440 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74  .      inReg = t
15450 61 72 67 65 74 3b 0a 20 20 20 20 20 20 73 71 6c  arget;.      sql
15460 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15470 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65 67 29  , op, r1, inReg)
15480 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
15490 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
154a0 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
154b0 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
154c0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
154d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
154e0 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75  _ISNULL==OP_IsNu
154f0 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ll );.      asse
15500 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d  rt( TK_NOTNULL==
15510 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20  OP_NotNull );.  
15520 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
15530 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==TK_ISNULL );. 
15540 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
15550 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b  p==TK_NOTNULL );
15560 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15570 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
15580 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
15590 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  t);.      r1 = s
155a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
155b0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
155c0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
155d0 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e1);.      testc
155e0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
155f0 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d   );.      addr =
15600 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15610 70 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20  p1(v, op, r1);. 
15620 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15630 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
15640 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 2d 31 29  Imm, target, -1)
15650 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
15660 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
15670 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ddr);.      brea
15680 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
15690 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
156a0 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e  N: {.      AggIn
156b0 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70  fo *pInfo = pExp
156c0 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
156d0 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20     if( pInfo==0 
156e0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
156f0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
15700 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
15710 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
15720 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15730 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75  sg(pParse, "misu
15740 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 3a  se of aggregate:
15750 20 25 73 28 29 22 2c 20 70 45 78 70 72 2d 3e 75   %s()", pExpr->u
15760 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
15770 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
15780 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d 3e 61 46  nReg = pInfo->aF
15790 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d  unc[pExpr->iAgg]
157a0 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  .iMem;.      }. 
157b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
157c0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
157d0 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61  NST_FUNC:.    ca
157e0 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
157f0 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
15800 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f   *pFarg;       /
15810 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69  * List of functi
15820 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
15830 20 20 20 20 20 20 69 6e 74 20 6e 46 61 72 67 3b        int nFarg;
15840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15850 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e 63 74 69  Number of functi
15860 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
15870 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
15880 44 65 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Def;         /* 
15890 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66  The function def
158a0 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a  inition object *
158b0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b  /.      int nId;
158c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
158d0 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  * Length of the 
158e0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 69 6e  function name in
158f0 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20   bytes */.      
15900 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b  const char *zId;
15910 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75         /* The fu
15920 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
15930 20 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 4d 61       int constMa
15940 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d  sk = 0;     /* M
15950 61 73 6b 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ask of function 
15960 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74 20 61  arguments that a
15970 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20  re constant */. 
15980 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
15990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
159a0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
159b0 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e       u8 enc = EN
159c0 43 28 64 62 29 3b 20 20 20 20 20 20 2f 2a 20 54  C(db);      /* T
159d0 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  he text encoding
159e0 20 75 73 65 64 20 62 79 20 74 68 69 73 20 64 61   used by this da
159f0 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  tabase */.      
15a00 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
15a10 20 30 3b 20 20 20 20 2f 2a 20 41 20 63 6f 6c 6c   0;    /* A coll
15a20 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a  ating sequence *
15a30 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  /..      assert(
15a40 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
15a50 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
15a60 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
15a70 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
15a80 5f 43 4f 4e 53 54 5f 46 55 4e 43 20 29 3b 0a 20  _CONST_FUNC );. 
15a90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
15aa0 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p==TK_FUNCTION )
15ab0 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
15ac0 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
15ad0 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
15ae0 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ly) ){.        p
15af0 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  Farg = 0;.      
15b00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
15b10 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Farg = pExpr->x.
15b20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pList;.      }. 
15b30 20 20 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61       nFarg = pFa
15b40 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70  rg ? pFarg->nExp
15b50 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73  r : 0;.      ass
15b60 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
15b70 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
15b80 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
15b90 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e     zId = pExpr->
15ba0 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
15bb0 6e 49 64 20 3d 20 73 71 6c 69 74 65 33 53 74 72  nId = sqlite3Str
15bc0 6c 65 6e 33 30 28 7a 49 64 29 3b 0a 20 20 20 20  len30(zId);.    
15bd0 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
15be0 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
15bf0 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 46 61 72 67   zId, nId, nFarg
15c00 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
15c10 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a   if( pDef==0 ){.
15c20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
15c30 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
15c40 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f  "unknown functio
15c50 6e 3a 20 25 2e 2a 73 28 29 22 2c 20 6e 49 64 2c  n: %.*s()", nId,
15c60 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 62   zId);.        b
15c70 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
15c80 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20       /* Attempt 
15c90 61 20 64 69 72 65 63 74 20 69 6d 70 6c 65 6d 65  a direct impleme
15ca0 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62  ntation of the b
15cb0 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53 43 45  uilt-in COALESCE
15cc0 28 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  () and.      ** 
15cd0 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69 6f  IFNULL() functio
15ce0 6e 73 2e 20 20 54 68 69 73 20 61 76 6f 69 64 73  ns.  This avoids
15cf0 20 75 6e 6e 65 63 65 73 73 61 72 79 20 65 76 61   unnecessary eva
15d00 6c 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20  lation of.      
15d10 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  ** arguments pas
15d20 74 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d  t the first non-
15d30 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20  NULL argument.. 
15d40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
15d50 28 20 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20  ( pDef->flags & 
15d60 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c  SQLITE_FUNC_COAL
15d70 45 53 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20  ESCE ){.        
15d80 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20  int endCoalesce 
15d90 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
15da0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
15db0 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67     assert( nFarg
15dc0 3e 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73  >=2 );.        s
15dd0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
15de0 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
15df0 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  0].pExpr, target
15e00 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
15e10 3d 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b  =1; i<nFarg; i++
15e20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
15e30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15e40 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61  , OP_NotNull, ta
15e50 72 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63  rget, endCoalesc
15e60 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
15e70 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
15e80 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 74 61 72  move(pParse, tar
15e90 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  get, 1);.       
15ea0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
15eb0 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
15ec0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
15ed0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
15ee0 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70  e, pFarg->a[i].p
15ef0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
15f00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15f10 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
15f20 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  rse, 1);.       
15f30 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
15f40 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
15f50 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63  el(v, endCoalesc
15f60 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
15f70 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20  k;.      }...   
15f80 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a     if( pFarg ){.
15f90 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
15fa0 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
15fb0 28 70 50 61 72 73 65 2c 20 6e 46 61 72 67 29 3b  (pParse, nFarg);
15fc0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  ..        /* For
15fd0 20 6c 65 6e 67 74 68 28 29 20 61 6e 64 20 74 79   length() and ty
15fe0 70 65 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 73  peof() functions
15ff0 20 77 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61   with a column a
16000 72 67 75 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20  rgument,.       
16010 20 2a 2a 20 73 65 74 20 74 68 65 20 50 35 20 70   ** set the P5 p
16020 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 65 20  arameter to the 
16030 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65  OP_Column opcode
16040 20 74 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54   to OPFLAG_LENGT
16050 48 41 52 47 0a 20 20 20 20 20 20 20 20 2a 2a 20  HARG.        ** 
16060 6f 72 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  or OPFLAG_TYPEOF
16070 41 52 47 20 72 65 73 70 65 63 74 69 76 65 6c 79  ARG respectively
16080 2c 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63  , to avoid unnec
16090 65 73 73 61 72 79 20 64 61 74 61 0a 20 20 20 20  essary data.    
160a0 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a      ** loading..
160b0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
160c0 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 6c     if( (pDef->fl
160d0 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46 55  ags & (SQLITE_FU
160e0 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45  NC_LENGTH|SQLITE
160f0 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d  _FUNC_TYPEOF))!=
16100 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
16110 38 20 65 78 70 72 4f 70 3b 0a 20 20 20 20 20 20  8 exprOp;.      
16120 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72      assert( nFar
16130 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  g==1 );.        
16140 20 20 61 73 73 65 72 74 28 20 70 46 61 72 67 2d    assert( pFarg-
16150 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29  >a[0].pExpr!=0 )
16160 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 72  ;.          expr
16170 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d  Op = pFarg->a[0]
16180 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20  .pExpr->op;.    
16190 20 20 20 20 20 20 69 66 28 20 65 78 70 72 4f 70        if( exprOp
161a0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65  ==TK_COLUMN || e
161b0 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  xprOp==TK_AGG_CO
161c0 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
161d0 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49      assert( SQLI
161e0 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d  TE_FUNC_LENGTH==
161f0 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
16200 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
16210 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46  assert( SQLITE_F
16220 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c  UNC_TYPEOF==OPFL
16230 41 47 5f 54 59 50 45 4f 46 41 52 47 20 29 3b 0a  AG_TYPEOFARG );.
16240 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
16250 63 61 73 65 28 20 70 44 65 66 2d 3e 66 6c 61 67  case( pDef->flag
16260 73 3d 3d 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c  s==SQLITE_FUNC_L
16270 45 4e 47 54 48 20 29 3b 0a 20 20 20 20 20 20 20  ENGTH );.       
16280 20 20 20 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d       pFarg->a[0]
16290 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 70 44  .pExpr->op2 = pD
162a0 65 66 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20  ef->flags;.     
162b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
162c0 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
162d0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
162e0 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 54  Parse);     /* T
162f0 69 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34  icket 2ea2425d34
16300 62 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  be */.        sq
16310 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
16320 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 46  rList(pParse, pF
16330 61 72 67 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20  arg, r1, 1);.   
16340 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
16350 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c  CachePop(pParse,
16360 20 31 29 3b 20 20 20 2f 2a 20 54 69 63 6b 65 74   1);   /* Ticket
16370 20 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f   2ea2425d34be */
16380 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16390 20 20 20 20 20 20 72 31 20 3d 20 30 3b 0a 20 20        r1 = 0;.  
163a0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
163b0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
163c0 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20  LTABLE.      /* 
163d0 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61  Possibly overloa
163e0 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  d the function i
163f0 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  f the first argu
16400 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a  ment is.      **
16410 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
16420 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a   column..      *
16430 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69  *.      ** For i
16440 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28  nfix functions (
16450 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45  LIKE, GLOB, REGE
16460 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75  XP, and MATCH) u
16470 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  se the.      ** 
16480 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
16490 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20   not the first, 
164a0 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  as the argument 
164b0 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20  to test to.     
164c0 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
164d0 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76   a column in a v
164e0 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54  irtual table.  T
164f0 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61  his is done beca
16500 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  use.      ** the
16510 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66   left operand of
16520 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
16530 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65   (the operand we
16540 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a   want to.      *
16550 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f  * control overlo
16560 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61  ading) ends up a
16570 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
16580 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20  ument to the.   
16590 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20     ** function. 
165a0 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
165b0 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71  "A glob B" is eq
165c0 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20  uivalent to .   
165d0 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29     ** "glob(B,A)
165e0 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73  .  We want to us
165f0 65 20 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c  e the A in "A gl
16600 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20  ob B" to test.  
16610 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74      ** for funct
16620 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e  ion overloading.
16630 20 20 42 75 74 20 77 65 20 75 73 65 20 74 68 65    But we use the
16640 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62   B term in "glob
16650 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f  (B,A)"..      */
16660 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67  .      if( nFarg
16670 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d 3e 66  >=2 && (pExpr->f
16680 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69 78 46  lags & EP_InfixF
16690 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  unc) ){.        
166a0 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74  pDef = sqlite3Vt
166b0 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69  abOverloadFuncti
166c0 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61  on(db, pDef, nFa
166d0 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e  rg, pFarg->a[1].
166e0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65  pExpr);.      }e
166f0 6c 73 65 20 69 66 28 20 6e 46 61 72 67 3e 30 20  lse if( nFarg>0 
16700 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
16710 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65  = sqlite3VtabOve
16720 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62  rloadFunction(db
16730 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70  , pDef, nFarg, p
16740 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
16750 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
16760 66 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  f.      for(i=0;
16770 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a   i<nFarg; i++){.
16780 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 33 32          if( i<32
16790 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
167a0 73 43 6f 6e 73 74 61 6e 74 28 70 46 61 72 67 2d  sConstant(pFarg-
167b0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
167c0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d            constM
167d0 61 73 6b 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20  ask |= (1<<i);. 
167e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
167f0 20 69 66 28 20 28 70 44 65 66 2d 3e 66 6c 61 67   if( (pDef->flag
16800 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
16810 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20  NEEDCOLL)!=0 && 
16820 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
16830 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
16840 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
16850 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
16860 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
16870 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
16880 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 6c 61     if( pDef->fla
16890 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
168a0 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20  _NEEDCOLL ){.   
168b0 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
168c0 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
168d0 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20  fltColl; .      
168e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
168f0 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
16900 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  q, 0, 0, 0, (cha
16910 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
16920 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a  LLSEQ);.      }.
16930 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16940 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75  eAddOp4(v, OP_Fu
16950 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73  nction, constMas
16960 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c 0a 20  k, r1, target,. 
16970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16980 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 44         (char*)pD
16990 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  ef, P4_FUNCDEF);
169a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
169b0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75  beChangeP5(v, (u
169c0 38 29 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20  8)nFarg);.      
169d0 69 66 28 20 6e 46 61 72 67 20 29 7b 0a 20 20 20  if( nFarg ){.   
169e0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
169f0 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
16a00 72 73 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b  rse, r1, nFarg);
16a10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
16a20 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
16a30 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16a40 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
16a50 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20  e TK_EXISTS:.   
16a60 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
16a70 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
16a80 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  e( op==TK_EXISTS
16a90 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
16aa0 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  se( op==TK_SELEC
16ab0 54 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67  T );.      inReg
16ac0 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75   = sqlite3CodeSu
16ad0 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
16ae0 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20  pExpr, 0, 0);.  
16af0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16b00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
16b10 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73   {.      int des
16b20 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74  tIfFalse = sqlit
16b30 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
16b40 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  v);.      int de
16b50 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  stIfNull = sqlit
16b60 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
16b70 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
16b80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16b90 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
16ba0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
16bb0 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
16bc0 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49  se, pExpr, destI
16bd0 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75  fFalse, destIfNu
16be0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
16bf0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16c00 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
16c10 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
16c20 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
16c30 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46  Label(v, destIfF
16c40 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  alse);.      sql
16c50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16c60 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72  , OP_AddImm, tar
16c70 67 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  get, 0);.      s
16c80 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
16c90 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
16ca0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
16cb0 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
16cc0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
16cd0 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20  SUBQUERY */...  
16ce0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78    /*.    **    x
16cf0 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
16d00 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
16d10 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e  his is equivalen
16d20 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t to.    **.    
16d30 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78  **    x>=y AND x
16d40 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  <=z.    **.    *
16d50 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * X is stored in
16d60 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20   pExpr->pLeft.. 
16d70 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65     ** Y is store
16d80 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  d in pExpr->pLis
16d90 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20  t->a[0].pExpr.. 
16da0 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65     ** Z is store
16db0 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  d in pExpr->pLis
16dc0 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20  t->a[1].pExpr.. 
16dd0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
16de0 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
16df0 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
16e00 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
16e10 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
16e20 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65  List_item *pLIte
16e30 6d 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  m = pExpr->x.pLi
16e40 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78 70  st->a;.      Exp
16e50 72 20 2a 70 52 69 67 68 74 20 3d 20 70 4c 49 74  r *pRight = pLIt
16e60 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20  em->pExpr;..    
16e70 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
16e80 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
16e90 65 2c 20 70 4c 65 66 74 2c 20 26 72 65 67 46 72  e, pLeft, &regFr
16ea0 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
16eb0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16ec0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69  Temp(pParse, pRi
16ed0 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
16ee0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16ef0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
16f00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16f10 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
16f20 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65       r3 = sqlite
16f30 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
16f40 73 65 29 3b 0a 20 20 20 20 20 20 72 34 20 3d 20  se);.      r4 = 
16f50 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
16f60 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
16f70 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
16f80 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
16f90 68 74 2c 20 4f 50 5f 47 65 2c 0a 20 20 20 20 20  ht, OP_Ge,.     
16fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
16fb0 20 72 32 2c 20 72 33 2c 20 53 51 4c 49 54 45 5f   r2, r3, SQLITE_
16fc0 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20  STOREP2);.      
16fd0 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  pLItem++;.      
16fe0 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d  pRight = pLItem-
16ff0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >pExpr;.      sq
17000 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
17010 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
17020 72 65 65 32 29 3b 0a 20 20 20 20 20 20 72 32 20  ree2);.      r2 
17030 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
17040 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52  eTemp(pParse, pR
17050 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
17060 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
17070 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
17080 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
17090 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
170a0 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c  , pRight, OP_Le,
170b0 20 72 31 2c 20 72 32 2c 20 72 34 2c 20 53 51 4c   r1, r2, r4, SQL
170c0 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20  ITE_STOREP2);.  
170d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
170e0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 6e 64 2c  ddOp3(v, OP_And,
170f0 20 72 33 2c 20 72 34 2c 20 74 61 72 67 65 74 29   r3, r4, target)
17100 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
17110 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
17120 61 72 73 65 2c 20 72 33 29 3b 0a 20 20 20 20 20  arse, r3);.     
17130 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
17140 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
17150 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
17160 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
17170 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20 20 20  TK_COLLATE: .   
17180 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
17190 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  {.      inReg = 
171a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
171b0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
171c0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67  xpr->pLeft, targ
171d0 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
171e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
171f0 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a  e TK_TRIGGER: {.
17200 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
17210 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52 49  opcode is TK_TRI
17220 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20 65  GGER, then the e
17230 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 72  xpression is a r
17240 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a  eference.      *
17250 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  * to a column in
17260 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c   the new.* or ol
17270 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  d.* pseudo-table
17280 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20  s available to. 
17290 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20       ** trigger 
172a0 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68 69  programs. In thi
172b0 73 20 63 61 73 65 20 45 78 70 72 2e 69 54 61 62  s case Expr.iTab
172c0 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31 20 66  le is set to 1 f
172d0 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  or the.      ** 
172e0 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  new.* pseudo-tab
172f0 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65  le, or 0 for the
17300 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61   old.* pseudo-ta
17310 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d  ble. Expr.iColum
17320 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65  n.      ** is se
17330 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t to the column 
17340 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61  of the pseudo-ta
17350 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72 20  ble to read, or 
17360 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a  to -1 to.      *
17370 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77 69 64  * read the rowid
17380 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2a   field..      **
17390 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65 78  .      ** The ex
173a0 70 72 65 73 73 69 6f 6e 20 69 73 20 69 6d 70 6c  pression is impl
173b0 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61 6e  emented using an
173c0 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65   OP_Param opcode
173d0 2e 20 54 68 65 20 70 31 0a 20 20 20 20 20 20 2a  . The p1.      *
173e0 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73  * parameter is s
173f0 65 74 20 74 6f 20 30 20 66 6f 72 20 61 6e 20 6f  et to 0 for an o
17400 6c 64 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e  ld.rowid referen
17410 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29 0a  ce, or to (i+1).
17420 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 66 65        ** to refe
17430 72 65 6e 63 65 20 61 6e 6f 74 68 65 72 20 63 6f  rence another co
17440 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64 2e  lumn of the old.
17450 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20  * pseudo-table, 
17460 77 68 65 72 65 20 0a 20 20 20 20 20 20 2a 2a 20  where .      ** 
17470 69 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  i is the index o
17480 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f  f the column. Fo
17490 72 20 61 20 6e 65 77 2e 72 6f 77 69 64 20 72 65  r a new.rowid re
174a0 66 65 72 65 6e 63 65 2c 20 70 31 20 69 73 0a 20  ference, p1 is. 
174b0 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 28       ** set to (
174c0 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e 20 69 73  n+1), where n is
174d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
174e0 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68 20 70  olumns in each p
174f0 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20 20  seudo-table..   
17500 20 20 20 2a 2a 20 46 6f 72 20 61 20 72 65 66 65     ** For a refe
17510 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74 68  rence to any oth
17520 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  er column in the
17530 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61   new.* pseudo-ta
17540 62 6c 65 2c 20 70 31 0a 20 20 20 20 20 20 2a 2a  ble, p1.      **
17550 20 69 73 20 73 65 74 20 74 6f 20 28 6e 2b 32 2b   is set to (n+2+
17560 69 29 2c 20 77 68 65 72 65 20 6e 20 61 6e 64 20  i), where n and 
17570 69 20 61 72 65 20 61 73 20 64 65 66 69 6e 65 64  i are as defined
17580 20 70 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f 72   previously. For
17590 0a 20 20 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c  .      ** exampl
175a0 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  e, if the table 
175b0 6f 6e 20 77 68 69 63 68 20 74 72 69 67 67 65 72  on which trigger
175c0 73 20 61 72 65 20 62 65 69 6e 67 20 66 69 72 65  s are being fire
175d0 64 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65  d is.      ** de
175e0 63 6c 61 72 65 64 20 61 73 3a 0a 20 20 20 20 20  clared as:.     
175f0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 43   **.      **   C
17600 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
17610 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a 20  , b);.      **. 
17620 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 70 31 20       ** Then p1 
17630 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
17640 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20  s follows:.     
17650 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 70   **.      **   p
17660 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c 64  1==0   ->    old
17670 2e 72 6f 77 69 64 20 20 20 20 20 70 31 3d 3d 33  .rowid     p1==3
17680 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f 77     ->    new.row
17690 69 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31  id.      **   p1
176a0 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e  ==1   ->    old.
176b0 61 20 20 20 20 20 20 20 20 20 70 31 3d 3d 34 20  a         p1==4 
176c0 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20 20    ->    new.a.  
176d0 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20 20      **   p1==2  
176e0 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20 20   ->    old.b    
176f0 20 20 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e 20       p1==5   -> 
17700 20 20 20 6e 65 77 2e 62 20 20 20 20 20 20 20 0a     new.b       .
17710 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54        */.      T
17720 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78  able *pTab = pEx
17730 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  pr->pTab;.      
17740 69 6e 74 20 70 31 20 3d 20 70 45 78 70 72 2d 3e  int p1 = pExpr->
17750 69 54 61 62 6c 65 20 2a 20 28 70 54 61 62 2d 3e  iTable * (pTab->
17760 6e 43 6f 6c 2b 31 29 20 2b 20 31 20 2b 20 70 45  nCol+1) + 1 + pE
17770 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20  xpr->iColumn;.. 
17780 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
17790 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c  pr->iTable==0 ||
177a0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
177b0 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  1 );.      asser
177c0 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  t( pExpr->iColum
177d0 6e 3e 3d 2d 31 20 26 26 20 70 45 78 70 72 2d 3e  n>=-1 && pExpr->
177e0 69 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43  iColumn<pTab->nC
177f0 6f 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ol );.      asse
17800 72 74 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c  rt( pTab->iPKey<
17810 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  0 || pExpr->iCol
17820 75 6d 6e 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79  umn!=pTab->iPKey
17830 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17840 28 20 70 31 3e 3d 30 20 26 26 20 70 31 3c 28 70  ( p1>=0 && p1<(p
17850 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29  Tab->nCol*2+2) )
17860 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
17870 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17880 5f 50 61 72 61 6d 2c 20 70 31 2c 20 74 61 72 67  _Param, p1, targ
17890 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  et);.      VdbeC
178a0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e 25  omment((v, "%s.%
178b0 73 20 2d 3e 20 24 25 64 22 2c 0a 20 20 20 20 20  s -> $%d",.     
178c0 20 20 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c     (pExpr->iTabl
178d0 65 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64  e ? "new" : "old
178e0 22 29 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78  "),.        (pEx
178f0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20  pr->iColumn<0 ? 
17900 22 72 6f 77 69 64 22 20 3a 20 70 45 78 70 72 2d  "rowid" : pExpr-
17910 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70  >pTab->aCol[pExp
17920 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d  r->iColumn].zNam
17930 65 29 2c 0a 20 20 20 20 20 20 20 20 74 61 72 67  e),.        targ
17940 65 74 0a 20 20 20 20 20 20 29 29 3b 0a 0a 23 69  et.      ));..#i
17950 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17960 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
17970 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
17980 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c   column has REAL
17990 20 61 66 66 69 6e 69 74 79 2c 20 69 74 20 6d 61   affinity, it ma
179a0 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73  y currently be s
179b0 74 6f 72 65 64 20 61 73 20 61 6e 0a 20 20 20 20  tored as an.    
179c0 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55 73    ** integer. Us
179d0 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74  e OP_RealAffinit
179e0 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69  y to make sure i
179f0 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 61 6c  t is really real
17a00 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
17a10 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
17a20 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 54 61  0 .       && pTa
17a30 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  b->aCol[pExpr->i
17a40 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79  Column].affinity
17a50 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
17a60 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  L.      ){.     
17a70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17a80 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41  dOp1(v, OP_RealA
17a90 66 66 69 6e 69 74 79 2c 20 74 61 72 67 65 74 29  ffinity, target)
17aa0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
17ab0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
17ac0 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20    }...    /*.   
17ad0 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20   ** Form A:.    
17ae0 2a 2a 20 20 20 43 41 53 45 20 78 20 57 48 45 4e  **   CASE x WHEN
17af0 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e   e1 THEN r1 WHEN
17b00 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20   e2 THEN r2 ... 
17b10 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20  WHEN eN THEN rN 
17b20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
17b30 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a  *.    ** Form B:
17b40 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57  .    **   CASE W
17b50 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57  HEN e1 THEN r1 W
17b60 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e  HEN e2 THEN r2 .
17b70 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20  .. WHEN eN THEN 
17b80 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
17b90 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d    **.    ** Form
17ba0 20 41 20 69 73 20 63 61 6e 20 62 65 20 74 72 61   A is can be tra
17bb0 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68  nsformed into th
17bc0 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72  e equivalent for
17bd0 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  m B as follows:.
17be0 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48      **   CASE WH
17bf0 45 4e 20 78 3d 65 31 20 54 48 45 4e 20 72 31 20  EN x=e1 THEN r1 
17c00 57 48 45 4e 20 78 3d 65 32 20 54 48 45 4e 20 72  WHEN x=e2 THEN r
17c10 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20  2 ....    **    
17c20 20 20 20 20 57 48 45 4e 20 78 3d 65 4e 20 54 48      WHEN x=eN TH
17c30 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
17c40 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58  .    **.    ** X
17c50 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
17c60 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65  is in pExpr->pLe
17c70 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20  ft..    ** Y is 
17c80 69 6e 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  in pExpr->pRight
17c90 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f  .  The Y is also
17ca0 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74   optional.  If t
17cb0 68 65 72 65 20 69 73 20 6e 6f 0a 20 20 20 20 2a  here is no.    *
17cc0 2a 20 45 4c 53 45 20 63 6c 61 75 73 65 20 61 6e  * ELSE clause an
17cd0 64 20 6e 6f 20 6f 74 68 65 72 20 74 65 72 6d 20  d no other term 
17ce0 6d 61 74 63 68 65 73 2c 20 74 68 65 6e 20 74 68  matches, then th
17cf0 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a  e result of the.
17d00 20 20 20 20 2a 2a 20 65 78 70 72 73 73 69 6f 6e      ** exprssion
17d10 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a   is NULL..    **
17d20 20 45 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d   Ei is in pExpr-
17d30 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61  >pList->a[i*2] a
17d40 6e 64 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e  nd Ri is pExpr->
17d50 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e  pList->a[i*2+1].
17d60 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
17d70 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
17d80 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
17d90 68 65 20 52 69 20 66 6f 72 20 74 68 65 20 66 69  he Ri for the fi
17da0 72 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c  rst matching Ei,
17db0 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68  .    ** or if th
17dc0 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69  ere is no matchi
17dd0 6e 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20  ng Ei, the ELSE 
17de0 74 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68  term Y, or if th
17df0 65 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f  ere is.    ** no
17e00 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c   ELSE term, NULL
17e10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
17e20 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70  ault: assert( op
17e30 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20  ==TK_CASE ); {. 
17e40 20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65       int endLabe
17e50 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
17e60 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c         /* GOTO l
17e70 61 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20  abel for end of 
17e80 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20  CASE stmt */.   
17e90 20 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b     int nextCase;
17ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17eb0 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
17ec0 65 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e  el for next WHEN
17ed0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
17ee0 20 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20   int nExpr;     
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f00 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20     /* 2x number 
17f10 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
17f20 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
17f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f40 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
17f50 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
17f60 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
17f70 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
17f80 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57      /* List of W
17f90 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
17fa0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
17fb0 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c  st_item *aListel
17fc0 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66  em;  /* Array of
17fd0 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
17fe0 20 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70       Expr opComp
17ff0 61 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  are;            
18000 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d         /* The X=
18010 3d 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  =Ei expression *
18020 2f 0a 20 20 20 20 20 20 45 78 70 72 20 63 61 63  /.      Expr cac
18030 68 65 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  heX;            
18040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63            /* Cac
18050 68 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 58  hed expression X
18060 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
18070 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
18080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18090 68 65 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20  he X expression 
180a0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
180b0 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Test = 0;       
180c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d             /* X=
180d0 3d 45 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20  =Ei (form A) or 
180e0 6a 75 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29  just Ei (form B)
180f0 20 2a 2f 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e   */.      VVA_ON
18100 4c 59 28 20 69 6e 74 20 69 43 61 63 68 65 4c 65  LY( int iCacheLe
18110 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  vel = pParse->iC
18120 61 63 68 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20  acheLevel; )..  
18130 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
18140 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
18150 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
18160 29 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ) && pExpr->x.pL
18170 69 73 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ist );.      ass
18180 65 72 74 28 28 70 45 78 70 72 2d 3e 78 2e 70 4c  ert((pExpr->x.pL
18190 69 73 74 2d 3e 6e 45 78 70 72 20 25 20 32 29 20  ist->nExpr % 2) 
181a0 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  == 0);.      ass
181b0 65 72 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69  ert(pExpr->x.pLi
181c0 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a  st->nExpr > 0);.
181d0 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
181e0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
181f0 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d       aListelem =
18200 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20   pEList->a;.    
18210 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74    nExpr = pEList
18220 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65  ->nExpr;.      e
18230 6e 64 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65  ndLabel = sqlite
18240 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
18250 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  );.      if( (pX
18260 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29   = pExpr->pLeft)
18270 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  !=0 ){.        c
18280 61 63 68 65 58 20 3d 20 2a 70 58 3b 0a 20 20 20  acheX = *pX;.   
18290 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
182a0 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  X->op==TK_COLUMN
182b0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
182c0 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  case( pX->op==TK
182d0 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 20  _REGISTER );.   
182e0 20 20 20 20 20 63 61 63 68 65 58 2e 69 54 61 62       cacheX.iTab
182f0 6c 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  le = sqlite3Expr
18300 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
18310 20 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b   pX, &regFree1);
18320 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
18330 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
18340 3b 0a 20 20 20 20 20 20 20 20 63 61 63 68 65 58  ;.        cacheX
18350 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45  .op = TK_REGISTE
18360 52 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  R;.        opCom
18370 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b  pare.op = TK_EQ;
18380 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61  .        opCompa
18390 72 65 2e 70 4c 65 66 74 20 3d 20 26 63 61 63 68  re.pLeft = &cach
183a0 65 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73  eX;.        pTes
183b0 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a  t = &opCompare;.
183c0 20 20 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65          /* Ticke
183d0 74 20 62 33 35 31 64 39 35 66 39 63 64 35 65 66  t b351d95f9cd5ef
183e0 31 37 65 39 64 39 64 62 61 65 31 38 66 35 63 61  17e9d9dbae18f5ca
183f0 38 36 31 31 31 39 30 30 30 31 3a 0a 20 20 20 20  8611190001:.    
18400 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65      ** The value
18410 20 69 6e 20 72 65 67 46 72 65 65 31 20 6d 69 67   in regFree1 mig
18420 68 74 20 67 65 74 20 53 43 6f 70 79 2d 65 64 20  ht get SCopy-ed 
18430 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 72 65  into the file re
18440 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a  sult..        **
18450 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   So make sure th
18460 61 74 20 74 68 65 20 72 65 67 46 72 65 65 31 20  at the regFree1 
18470 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 20  register is not 
18480 72 65 75 73 65 64 20 66 6f 72 20 6f 74 68 65 72  reused for other
18490 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 75 72 70  .        ** purp
184a0 6f 73 65 73 20 61 6e 64 20 70 6f 73 73 69 62 6c  oses and possibl
184b0 79 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20  y overwritten.  
184c0 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 46 72  */.        regFr
184d0 65 65 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ee1 = 0;.      }
184e0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
184f0 69 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b  i<nExpr; i=i+2){
18500 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18510 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
18520 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
18530 66 28 20 70 58 20 29 7b 0a 20 20 20 20 20 20 20  f( pX ){.       
18540 20 20 20 61 73 73 65 72 74 28 20 70 54 65 73 74     assert( pTest
18550 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
18560 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69 67 68   opCompare.pRigh
18570 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d  t = aListelem[i]
18580 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
18590 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
185a0 20 70 54 65 73 74 20 3d 20 61 4c 69 73 74 65 6c   pTest = aListel
185b0 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  em[i].pExpr;.   
185c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
185d0 65 78 74 43 61 73 65 20 3d 20 73 71 6c 69 74 65  extCase = sqlite
185e0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
185f0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
18600 61 73 65 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d  ase( pTest->op==
18610 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
18620 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
18630 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
18640 70 54 65 73 74 2c 20 6e 65 78 74 43 61 73 65 2c  pTest, nextCase,
18650 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
18660 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  LL);.        tes
18670 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d  tcase( aListelem
18680 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d  [i+1].pExpr->op=
18690 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
186a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
186b0 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
186c0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  Expr->op==TK_REG
186d0 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20 20  ISTER );.       
186e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
186f0 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c  (pParse, aListel
18700 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74  em[i+1].pExpr, t
18710 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
18720 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18730 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
18740 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20   endLabel);.    
18750 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
18760 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20  achePop(pParse, 
18770 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
18780 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
18790 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29  bel(v, nextCase)
187a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
187b0 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
187c0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
187d0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
187e0 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
187f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
18800 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
18810 2d 3e 70 52 69 67 68 74 2c 20 74 61 72 67 65 74  ->pRight, target
18820 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
18830 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
18840 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20  Parse, 1);.     
18850 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18860 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18870 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
18880 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
18890 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
188a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
188b0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
188c0 3e 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  >0 .           |
188d0 7c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  | pParse->iCache
188e0 4c 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76  Level==iCacheLev
188f0 65 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  el );.      sqli
18900 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
18910 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29  bel(v, endLabel)
18920 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
18930 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
18940 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
18950 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49  .    case TK_RAI
18960 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  SE: {.      asse
18970 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  rt( pExpr->affin
18980 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b  ity==OE_Rollback
18990 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
189a0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
189b0 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20 20 20  =OE_Abort.      
189c0 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61       || pExpr->a
189d0 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c  ffinity==OE_Fail
189e0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
189f0 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
18a00 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20  OE_Ignore.      
18a10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  );.      if( !pP
18a20 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61  arse->pTriggerTa
18a30 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  b ){.        sql
18a40 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
18a50 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
18a60 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41 49              "RAI
18a70 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65  SE() may only be
18a80 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 74   used within a t
18a90 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29  rigger-program")
18aa0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
18ab0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
18ac0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66    if( pExpr->aff
18ad0 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20  inity==OE_Abort 
18ae0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
18af0 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  e3MayAbort(pPars
18b00 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
18b10 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
18b20 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
18b30 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
18b40 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
18b50 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
18b60 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20  Ignore ){.      
18b70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18b80 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20 20 20  Op4(.           
18b90 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c   v, OP_Halt, SQL
18ba0 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72  ITE_OK, OE_Ignor
18bb0 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  e, 0, pExpr->u.z
18bc0 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20  Token,0);.      
18bd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
18be0 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72  qlite3HaltConstr
18bf0 61 69 6e 74 28 70 50 61 72 73 65 2c 20 70 45 78  aint(pParse, pEx
18c00 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70 45  pr->affinity, pE
18c10 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
18c20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
18c30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
18c40 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69  endif.  }.  sqli
18c50 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
18c60 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
18c70 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  e1);.  sqlite3Re
18c80 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
18c90 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a  rse, regFree2);.
18ca0 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a    return inReg;.
18cb0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
18cc0 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
18cd0 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
18ce0 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
18cf0 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61  esults.** into a
18d00 20 72 65 67 69 73 74 65 72 2e 20 20 52 65 74 75   register.  Retu
18d10 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
18d20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74 68 65  number where the
18d30 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20   results.** are 
18d40 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  stored..**.** If
18d50 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 73   the register is
18d60 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67   a temporary reg
18d70 69 73 74 65 72 20 74 68 61 74 20 63 61 6e 20 62  ister that can b
18d80 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a  e deallocated,.*
18d90 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69 74 73  * then write its
18da0 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52   number into *pR
18db0 65 67 2e 20 20 49 66 20 74 68 65 20 72 65 73 75  eg.  If the resu
18dc0 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20 6e  lt register is n
18dd0 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  ot.** a temporar
18de0 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  y, then set *pRe
18df0 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e  g to zero..*/.in
18e00 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
18e10 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61  eTemp(Parse *pPa
18e20 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
18e30 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20  , int *pReg){.  
18e40 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
18e50 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
18e60 65 29 3b 0a 20 20 69 6e 74 20 72 32 20 3d 20 73  e);.  int r2 = s
18e70 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
18e80 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
18e90 70 72 2c 20 72 31 29 3b 0a 20 20 69 66 28 20 72  pr, r1);.  if( r
18ea0 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 2a 70 52  2==r1 ){.    *pR
18eb0 65 67 20 3d 20 72 31 3b 0a 20 20 7d 65 6c 73 65  eg = r1;.  }else
18ec0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  {.    sqlite3Rel
18ed0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
18ee0 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 2a 70 52  se, r1);.    *pR
18ef0 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  eg = 0;.  }.  re
18f00 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn r2;.}../*.*
18f10 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
18f20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61  that will evalua
18f30 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  te expression pE
18f40 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68  xpr and store th
18f50 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20  e.** results in 
18f60 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
18f70 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72    The results ar
18f80 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
18f90 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67  appear.** in reg
18fa0 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f  ister target..*/
18fb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
18fc0 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61 72  Code(Parse *pPar
18fd0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
18fe0 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
18ff0 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73  int inReg;..  as
19000 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26  sert( target>0 &
19010 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65  & target<=pParse
19020 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20  ->nMem );.  if( 
19030 70 45 78 70 72 20 26 26 20 70 45 78 70 72 2d 3e  pExpr && pExpr->
19040 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
19050 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
19060 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
19070 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c  >pVdbe, OP_Copy,
19080 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
19090 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65  target);.  }else
190a0 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71  {.    inReg = sq
190b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
190c0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
190d0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
190e0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
190f0 70 56 64 62 65 20 7c 7c 20 70 50 61 72 73 65 2d  pVdbe || pParse-
19100 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
19110 64 20 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 52  d );.    if( inR
19120 65 67 21 3d 74 61 72 67 65 74 20 26 26 20 70 50  eg!=target && pP
19130 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20  arse->pVdbe ){. 
19140 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19150 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
19160 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  Vdbe, OP_SCopy, 
19170 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a  inReg, target);.
19180 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
19190 72 6e 20 74 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a  rn target;.}../*
191a0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
191b0 65 20 74 68 61 74 20 65 76 61 6c 75 74 65 73 20  e that evalutes 
191c0 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
191d0 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68  sion and puts th
191e0 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72  e result.** in r
191f0 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a  egister target..
19200 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20  **.** Also make 
19210 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78  a copy of the ex
19220 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73  pression results
19230 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63   into another "c
19240 61 63 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a  ache" register.*
19250 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65  * and modify the
19260 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74   expression so t
19270 68 61 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d  hat the next tim
19280 65 20 69 74 20 69 73 20 65 76 61 6c 75 61 74 65  e it is evaluate
19290 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  d,.** the result
192a0 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68   is a copy of th
192b0 65 20 63 61 63 68 65 20 72 65 67 69 73 74 65 72  e cache register
192c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
192d0 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
192e0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
192f0 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69  t are used multi
19300 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20  ple .** times.  
19310 54 68 65 79 20 61 72 65 20 65 76 61 6c 75 61 74  They are evaluat
19320 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20  ed once and the 
19330 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65  results of the e
19340 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65  xpression.** are
19350 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20   reused..*/.int 
19360 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
19370 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  ndCache(Parse *p
19380 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
19390 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
193a0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
193b0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
193c0 74 20 69 6e 52 65 67 3b 0a 20 20 69 6e 52 65 67  t inReg;.  inReg
193d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
193e0 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
193f0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 61 73 73  , target);.  ass
19400 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b  ert( target>0 );
19410 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
19420 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
19430 20 74 65 72 6d 73 20 74 6f 20 49 4e 53 45 52 54   terms to INSERT
19440 20 6f 72 20 55 50 44 41 54 45 2e 20 20 41 6e 64   or UPDATE.  And
19450 20 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 6f   the only.  ** o
19460 74 68 65 72 20 70 6c 61 63 65 20 77 68 65 72 65  ther place where
19470 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e   expressions can
19480 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
19490 74 6f 20 54 4b 5f 52 45 47 49 53 54 45 52 20 69  to TK_REGISTER i
194a0 73 0a 20 20 2a 2a 20 69 6e 20 57 48 45 52 45 20  s.  ** in WHERE 
194b0 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
194c0 67 2e 20 20 53 6f 20 61 73 20 63 75 72 72 65 6e  g.  So as curren
194d0 74 6c 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2c  tly implemented,
194e0 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6e   there is.  ** n
194f0 6f 20 77 61 79 20 66 6f 72 20 61 20 54 4b 5f 52  o way for a TK_R
19500 45 47 49 53 54 45 52 20 74 6f 20 65 78 69 73 74  EGISTER to exist
19510 20 68 65 72 65 2e 20 20 42 75 74 20 69 74 20 73   here.  But it s
19520 65 65 6d 73 20 70 72 75 64 65 6e 74 20 74 6f 0a  eems prudent to.
19530 20 20 2a 2a 20 6b 65 65 70 20 74 68 65 20 41 4c    ** keep the AL
19540 57 41 59 53 28 29 20 69 6e 20 63 61 73 65 20 74  WAYS() in case t
19550 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62  he conditions ab
19560 6f 76 65 20 63 68 61 6e 67 65 20 77 69 74 68 20  ove change with 
19570 66 75 74 75 72 65 0a 20 20 2a 2a 20 6d 6f 64 69  future.  ** modi
19580 66 69 63 61 74 69 6f 6e 73 20 6f 72 20 65 6e 68  fications or enh
19590 61 6e 63 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20  ancements. */.  
195a0 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72  if( ALWAYS(pExpr
195b0 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45  ->op!=TK_REGISTE
195c0 52 29 20 29 7b 20 20 0a 20 20 20 20 69 6e 74 20  R) ){  .    int 
195d0 69 4d 65 6d 3b 0a 20 20 20 20 69 4d 65 6d 20 3d  iMem;.    iMem =
195e0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
195f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19600 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
19610 79 2c 20 69 6e 52 65 67 2c 20 69 4d 65 6d 29 3b  y, inReg, iMem);
19620 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62  .    pExpr->iTab
19630 6c 65 20 3d 20 69 4d 65 6d 3b 0a 20 20 20 20 70  le = iMem;.    p
19640 45 78 70 72 2d 3e 6f 70 32 20 3d 20 70 45 78 70  Expr->op2 = pExp
19650 72 2d 3e 6f 70 3b 0a 20 20 20 20 70 45 78 70 72  r->op;.    pExpr
19660 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54  ->op = TK_REGIST
19670 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ER;.  }.  return
19680 20 69 6e 52 65 67 3b 0a 7d 0a 0a 23 69 66 20 64   inReg;.}..#if d
19690 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
196a0 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49  ABLE_TREE_EXPLAI
196b0 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  N)./*.** Generat
196c0 65 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  e a human-readab
196d0 6c 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  le explanation o
196e0 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
196f0 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tree..*/.void sq
19700 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
19710 28 56 64 62 65 20 2a 70 4f 75 74 2c 20 45 78 70  (Vdbe *pOut, Exp
19720 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
19730 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
19740 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
19750 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64  code being coded
19760 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
19770 20 2a 7a 42 69 6e 4f 70 20 3d 20 30 3b 20 20 20   *zBinOp = 0;   
19780 2f 2a 20 42 69 6e 61 72 79 20 6f 70 65 72 61 74  /* Binary operat
19790 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  or */.  const ch
197a0 61 72 20 2a 7a 55 6e 69 4f 70 20 3d 20 30 3b 20  ar *zUniOp = 0; 
197b0 20 20 2f 2a 20 55 6e 61 72 79 20 6f 70 65 72 61    /* Unary opera
197c0 74 6f 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  tor */.  if( pEx
197d0 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20  pr==0 ){.    op 
197e0 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  = TK_NULL;.  }el
197f0 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78  se{.    op = pEx
19800 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77  pr->op;.  }.  sw
19810 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
19820 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
19830 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  MN: {.      sqli
19840 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
19850 28 70 4f 75 74 2c 20 22 41 47 47 7b 25 64 3a 25  (pOut, "AGG{%d:%
19860 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  d}",.           
19870 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
19880 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
19890 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
198a0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
198b0 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
198c0 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
198d0 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  e<0 ){.        /
198e0 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70  * This only happ
198f0 65 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e 67 20  ens when coding 
19900 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74  check constraint
19910 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  s */.        sql
19920 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
19930 66 28 70 4f 75 74 2c 20 22 43 4f 4c 55 4d 4e 28  f(pOut, "COLUMN(
19940 25 64 29 22 2c 20 70 45 78 70 72 2d 3e 69 43 6f  %d)", pExpr->iCo
19950 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lumn);.      }el
19960 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
19970 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
19980 28 70 4f 75 74 2c 20 22 7b 25 64 3a 25 64 7d 22  (pOut, "{%d:%d}"
19990 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
199a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
199b0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45  Expr->iTable, pE
199c0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  xpr->iColumn);. 
199d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
199e0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
199f0 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
19a00 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
19a10 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
19a20 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 20  Value ){.       
19a30 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
19a40 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 64 22  rintf(pOut, "%d"
19a50 2c 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75  , pExpr->u.iValu
19a60 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
19a70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19a80 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
19a90 75 74 2c 20 22 25 73 22 2c 20 70 45 78 70 72 2d  ut, "%s", pExpr-
19aa0 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
19ab0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
19ac0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
19ad0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
19ae0 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61  ING_POINT.    ca
19af0 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20  se TK_FLOAT: {. 
19b00 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
19b10 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22  ainPrintf(pOut,"
19b20 25 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  %s", pExpr->u.zT
19b30 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
19b40 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
19b50 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
19b60 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ING: {.      sql
19b70 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
19b80 66 28 70 4f 75 74 2c 22 25 51 22 2c 20 70 45 78  f(pOut,"%Q", pEx
19b90 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
19ba0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19bb0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55  }.    case TK_NU
19bc0 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LL: {.      sqli
19bd0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
19be0 28 70 4f 75 74 2c 22 4e 55 4c 4c 22 29 3b 0a 20  (pOut,"NULL");. 
19bf0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19c00 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
19c10 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52  _OMIT_BLOB_LITER
19c20 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  AL.    case TK_B
19c30 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  LOB: {.      sql
19c40 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
19c50 66 28 70 4f 75 74 2c 22 25 73 22 2c 20 70 45 78  f(pOut,"%s", pEx
19c60 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
19c70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19c80 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
19c90 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b  e TK_VARIABLE: {
19ca0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
19cb0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
19cc0 2c 22 56 41 52 49 41 42 4c 45 28 25 73 2c 25 64  ,"VARIABLE(%s,%d
19cd0 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )",.            
19ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
19cf0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
19d00 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
19d10 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19d20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
19d30 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20  REGISTER: {.    
19d40 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
19d50 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 52 45 47  Printf(pOut,"REG
19d60 49 53 54 45 52 28 25 64 29 22 2c 20 70 45 78 70  ISTER(%d)", pExp
19d70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  r->iTable);.    
19d80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
19d90 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b     case TK_AS: {
19da0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
19db0 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
19dc0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
19dd0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19de0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
19df0 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63  _OMIT_CAST.    c
19e00 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20  ase TK_CAST: {. 
19e10 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
19e20 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  ons of the form:
19e30 20 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53     CAST(pLeft AS
19e40 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20   token) */.     
19e50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 66   const char *zAf
19e60 66 20 3d 20 22 75 6e 6b 22 3b 0a 20 20 20 20 20  f = "unk";.     
19e70 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33   switch( sqlite3
19e80 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78  AffinityType(pEx
19e90 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 29 7b  pr->u.zToken) ){
19ea0 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
19eb0 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 20 20  LITE_AFF_TEXT:  
19ec0 20 20 7a 41 66 66 20 3d 20 22 54 45 58 54 22 3b    zAff = "TEXT";
19ed0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19ee0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
19ef0 41 46 46 5f 4e 4f 4e 45 3a 20 20 20 20 7a 41 66  AFF_NONE:    zAf
19f00 66 20 3d 20 22 4e 4f 4e 45 22 3b 20 20 20 20 20  f = "NONE";     
19f10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
19f20 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ase SQLITE_AFF_N
19f30 55 4d 45 52 49 43 3a 20 7a 41 66 66 20 3d 20 22  UMERIC: zAff = "
19f40 4e 55 4d 45 52 49 43 22 3b 20 20 62 72 65 61 6b  NUMERIC";  break
19f50 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  ;.        case S
19f60 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
19f70 52 3a 20 7a 41 66 66 20 3d 20 22 49 4e 54 45 47  R: zAff = "INTEG
19f80 45 52 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ER";  break;.   
19f90 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
19fa0 5f 41 46 46 5f 52 45 41 4c 3a 20 20 20 20 7a 41  _AFF_REAL:    zA
19fb0 66 66 20 3d 20 22 52 45 41 4c 22 3b 20 20 20 20  ff = "REAL";    
19fc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
19fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
19fe0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
19ff0 20 22 43 41 53 54 2d 25 73 28 22 2c 20 7a 41 66   "CAST-%s(", zAf
1a000 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  f);.      sqlite
1a010 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75  3ExplainExpr(pOu
1a020 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
1a030 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1a040 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1a050 74 2c 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62  t, ")");.      b
1a060 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
1a070 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1a080 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61  T_CAST */.    ca
1a090 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a  se TK_LT:      z
1a0a0 42 69 6e 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20  BinOp = "LT";   
1a0b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1a0c0 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 42  e TK_LE:      zB
1a0d0 69 6e 4f 70 20 3d 20 22 4c 45 22 3b 20 20 20 20  inOp = "LE";    
1a0e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1a0f0 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 7a 42 69   TK_GT:      zBi
1a100 6e 4f 70 20 3d 20 22 47 54 22 3b 20 20 20 20 20  nOp = "GT";     
1a110 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1a120 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a 42 69 6e  TK_GE:      zBin
1a130 4f 70 20 3d 20 22 47 45 22 3b 20 20 20 20 20 62  Op = "GE";     b
1a140 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1a150 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f  K_NE:      zBinO
1a160 70 20 3d 20 22 4e 45 22 3b 20 20 20 20 20 62 72  p = "NE";     br
1a170 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1a180 5f 45 51 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70  _EQ:      zBinOp
1a190 20 3d 20 22 45 51 22 3b 20 20 20 20 20 62 72 65   = "EQ";     bre
1a1a0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1a1b0 49 53 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20  IS:      zBinOp 
1a1c0 3d 20 22 49 53 22 3b 20 20 20 20 20 62 72 65 61  = "IS";     brea
1a1d0 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
1a1e0 53 4e 4f 54 3a 20 20 20 7a 42 69 6e 4f 70 20 3d  SNOT:   zBinOp =
1a1f0 20 22 49 53 4e 4f 54 22 3b 20 20 62 72 65 61 6b   "ISNOT";  break
1a200 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  ;.    case TK_AN
1a210 44 3a 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  D:     zBinOp = 
1a220 22 41 4e 44 22 3b 20 20 20 20 62 72 65 61 6b 3b  "AND";    break;
1a230 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
1a240 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22        zBinOp = "
1a250 4f 52 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  OR";     break;.
1a260 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53      case TK_PLUS
1a270 3a 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 41  :    zBinOp = "A
1a280 44 44 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  DD";    break;. 
1a290 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a     case TK_STAR:
1a2a0 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4d 55      zBinOp = "MU
1a2b0 4c 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  L";    break;.  
1a2c0 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
1a2d0 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 53 55 42     zBinOp = "SUB
1a2e0 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
1a2f0 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20   case TK_REM:   
1a300 20 20 7a 42 69 6e 4f 70 20 3d 20 22 52 45 4d 22    zBinOp = "REM"
1a310 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
1a320 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20  case TK_BITAND: 
1a330 20 7a 42 69 6e 4f 70 20 3d 20 22 42 49 54 41 4e   zBinOp = "BITAN
1a340 44 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  D"; break;.    c
1a350 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20  ase TK_BITOR:   
1a360 7a 42 69 6e 4f 70 20 3d 20 22 42 49 54 4f 52 22  zBinOp = "BITOR"
1a370 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
1a380 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a  se TK_SLASH:   z
1a390 42 69 6e 4f 70 20 3d 20 22 44 49 56 22 3b 20 20  BinOp = "DIV";  
1a3a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1a3b0 65 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 42  e TK_LSHIFT:  zB
1a3c0 69 6e 4f 70 20 3d 20 22 4c 53 48 49 46 54 22 3b  inOp = "LSHIFT";
1a3d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1a3e0 20 54 4b 5f 52 53 48 49 46 54 3a 20 20 7a 42 69   TK_RSHIFT:  zBi
1a3f0 6e 4f 70 20 3d 20 22 52 53 48 49 46 54 22 3b 20  nOp = "RSHIFT"; 
1a400 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1a410 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a 42 69 6e  TK_CONCAT:  zBin
1a420 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 62  Op = "CONCAT"; b
1a430 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
1a440 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 55 6e 69  TK_UMINUS:  zUni
1a450 4f 70 20 3d 20 22 55 4d 49 4e 55 53 22 3b 20 62  Op = "UMINUS"; b
1a460 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1a470 4b 5f 55 50 4c 55 53 3a 20 20 20 7a 55 6e 69 4f  K_UPLUS:   zUniO
1a480 70 20 3d 20 22 55 50 4c 55 53 22 3b 20 20 62 72  p = "UPLUS";  br
1a490 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1a4a0 5f 42 49 54 4e 4f 54 3a 20 20 7a 55 6e 69 4f 70  _BITNOT:  zUniOp
1a4b0 20 3d 20 22 42 49 54 4e 4f 54 22 3b 20 62 72 65   = "BITNOT"; bre
1a4c0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1a4d0 4e 4f 54 3a 20 20 20 20 20 7a 55 6e 69 4f 70 20  NOT:     zUniOp 
1a4e0 3d 20 22 4e 4f 54 22 3b 20 20 20 20 62 72 65 61  = "NOT";    brea
1a4f0 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
1a500 53 4e 55 4c 4c 3a 20 20 7a 55 6e 69 4f 70 20 3d  SNULL:  zUniOp =
1a510 20 22 49 53 4e 55 4c 4c 22 3b 20 62 72 65 61 6b   "ISNULL"; break
1a520 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  ;.    case TK_NO
1a530 54 4e 55 4c 4c 3a 20 7a 55 6e 69 4f 70 20 3d 20  TNULL: zUniOp = 
1a540 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72 65 61 6b  "NOTNULL"; break
1a550 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  ;..    case TK_C
1a560 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  OLLATE: {.      
1a570 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
1a580 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e  pr(pOut, pExpr->
1a590 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
1a5a0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1a5b0 74 66 28 70 4f 75 74 2c 22 2e 43 4f 4c 4c 41 54  tf(pOut,".COLLAT
1a5c0 45 28 25 73 29 22 2c 70 45 78 70 72 2d 3e 75 2e  E(%s)",pExpr->u.
1a5d0 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62  zToken);.      b
1a5e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1a5f0 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
1a600 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20  CTION:.    case 
1a610 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20  TK_CONST_FUNC:. 
1a620 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
1a630 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  ION: {.      Exp
1a640 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20  rList *pFarg;   
1a650 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
1a660 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
1a670 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45  s */.      if( E
1a680 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
1a690 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
1a6a0 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  nOnly) ){.      
1a6b0 20 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20    pFarg = 0;.   
1a6c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a6d0 20 20 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d    pFarg = pExpr-
1a6e0 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
1a6f0 7d 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d  }.      if( op==
1a700 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
1a710 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1a720 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1a730 70 4f 75 74 2c 20 22 41 47 47 5f 46 55 4e 43 54  pOut, "AGG_FUNCT
1a740 49 4f 4e 25 64 3a 25 73 28 22 2c 0a 20 20 20 20  ION%d:%s(",.    
1a750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a760 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1a770 6f 70 32 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  op2, pExpr->u.zT
1a780 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  oken);.      }el
1a790 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1a7a0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1a7b0 28 70 4f 75 74 2c 20 22 46 55 4e 43 54 49 4f 4e  (pOut, "FUNCTION
1a7c0 3a 25 73 28 22 2c 20 70 45 78 70 72 2d 3e 75 2e  :%s(", pExpr->u.
1a7d0 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d  zToken);.      }
1a7e0 0a 20 20 20 20 20 20 69 66 28 20 70 46 61 72 67  .      if( pFarg
1a7f0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1a800 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69  te3ExplainExprLi
1a810 73 74 28 70 4f 75 74 2c 20 70 46 61 72 67 29 3b  st(pOut, pFarg);
1a820 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1a830 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1a840 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a  ntf(pOut, ")");.
1a850 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a860 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1a870 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1a880 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
1a890 54 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  TS: {.      sqli
1a8a0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1a8b0 28 70 4f 75 74 2c 20 22 45 58 49 53 54 53 28 22  (pOut, "EXISTS("
1a8c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a8d0 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 70 4f  ExplainSelect(pO
1a8e0 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  ut, pExpr->x.pSe
1a8f0 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  lect);.      sql
1a900 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1a910 66 28 70 4f 75 74 2c 22 29 22 29 3b 0a 20 20 20  f(pOut,")");.   
1a920 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1a930 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
1a940 43 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  CT: {.      sqli
1a950 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1a960 28 70 4f 75 74 2c 20 22 28 22 29 3b 0a 20 20 20  (pOut, "(");.   
1a970 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1a980 6e 53 65 6c 65 63 74 28 70 4f 75 74 2c 20 70 45  nSelect(pOut, pE
1a990 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b  xpr->x.pSelect);
1a9a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1a9b0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1a9c0 2c 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72  , ")");.      br
1a9d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1a9e0 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
1a9f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1aa00 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 49  nPrintf(pOut, "I
1aa10 4e 28 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  N(");.      sqli
1aa20 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
1aa30 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  Out, pExpr->pLef
1aa40 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1aa50 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1aa60 4f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20  Out, ",");.     
1aa70 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
1aa80 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
1aa90 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
1aaa0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1aab0 61 69 6e 53 65 6c 65 63 74 28 70 4f 75 74 2c 20  ainSelect(pOut, 
1aac0 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1aad0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1aae0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1aaf0 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70  xplainExprList(p
1ab00 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  Out, pExpr->x.pL
1ab10 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
1ab20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1ab30 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1ab40 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  )");.      break
1ab50 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
1ab60 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
1ab70 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f  BQUERY */..    /
1ab80 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45  *.    **    x BE
1ab90 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20  TWEEN y AND z.  
1aba0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
1abb0 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
1abc0 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  o.    **.    ** 
1abd0 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a     x>=y AND x<=z
1abe0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58  .    **.    ** X
1abf0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
1ac00 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20  xpr->pLeft..    
1ac10 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69  ** Y is stored i
1ac20 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
1ac30 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20  a[0].pExpr..    
1ac40 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69  ** Z is stored i
1ac50 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
1ac60 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20  a[1].pExpr..    
1ac70 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  */.    case TK_B
1ac80 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
1ac90 45 78 70 72 20 2a 70 58 20 3d 20 70 45 78 70 72  Expr *pX = pExpr
1aca0 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45  ->pLeft;.      E
1acb0 78 70 72 20 2a 70 59 20 3d 20 70 45 78 70 72 2d  xpr *pY = pExpr-
1acc0 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
1acd0 45 78 70 72 3b 0a 20 20 20 20 20 20 45 78 70 72  Expr;.      Expr
1ace0 20 2a 70 5a 20 3d 20 70 45 78 70 72 2d 3e 78 2e   *pZ = pExpr->x.
1acf0 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
1ad00 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
1ad10 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1ad20 75 74 2c 20 22 42 45 54 57 45 45 4e 28 22 29 3b  ut, "BETWEEN(");
1ad30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1ad40 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
1ad50 70 58 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pX);.      sqlit
1ad60 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1ad70 70 4f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20  pOut, ",");.    
1ad80 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1ad90 45 78 70 72 28 70 4f 75 74 2c 20 70 59 29 3b 0a  Expr(pOut, pY);.
1ada0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1adb0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1adc0 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 73 71 6c   ",");.      sql
1add0 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
1ade0 70 4f 75 74 2c 20 70 5a 29 3b 0a 20 20 20 20 20  pOut, pZ);.     
1adf0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1ae00 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29  rintf(pOut, ")")
1ae10 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1ae20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1ae30 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20  _TRIGGER: {.    
1ae40 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f    /* If the opco
1ae50 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52  de is TK_TRIGGER
1ae60 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  , then the expre
1ae70 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72  ssion is a refer
1ae80 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ence.      ** to
1ae90 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
1aea0 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20   new.* or old.* 
1aeb0 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76  pseudo-tables av
1aec0 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20  ailable to.     
1aed0 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67   ** trigger prog
1aee0 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61  rams. In this ca
1aef0 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69  se Expr.iTable i
1af00 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74  s set to 1 for t
1af10 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e  he.      ** new.
1af20 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20  * pseudo-table, 
1af30 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64  or 0 for the old
1af40 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e  .* pseudo-table.
1af50 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20   Expr.iColumn.  
1af60 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f      ** is set to
1af70 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   the column of t
1af80 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20  he pseudo-table 
1af90 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d  to read, or to -
1afa0 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65  1 to.      ** re
1afb0 61 64 20 74 68 65 20 72 6f 77 69 64 20 66 69 65  ad the rowid fie
1afc0 6c 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ld..      */.   
1afd0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1afe0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25  nPrintf(pOut, "%
1aff0 73 28 25 64 29 22 2c 20 0a 20 20 20 20 20 20 20  s(%d)", .       
1b000 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
1b010 20 3f 20 22 4e 45 57 22 20 3a 20 22 4f 4c 44 22   ? "NEW" : "OLD"
1b020 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
1b030 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1b040 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1b050 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20  K_CASE: {.      
1b060 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1b070 69 6e 74 66 28 70 4f 75 74 2c 20 22 43 41 53 45  intf(pOut, "CASE
1b080 28 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (");.      sqlit
1b090 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f  e3ExplainExpr(pO
1b0a0 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ut, pExpr->pLeft
1b0b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b0c0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1b0d0 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20  ut, ",");.      
1b0e0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
1b0f0 70 72 4c 69 73 74 28 70 4f 75 74 2c 20 70 45 78  prList(pOut, pEx
1b100 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
1b110 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1b120 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b130 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20  OMIT_TRIGGER.   
1b140 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20   case TK_RAISE: 
1b150 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
1b160 61 72 20 2a 7a 54 79 70 65 20 3d 20 22 75 6e 6b  ar *zType = "unk
1b170 22 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  ";.      switch(
1b180 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
1b190 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
1b1a0 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 20 20 20   OE_Rollback:   
1b1b0 7a 54 79 70 65 20 3d 20 22 72 6f 6c 6c 62 61 63  zType = "rollbac
1b1c0 6b 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  k";  break;.    
1b1d0 20 20 20 20 63 61 73 65 20 4f 45 5f 41 62 6f 72      case OE_Abor
1b1e0 74 3a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  t:      zType = 
1b1f0 22 61 62 6f 72 74 22 3b 20 20 20 20 20 62 72 65  "abort";     bre
1b200 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
1b210 20 4f 45 5f 46 61 69 6c 3a 20 20 20 20 20 20 20   OE_Fail:       
1b220 7a 54 79 70 65 20 3d 20 22 66 61 69 6c 22 3b 20  zType = "fail"; 
1b230 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b240 20 20 20 20 63 61 73 65 20 4f 45 5f 49 67 6e 6f      case OE_Igno
1b250 72 65 3a 20 20 20 20 20 7a 54 79 70 65 20 3d 20  re:     zType = 
1b260 22 69 67 6e 6f 72 65 22 3b 20 20 20 20 62 72 65  "ignore";    bre
1b270 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1b280 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b290 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 52 41  Printf(pOut, "RA
1b2a0 49 53 45 2d 25 73 28 25 73 29 22 2c 20 7a 54 79  ISE-%s(%s)", zTy
1b2b0 70 65 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  pe, pExpr->u.zTo
1b2c0 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ken);.      brea
1b2d0 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
1b2e0 20 20 7d 0a 20 20 69 66 28 20 7a 42 69 6e 4f 70    }.  if( zBinOp
1b2f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1b300 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1b310 74 2c 22 25 73 28 22 2c 20 7a 42 69 6e 4f 70 29  t,"%s(", zBinOp)
1b320 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1b330 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70  lainExpr(pOut, p
1b340 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
1b350 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b360 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 2c 22 29  Printf(pOut,",")
1b370 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1b380 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70  lainExpr(pOut, p
1b390 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
1b3a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1b3b0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 29 22  nPrintf(pOut,")"
1b3c0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  );.  }else if( z
1b3d0 55 6e 69 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c  UniOp ){.    sql
1b3e0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1b3f0 66 28 70 4f 75 74 2c 22 25 73 28 22 2c 20 7a 55  f(pOut,"%s(", zU
1b400 6e 69 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  niOp);.    sqlit
1b410 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f  e3ExplainExpr(pO
1b420 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ut, pExpr->pLeft
1b430 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1b440 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1b450 2c 22 29 22 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ,")");.  }.}.#en
1b460 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
1b470 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45  QLITE_ENABLE_TRE
1b480 45 5f 45 58 50 4c 41 49 4e 29 20 2a 2f 0a 0a 23  E_EXPLAIN) */..#
1b490 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1b4a0 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
1b4b0 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e  PLAIN)./*.** Gen
1b4c0 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d 72 65  erate a human-re
1b4d0 61 64 61 62 6c 65 20 65 78 70 6c 61 6e 61 74 69  adable explanati
1b4e0 6f 6e 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  on of an express
1b4f0 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ion list..*/.voi
1b500 64 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e  d sqlite3Explain
1b510 45 78 70 72 4c 69 73 74 28 56 64 62 65 20 2a 70  ExprList(Vdbe *p
1b520 4f 75 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  Out, ExprList *p
1b530 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
1b540 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 7c    if( pList==0 |
1b550 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  | pList->nExpr==
1b560 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1b570 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1b580 75 74 2c 20 22 28 65 6d 70 74 79 2d 6c 69 73 74  ut, "(empty-list
1b590 29 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  )");.    return;
1b5a0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 69  .  }else if( pLi
1b5b0 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 7b 0a  st->nExpr==1 ){.
1b5c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1b5d0 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 4c 69  inExpr(pOut, pLi
1b5e0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
1b5f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1b600 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68  lite3ExplainPush
1b610 28 70 4f 75 74 29 3b 0a 20 20 20 20 66 6f 72 28  (pOut);.    for(
1b620 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
1b630 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1b640 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1b650 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 69 74 65  rintf(pOut, "ite
1b660 6d 5b 25 64 5d 20 3d 20 22 2c 20 69 29 3b 0a 20  m[%d] = ", i);. 
1b670 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1b680 61 69 6e 50 75 73 68 28 70 4f 75 74 29 3b 0a 20  ainPush(pOut);. 
1b690 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1b6a0 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 4c  ainExpr(pOut, pL
1b6b0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
1b6c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1b6d0 78 70 6c 61 69 6e 50 6f 70 28 70 4f 75 74 29 3b  xplainPop(pOut);
1b6e0 0a 20 20 20 20 20 20 69 66 28 20 69 3c 70 4c 69  .      if( i<pLi
1b6f0 73 74 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20  st->nExpr-1 ){. 
1b700 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1b710 70 6c 61 69 6e 4e 4c 28 70 4f 75 74 29 3b 0a 20  plainNL(pOut);. 
1b720 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1b730 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1b740 6f 70 28 70 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a  op(pOut);.  }.}.
1b750 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1b760 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
1b770 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
1b780 70 45 78 70 72 20 69 73 20 61 6e 20 63 6f 6e 73  pExpr is an cons
1b790 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
1b7a0 74 68 61 74 20 69 73 20 61 70 70 72 6f 70 72 69  that is appropri
1b7b0 61 74 65 0a 2a 2a 20 66 6f 72 20 66 61 63 74 6f  ate.** for facto
1b7c0 72 69 6e 67 20 6f 75 74 20 6f 66 20 61 20 6c 6f  ring out of a lo
1b7d0 6f 70 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65  op.  Appropriate
1b7e0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
1b7f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e  :.**.**    *  An
1b800 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  y expression tha
1b810 74 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74  t evaluates to t
1b820 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 70 63 6f 64  wo or more opcod
1b830 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  es..**.**    *  
1b840 41 6e 79 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  Any OP_Integer, 
1b850 4f 50 5f 52 65 61 6c 2c 20 4f 50 5f 53 74 72 69  OP_Real, OP_Stri
1b860 6e 67 2c 20 4f 50 5f 42 6c 6f 62 2c 20 4f 50 5f  ng, OP_Blob, OP_
1b870 4e 75 6c 6c 2c 20 0a 2a 2a 20 20 20 20 20 20 20  Null, .**       
1b880 6f 72 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 74  or OP_Variable t
1b890 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
1b8a0 64 20 74 6f 20 62 65 20 70 6c 61 63 65 64 20 69  d to be placed i
1b8b0 6e 20 61 20 0a 2a 2a 20 20 20 20 20 20 20 73 70  n a .**       sp
1b8c0 65 63 69 66 69 63 20 72 65 67 69 73 74 65 72 2e  ecific register.
1b8d0 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
1b8e0 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 66 61 63 74  no point in fact
1b8f0 6f 72 69 6e 67 20 6f 75 74 20 73 69 6e 67 6c 65  oring out single
1b900 2d 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e  -instruction con
1b910 73 74 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73  stant.** express
1b920 69 6f 6e 73 20 74 68 61 74 20 6e 65 65 64 20 74  ions that need t
1b930 6f 20 62 65 20 70 6c 61 63 65 64 20 69 6e 20 61  o be placed in a
1b940 20 70 61 72 74 69 63 75 6c 61 72 20 72 65 67 69   particular regi
1b950 73 74 65 72 2e 20 20 0a 2a 2a 20 57 65 20 63 6f  ster.  .** We co
1b960 75 6c 64 20 66 61 63 74 6f 72 20 74 68 65 6d 20  uld factor them 
1b970 6f 75 74 2c 20 62 75 74 20 74 68 65 6e 20 77 65  out, but then we
1b980 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 61 64   would end up ad
1b990 64 69 6e 67 20 61 6e 0a 2a 2a 20 4f 50 5f 53 43  ding an.** OP_SC
1b9a0 6f 70 79 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  opy instruction 
1b9b0 74 6f 20 6d 6f 76 65 20 74 68 65 20 76 61 6c 75  to move the valu
1b9c0 65 20 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65  e into the corre
1b9d0 63 74 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 6c  ct register.** l
1b9e0 61 74 65 72 2e 20 20 57 65 20 6d 69 67 68 74 20  ater.  We might 
1b9f0 61 73 20 77 65 6c 6c 20 6a 75 73 74 20 75 73 65  as well just use
1ba00 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e   the original in
1ba10 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a  struction and.**
1ba20 20 61 76 6f 69 64 20 74 68 65 20 4f 50 5f 53 43   avoid the OP_SC
1ba30 6f 70 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  opy..*/.static i
1ba40 6e 74 20 69 73 41 70 70 72 6f 70 72 69 61 74 65  nt isAppropriate
1ba50 46 6f 72 46 61 63 74 6f 72 69 6e 67 28 45 78 70  ForFactoring(Exp
1ba60 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 21 73 71  r *p){.  if( !sq
1ba70 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
1ba80 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 29 20 29 7b  antNotJoin(p) ){
1ba90 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
1baa0 2f 2a 20 4f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74  /* Only constant
1bab0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
1bac0 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
1bad0 20 66 61 63 74 6f 72 69 6e 67 20 2a 2f 0a 20 20   factoring */.  
1bae0 7d 0a 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67  }.  if( (p->flag
1baf0 73 20 26 20 45 50 5f 46 69 78 65 64 44 65 73 74  s & EP_FixedDest
1bb00 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
1bb10 72 6e 20 31 3b 20 20 2f 2a 20 41 6e 79 20 63 6f  rn 1;  /* Any co
1bb20 6e 73 74 61 6e 74 20 77 69 74 68 6f 75 74 20 61  nstant without a
1bb30 20 66 69 78 65 64 20 64 65 73 74 69 6e 61 74 69   fixed destinati
1bb40 6f 6e 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  on is appropriat
1bb50 65 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65  e */.  }.  while
1bb60 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55  ( p->op==TK_UPLU
1bb70 53 20 29 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74  S ) p = p->pLeft
1bb80 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  ;.  switch( p->o
1bb90 70 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  p ){.#ifndef SQL
1bba0 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49  ITE_OMIT_BLOB_LI
1bbb0 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54  TERAL.    case T
1bbc0 4b 5f 42 4c 4f 42 3a 0a 23 65 6e 64 69 66 0a 20  K_BLOB:.#endif. 
1bbd0 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
1bbe0 42 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  BLE:.    case TK
1bbf0 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61  _INTEGER:.    ca
1bc00 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20  se TK_FLOAT:.   
1bc10 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20   case TK_NULL:. 
1bc20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
1bc30 47 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  G: {.      testc
1bc40 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 42  ase( p->op==TK_B
1bc50 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20 74 65 73  LOB );.      tes
1bc60 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
1bc70 5f 56 41 52 49 41 42 4c 45 20 29 3b 0a 20 20 20  _VARIABLE );.   
1bc80 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
1bc90 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29  op==TK_INTEGER )
1bca0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1bcb0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  ( p->op==TK_FLOA
1bcc0 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
1bcd0 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e  ase( p->op==TK_N
1bce0 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ULL );.      tes
1bcf0 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
1bd00 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20 20 20 20  _STRING );.     
1bd10 20 2f 2a 20 53 69 6e 67 6c 65 2d 69 6e 73 74 72   /* Single-instr
1bd20 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73  uction constants
1bd30 20 77 69 74 68 20 61 20 66 69 78 65 64 20 64 65   with a fixed de
1bd40 73 74 69 6e 61 74 69 6f 6e 20 61 72 65 0a 20 20  stination are.  
1bd50 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20 64 6f      ** better do
1bd60 6e 65 20 69 6e 2d 6c 69 6e 65 2e 20 20 49 66 20  ne in-line.  If 
1bd70 77 65 20 66 61 63 74 6f 72 20 74 68 65 6d 2c 20  we factor them, 
1bd80 74 68 65 79 20 77 69 6c 6c 20 6a 75 73 74 20 65  they will just e
1bd90 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 70 20 67  nd.      ** up g
1bda0 65 6e 65 72 61 74 69 6e 67 20 61 6e 20 4f 50 5f  enerating an OP_
1bdb0 53 43 6f 70 79 20 74 6f 20 6d 6f 76 65 20 74 68  SCopy to move th
1bdc0 65 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20 64  e value to the d
1bdd0 65 73 74 69 6e 61 74 69 6f 6e 0a 20 20 20 20 20  estination.     
1bde0 20 2a 2a 20 72 65 67 69 73 74 65 72 2e 20 2a 2f   ** register. */
1bdf0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1be00 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1be10 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
1be20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 2d     if( p->pLeft-
1be30 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c  >op==TK_FLOAT ||
1be40 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54   p->pLeft->op==T
1be50 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  K_INTEGER ){.   
1be60 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1be70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1be80 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
1be90 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 62  fault: {.      b
1bea0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1beb0 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
1bec0 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73  *.** If pExpr is
1bed0 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72   a constant expr
1bee0 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 61  ession that is a
1bef0 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 0a 2a  ppropriate for.*
1bf00 2a 20 66 61 63 74 6f 72 69 6e 67 20 6f 75 74 20  * factoring out 
1bf10 6f 66 20 61 20 6c 6f 6f 70 2c 20 74 68 65 6e 20  of a loop, then 
1bf20 65 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70  evaluate the exp
1bf30 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20  ression.** into 
1bf40 61 20 72 65 67 69 73 74 65 72 20 61 6e 64 20 63  a register and c
1bf50 6f 6e 76 65 72 74 20 74 68 65 20 65 78 70 72 65  onvert the expre
1bf60 73 73 69 6f 6e 20 69 6e 74 6f 20 61 20 54 4b 5f  ssion into a TK_
1bf70 52 45 47 49 53 54 45 52 0a 2a 2a 20 65 78 70 72  REGISTER.** expr
1bf80 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ession..*/.stati
1bf90 63 20 69 6e 74 20 65 76 61 6c 43 6f 6e 73 74 45  c int evalConstE
1bfa0 78 70 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  xpr(Walker *pWal
1bfb0 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
1bfc0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
1bfd0 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
1bfe0 61 72 73 65 3b 0a 20 20 73 77 69 74 63 68 28 20  arse;.  switch( 
1bff0 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
1c000 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20   case TK_IN:.   
1c010 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
1c020 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  R: {.      retur
1c030 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
1c040 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46   }.    case TK_F
1c050 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73  UNCTION:.    cas
1c060 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
1c070 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  N:.    case TK_C
1c080 4f 4e 53 54 5f 46 55 4e 43 3a 20 7b 0a 20 20 20  ONST_FUNC: {.   
1c090 20 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65     /* The argume
1c0a0 6e 74 73 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  nts to a functio
1c0b0 6e 20 68 61 76 65 20 61 20 66 69 78 65 64 20 64  n have a fixed d
1c0c0 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 20 20  estination..    
1c0d0 20 20 2a 2a 20 4d 61 72 6b 20 74 68 65 6d 20 74    ** Mark them t
1c0e0 68 69 73 20 77 61 79 20 74 6f 20 61 76 6f 69 64  his way to avoid
1c0f0 20 67 65 6e 65 72 61 74 65 64 20 75 6e 6e 65 65   generated unnee
1c100 64 65 64 20 4f 50 5f 53 43 6f 70 79 0a 20 20 20  ded OP_SCopy.   
1c110 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f     ** instructio
1c120 6e 73 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ns. .      */.  
1c130 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
1c140 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
1c150 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65  List;.      asse
1c160 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1c170 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
1c180 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
1c190 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a     if( pList ){.
1c1a0 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20          int i = 
1c1b0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
1c1c0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
1c1d0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
1c1e0 6d 20 3d 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20  m = pList->a;.  
1c1f0 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e 30 3b        for(; i>0;
1c200 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
1c210 20 20 20 20 20 20 20 20 20 20 69 66 28 20 41 4c            if( AL
1c220 57 41 59 53 28 70 49 74 65 6d 2d 3e 70 45 78 70  WAYS(pItem->pExp
1c230 72 29 20 29 20 70 49 74 65 6d 2d 3e 70 45 78 70  r) ) pItem->pExp
1c240 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46  r->flags |= EP_F
1c250 69 78 65 64 44 65 73 74 3b 0a 20 20 20 20 20 20  ixedDest;.      
1c260 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1c270 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1c280 20 7d 0a 20 20 69 66 28 20 69 73 41 70 70 72 6f   }.  if( isAppro
1c290 70 72 69 61 74 65 46 6f 72 46 61 63 74 6f 72 69  priateForFactori
1c2a0 6e 67 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  ng(pExpr) ){.   
1c2b0 20 69 6e 74 20 72 31 20 3d 20 2b 2b 70 50 61 72   int r1 = ++pPar
1c2c0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e  se->nMem;.    in
1c2d0 74 20 72 32 3b 0a 20 20 20 20 72 32 20 3d 20 73  t r2;.    r2 = s
1c2e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
1c2f0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
1c300 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69 66 28  pr, r1);.    if(
1c310 20 72 31 21 3d 72 32 20 29 20 73 71 6c 69 74 65   r1!=r2 ) sqlite
1c320 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1c330 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
1c340 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 70 45   pExpr->op2 = pE
1c350 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 70 45 78  xpr->op;.    pEx
1c360 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49  pr->op = TK_REGI
1c370 53 54 45 52 3b 0a 20 20 20 20 70 45 78 70 72 2d  STER;.    pExpr-
1c380 3e 69 54 61 62 6c 65 20 3d 20 72 32 3b 0a 20 20  >iTable = r2;.  
1c390 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
1c3a0 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ne;.  }.  return
1c3b0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
1c3c0 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 65 76 61 6c 75  ../*.** Preevalu
1c3d0 61 74 65 20 63 6f 6e 73 74 61 6e 74 20 73 75 62  ate constant sub
1c3e0 65 78 70 72 65 73 73 69 6f 6e 73 20 77 69 74 68  expressions with
1c3f0 69 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f  in pExpr and sto
1c400 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  re the.** result
1c410 73 20 69 6e 20 72 65 67 69 73 74 65 72 73 2e 20  s in registers. 
1c420 20 4d 6f 64 69 66 79 20 70 45 78 70 72 20 73 6f   Modify pExpr so
1c430 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61   that the consta
1c440 6e 74 20 73 75 62 65 78 70 72 65 73 69 6f 6e 73  nt subexpresions
1c450 0a 2a 2a 20 61 72 65 20 54 4b 5f 52 45 47 49 53  .** are TK_REGIS
1c460 54 45 52 20 6f 70 63 6f 64 65 73 20 74 68 61 74  TER opcodes that
1c470 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 70 72   refer to the pr
1c480 65 63 6f 6d 70 75 74 65 64 20 76 61 6c 75 65 73  ecomputed values
1c490 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1c4a0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
1c4b0 69 66 20 74 68 65 20 6a 75 6d 70 20 74 6f 20 74  if the jump to t
1c4c0 68 65 20 63 6f 6f 6b 69 65 2d 63 68 65 63 6b 20  he cookie-check 
1c4d0 63 6f 64 65 20 68 61 73 0a 2a 2a 20 61 6c 72 65  code has.** alre
1c4e0 61 64 79 20 6f 63 63 75 72 2e 20 20 53 69 6e 63  ady occur.  Sinc
1c4f0 65 20 74 68 65 20 63 6f 6f 6b 69 65 2d 63 68 65  e the cookie-che
1c500 63 6b 20 6a 75 6d 70 20 69 73 20 67 65 6e 65 72  ck jump is gener
1c510 61 74 65 64 20 70 72 69 6f 72 20 74 6f 0a 2a 2a  ated prior to.**
1c520 20 61 6e 79 20 6f 74 68 65 72 20 73 65 72 69 6f   any other serio
1c530 75 73 20 70 72 6f 63 65 73 73 69 6e 67 2c 20 74  us processing, t
1c540 68 69 73 20 63 68 65 63 6b 20 65 6e 73 75 72 65  his check ensure
1c550 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
1c560 6e 6f 0a 2a 2a 20 77 61 79 20 74 6f 20 61 63 63  no.** way to acc
1c570 69 64 65 6e 74 6c 79 20 62 79 70 61 73 73 20 74  idently bypass t
1c580 68 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e 69 74  he constant init
1c590 69 61 6c 69 7a 61 74 69 6f 6e 73 2e 0a 2a 2a 0a  ializations..**.
1c5a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1c5b0 69 73 20 61 6c 73 6f 20 61 20 6e 6f 2d 6f 70 20  is also a no-op 
1c5c0 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 46 61  if the SQLITE_Fa
1c5d0 63 74 6f 72 4f 75 74 43 6f 6e 73 74 20 6f 70 74  ctorOutConst opt
1c5e0 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 69 73 20  imization.** is 
1c5f0 64 69 73 61 62 6c 65 64 20 76 69 61 20 74 68 65  disabled via the
1c600 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1c610 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1c620 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49  TCTRL_OPTIMIZATI
1c630 4f 4e 53 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63  ONS).** interfac
1c640 65 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  e.  This allows 
1c650 74 65 73 74 20 6c 6f 67 69 63 20 74 6f 20 76 65  test logic to ve
1c660 72 69 66 79 20 74 68 61 74 20 74 68 65 20 73 61  rify that the sa
1c670 6d 65 20 61 6e 73 77 65 72 20 69 73 0a 2a 2a 20  me answer is.** 
1c680 6f 62 74 61 69 6e 65 64 20 66 6f 72 20 71 75 65  obtained for que
1c690 72 69 65 73 20 72 65 67 61 72 64 6c 65 73 73 20  ries regardless 
1c6a0 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  of whether or no
1c6b0 74 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 0a  t constants are.
1c6c0 2a 2a 20 70 72 65 63 6f 6d 70 75 74 65 64 20 69  ** precomputed i
1c6d0 6e 74 6f 20 72 65 67 69 73 74 65 72 73 20 6f 72  nto registers or
1c6e0 20 69 66 20 74 68 65 79 20 61 72 65 20 69 6e 73   if they are ins
1c6f0 65 72 74 65 64 20 69 6e 2d 6c 69 6e 65 2e 0a 2a  erted in-line..*
1c700 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1c710 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73 28  prCodeConstants(
1c720 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
1c730 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57  xpr *pExpr){.  W
1c740 61 6c 6b 65 72 20 77 3b 0a 20 20 69 66 28 20 70  alker w;.  if( p
1c750 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
1c760 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  o ) return;.  if
1c770 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  ( OptimizationDi
1c780 73 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64  sabled(pParse->d
1c790 62 2c 20 53 51 4c 49 54 45 5f 46 61 63 74 6f 72  b, SQLITE_Factor
1c7a0 4f 75 74 43 6f 6e 73 74 29 20 29 20 72 65 74 75  OutConst) ) retu
1c7b0 72 6e 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  rn;.  w.xExprCal
1c7c0 6c 62 61 63 6b 20 3d 20 65 76 61 6c 43 6f 6e 73  lback = evalCons
1c7d0 74 45 78 70 72 3b 0a 20 20 77 2e 78 53 65 6c 65  tExpr;.  w.xSele
1c7e0 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ctCallback = 0;.
1c7f0 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61    w.pParse = pPa
1c800 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  rse;.  sqlite3Wa
1c810 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72  lkExpr(&w, pExpr
1c820 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  );.}.../*.** Gen
1c830 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
1c840 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65  pushes the value
1c850 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e   of every elemen
1c860 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a  t of the given.*
1c870 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
1c880 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63  t into a sequenc
1c890 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 62  e of registers b
1c8a0 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67  eginning at targ
1c8b0 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  et..**.** Return
1c8c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
1c8d0 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65  lements evaluate
1c8e0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1c8f0 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
1c900 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
1c910 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
1c920 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1c930 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
1c940 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
1c950 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20  sion list to be 
1c960 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74  coded */.  int t
1c970 61 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a  arget,        /*
1c980 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
1c990 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
1c9a0 20 64 6f 48 61 72 64 43 6f 70 79 20 20 20 20 20   doHardCopy     
1c9b0 2f 2a 20 4d 61 6b 65 20 61 20 68 61 72 64 20 63  /* Make a hard c
1c9c0 6f 70 79 20 6f 66 20 65 76 65 72 79 20 65 6c 65  opy of every ele
1c9d0 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  ment */.){.  str
1c9e0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1c9f0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
1ca00 69 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  i, n;.  assert( 
1ca10 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73  pList!=0 );.  as
1ca20 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29  sert( target>0 )
1ca30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
1ca40 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b 20  se->pVdbe!=0 ); 
1ca50 20 2f 2a 20 4e 65 76 65 72 20 67 65 74 73 20 74   /* Never gets t
1ca60 68 69 73 20 66 61 72 20 6f 74 68 65 72 77 69 73  his far otherwis
1ca70 65 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74  e */.  n = pList
1ca80 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28 70  ->nExpr;.  for(p
1ca90 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
1caa0 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49  =0; i<n; i++, pI
1cab0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  tem++){.    Expr
1cac0 20 2a 70 45 78 70 72 20 3d 20 70 49 74 65 6d 2d   *pExpr = pItem-
1cad0 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20  >pExpr;.    int 
1cae0 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
1caf0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
1cb00 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
1cb10 67 65 74 2b 69 29 3b 0a 20 20 20 20 69 66 28 20  get+i);.    if( 
1cb20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20  inReg!=target+i 
1cb30 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1cb40 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
1cb50 65 2d 3e 70 56 64 62 65 2c 20 64 6f 48 61 72 64  e->pVdbe, doHard
1cb60 43 6f 70 79 20 3f 20 4f 50 5f 43 6f 70 79 20 3a  Copy ? OP_Copy :
1cb70 20 4f 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20 20   OP_SCopy,.     
1cb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb90 20 20 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74     inReg, target
1cba0 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  +i);.    }.  }. 
1cbb0 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
1cbc0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1cbd0 65 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20  e for a BETWEEN 
1cbe0 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
1cbf0 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
1cc00 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ND z.**.** The a
1cc10 62 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c 65  bove is equivale
1cc20 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20  nt to .**.**    
1cc30 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a  x>=y AND x<=z.**
1cc40 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73  .** Code it as s
1cc50 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65  uch, taking care
1cc60 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f   to do the commo
1cc70 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a  n subexpression.
1cc80 2a 2a 20 65 6c 65 6d 65 6e 74 61 74 69 6f 6e 20  ** elementation 
1cc90 6f 66 20 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  of x..*/.static 
1cca0 76 6f 69 64 20 65 78 70 72 43 6f 64 65 42 65 74  void exprCodeBet
1ccb0 77 65 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  ween(.  Parse *p
1ccc0 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
1ccd0 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
1cce0 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
1ccf0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
1cd00 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42  r,      /* The B
1cd10 45 54 57 45 45 4e 20 65 78 70 72 65 73 73 69 6f  ETWEEN expressio
1cd20 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c  n */.  int dest,
1cd30 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
1cd40 20 68 65 72 65 20 69 66 20 74 68 65 20 6a 75 6d   here if the jum
1cd50 70 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20  p is taken */.  
1cd60 69 6e 74 20 6a 75 6d 70 49 66 54 72 75 65 2c 20  int jumpIfTrue, 
1cd70 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75    /* Take the ju
1cd80 6d 70 20 69 66 20 74 68 65 20 42 45 54 57 45 45  mp if the BETWEE
1cd90 4e 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69  N is true */.  i
1cda0 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20  nt jumpIfNull   
1cdb0 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d   /* Take the jum
1cdc0 70 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e  p if the BETWEEN
1cdd0 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   is NULL */.){. 
1cde0 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b 20 20   Expr exprAnd;  
1cdf0 20 20 20 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70     /* The AND op
1ce00 65 72 61 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20  erator in  x>=y 
1ce10 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45  AND x<=z  */.  E
1ce20 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20  xpr compLeft;   
1ce30 20 2f 2a 20 54 68 65 20 20 78 3e 3d 79 20 20 74   /* The  x>=y  t
1ce40 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f  erm */.  Expr co
1ce50 6d 70 52 69 67 68 74 3b 20 20 20 2f 2a 20 54 68  mpRight;   /* Th
1ce60 65 20 20 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f  e  x<=z  term */
1ce70 0a 20 20 45 78 70 72 20 65 78 70 72 58 3b 20 20  .  Expr exprX;  
1ce80 20 20 20 20 20 2f 2a 20 54 68 65 20 20 78 20 20       /* The  x  
1ce90 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  subexpression */
1cea0 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
1ceb0 3d 20 30 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72  = 0; /* Temporar
1cec0 79 20 75 73 65 20 72 65 67 69 73 74 65 72 20 2a  y use register *
1ced0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  /..  assert( !Ex
1cee0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1cef0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1cf00 74 29 20 29 3b 0a 20 20 65 78 70 72 58 20 3d 20  t) );.  exprX = 
1cf10 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20  *pExpr->pLeft;. 
1cf20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b   exprAnd.op = TK
1cf30 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e  _AND;.  exprAnd.
1cf40 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66  pLeft = &compLef
1cf50 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 52 69  t;.  exprAnd.pRi
1cf60 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74  ght = &compRight
1cf70 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20  ;.  compLeft.op 
1cf80 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c  = TK_GE;.  compL
1cf90 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  eft.pLeft = &exp
1cfa0 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70  rX;.  compLeft.p
1cfb0 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
1cfc0 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  .pList->a[0].pEx
1cfd0 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  pr;.  compRight.
1cfe0 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f  op = TK_LE;.  co
1cff0 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20  mpRight.pLeft = 
1d000 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69  &exprX;.  compRi
1d010 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78  ght.pRight = pEx
1d020 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31  pr->x.pList->a[1
1d030 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78 70 72 58  ].pExpr;.  exprX
1d040 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65  .iTable = sqlite
1d050 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1d060 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72  arse, &exprX, &r
1d070 65 67 46 72 65 65 31 29 3b 0a 20 20 65 78 70 72  egFree1);.  expr
1d080 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54  X.op = TK_REGIST
1d090 45 52 3b 0a 20 20 69 66 28 20 6a 75 6d 70 49 66  ER;.  if( jumpIf
1d0a0 54 72 75 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  True ){.    sqli
1d0b0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
1d0c0 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20  arse, &exprAnd, 
1d0d0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1d0e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1d0f0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1d100 73 65 28 70 50 61 72 73 65 2c 20 26 65 78 70 72  se(pParse, &expr
1d110 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  And, dest, jumpI
1d120 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71  fNull);.  }.  sq
1d130 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1d140 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
1d150 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73  ree1);..  /* Ens
1d160 75 72 65 20 61 64 65 71 75 61 74 65 20 74 65 73  ure adequate tes
1d170 74 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20  t coverage */.  
1d180 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1d190 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49  True==0 && jumpI
1d1a0 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46  fNull==0 && regF
1d1b0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
1d1c0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
1d1d0 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e==0 && jumpIfNu
1d1e0 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
1d1f0 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1!=0 );.  testca
1d200 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d  se( jumpIfTrue==
1d210 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  0 && jumpIfNull!
1d220 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
1d230 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
1d240 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26   jumpIfTrue==0 &
1d250 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
1d260 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
1d270 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
1d280 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a  mpIfTrue!=0 && j
1d290 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
1d2a0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1d2b0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1d2c0 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70  fTrue!=0 && jump
1d2d0 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
1d2e0 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
1d2f0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
1d300 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue!=0 && jumpIfN
1d310 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
1d320 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
1d330 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21  ase( jumpIfTrue!
1d340 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
1d350 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  !=0 && regFree1!
1d360 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  =0 );.}../*.** G
1d370 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1d380 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
1d390 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
1d3a0 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
1d3b0 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
1d3c0 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
1d3d0 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20  ression is true 
1d3e0 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
1d3f0 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
1d400 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
1d410 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
1d420 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  lse..**.** If th
1d430 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
1d440 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
1d450 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
1d460 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a   false), then.**
1d470 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   take the jump i
1d480 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c  f the jumpIfNull
1d490 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f   flag is SQLITE_
1d4a0 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  JUMPIFNULL..**.*
1d4b0 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65  * This code depe
1d4c0 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20  nds on the fact 
1d4d0 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b  that certain tok
1d4e0 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54  en values (ex: T
1d4f0 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65  K_EQ).** are the
1d500 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20   same as opcode 
1d510 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45  values (ex: OP_E
1d520 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  q) that implemen
1d530 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  t the correspond
1d540 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ing.** operation
1d550 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65  .  Special comme
1d560 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e  nts in vdbe.c an
1d570 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  d the mkopcodeh.
1d580 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a  awk script in.**
1d590 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73   the make proces
1d5a0 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61  s cause these va
1d5b0 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20  lues to align.  
1d5c0 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65  Assert()s in the
1d5d0 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76   code.** below v
1d5e0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e  erify that the n
1d5f0 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e  umbers are align
1d600 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f  ed correctly..*/
1d610 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1d620 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70  rIfTrue(Parse *p
1d630 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
1d640 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
1d650 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
1d660 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1d670 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
1d680 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  op = 0;.  int re
1d690 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e  gFree1 = 0;.  in
1d6a0 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  t regFree2 = 0;.
1d6b0 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20    int r1, r2;.. 
1d6c0 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e   assert( jumpIfN
1d6d0 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50  ull==SQLITE_JUMP
1d6e0 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66  IFNULL || jumpIf
1d6f0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Null==0 );.  if(
1d700 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 20   NEVER(v==0) )  
1d710 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45     return;  /* E
1d720 78 69 73 74 61 6e 63 65 20 6f 66 20 56 44 42 45  xistance of VDBE
1d730 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c   checked by call
1d740 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  er */.  if( NEVE
1d750 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72 65  R(pExpr==0) ) re
1d760 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79  turn;  /* No way
1d770 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
1d780 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70 72   */.  op = pExpr
1d790 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20  ->op;.  switch( 
1d7a0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
1d7b0 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69  K_AND: {.      i
1d7c0 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
1d7d0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1d7e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d7f0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1d800 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1d810 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
1d820 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
1d830 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
1d840 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1d850 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75  eft, d2,jumpIfNu
1d860 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  ll^SQLITE_JUMPIF
1d870 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
1d880 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
1d890 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1d8a0 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
1d8b0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
1d8c0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1d8d0 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
1d8e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1d8f0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c  CachePop(pParse,
1d900 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   1);.      break
1d910 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1d920 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
1d930 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1d940 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1d950 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
1d960 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
1d970 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
1d980 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1d990 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
1d9a0 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
1d9b0 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
1d9c0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1d9d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d9e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
1d9f0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1da00 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1da10 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1da20 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
1da30 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1da40 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
1da50 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
1da60 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1da70 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
1da80 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
1da90 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
1daa0 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
1dab0 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
1dac0 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
1dad0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
1dae0 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20  =OP_Lt );.      
1daf0 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f  assert( TK_LE==O
1db00 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Le );.      as
1db10 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f  sert( TK_GT==OP_
1db20 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Gt );.      asse
1db30 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  rt( TK_GE==OP_Ge
1db40 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1db50 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29  ( TK_EQ==OP_Eq )
1db60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1db70 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a  TK_NE==OP_Ne );.
1db80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1db90 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20  op==TK_LT );.   
1dba0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1dbb0 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20  =TK_LE );.      
1dbc0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1dbd0 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GT );.      tes
1dbe0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45  tcase( op==TK_GE
1dbf0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1dc00 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b  se( op==TK_EQ );
1dc10 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1dc20 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20   op==TK_NE );.  
1dc30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1dc40 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1dc50 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1dc60 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1dc70 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1dc80 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1dc90 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
1dca0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1dcb0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1dcc0 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
1dcd0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
1dce0 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
1dcf0 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
1dd00 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
1dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1dd20 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d  1, r2, dest, jum
1dd30 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1dd40 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1dd50 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1dd60 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1dd70 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
1dd80 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1dd90 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
1dda0 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a  ase TK_ISNOT: {.
1ddb0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ddc0 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
1ddd0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1dde0 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20  =TK_ISNOT );.   
1ddf0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1de00 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1de10 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1de20 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1de30 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1de40 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1de50 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1de60 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
1de70 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d        op = (op==
1de80 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a  TK_IS) ? TK_EQ :
1de90 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f   TK_NE;.      co
1dea0 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
1deb0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1dec0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
1ded0 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
1dee0 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
1def0 74 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  t, SQLITE_NULLEQ
1df00 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1df10 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1df20 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1df30 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1df40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1df50 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1df60 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
1df70 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
1df80 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1df90 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
1dfa0 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  l );.      asser
1dfb0 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
1dfc0 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20  P_NotNull );.   
1dfd0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1dfe0 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =TK_ISNULL );.  
1dff0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1e000 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a  ==TK_NOTNULL );.
1e010 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1e020 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1e030 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1e040 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1e050 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1e060 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
1e070 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  r1, dest);.     
1e080 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1e090 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1e0a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1e0b0 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
1e0c0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1e0d0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1e0e0 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43  0 );.      exprC
1e0f0 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73  odeBetween(pPars
1e100 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
1e110 31 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  1, jumpIfNull);.
1e120 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e130 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1e140 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1e150 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
1e160 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  {.      int dest
1e170 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65  IfFalse = sqlite
1e180 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1e190 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73  );.      int des
1e1a0 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66  tIfNull = jumpIf
1e1b0 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65  Null ? dest : de
1e1c0 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20  stIfFalse;.     
1e1d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e1e0 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
1e1f0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64  , destIfFalse, d
1e200 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
1e210 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e220 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1e230 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  0, dest);.      
1e240 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1e250 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49  veLabel(v, destI
1e260 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 62  fFalse);.      b
1e270 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
1e280 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  if.    default: 
1e290 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  {.      r1 = sql
1e2a0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1e2b0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1e2c0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1e2d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e2e0 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31  Op3(v, OP_If, r1
1e2f0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1e300 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 74 65  ll!=0);.      te
1e310 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1e320 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
1e330 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1e340 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  l==0 );.      br
1e350 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
1e360 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1e370 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1e380 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69  egFree1);.  sqli
1e390 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1e3a0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
1e3b0 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e2);  .}../*.** 
1e3c0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
1e3d0 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72  r a boolean expr
1e3e0 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74  ession such that
1e3f0 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a   a jump is made.
1e400 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20  ** to the label 
1e410 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78  "dest" if the ex
1e420 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
1e430 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a  e but execution.
1e440 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72  ** continues str
1e450 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68  aight thru if th
1e460 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1e470 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  true..**.** If t
1e480 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  he expression ev
1e490 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20  aluates to NULL 
1e4a0 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f  (neither true no
1e4b0 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a  r false) then.**
1e4c0 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e   jump if jumpIfN
1e4d0 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55  ull is SQLITE_JU
1e4e0 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c  MPIFNULL or fall
1e4f0 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70   through if jump
1e500 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a  IfNull.** is 0..
1e510 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1e520 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73 65  xprIfFalse(Parse
1e530 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1e540 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
1e550 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
1e560 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1e570 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1e580 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74  nt op = 0;.  int
1e590 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
1e5a0 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20   int regFree2 = 
1e5b0 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  0;.  int r1, r2;
1e5c0 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70  ..  assert( jump
1e5d0 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a  IfNull==SQLITE_J
1e5e0 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d  UMPIFNULL || jum
1e5f0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1e600 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
1e610 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69  ) return; /* Exi
1e620 73 74 61 6e 63 65 20 6f 66 20 56 44 42 45 20 63  stance of VDBE c
1e630 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72  hecked by caller
1e640 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d   */.  if( pExpr=
1e650 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e 3b 0a  =0 )    return;.
1e660 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
1e670 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64  of pExpr->op and
1e680 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64 20   op are related 
1e690 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a  as follows:.  **
1e6a0 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70  .  **       pExp
1e6b0 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20  r->op           
1e6c0 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d   op.  **       -
1e6d0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20  --------        
1e6e0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a    ----------.  *
1e6f0 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c  *       TK_ISNUL
1e700 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f  L          OP_No
1e710 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20  tNull.  **      
1e720 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20   TK_NOTNULL     
1e730 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20      OP_IsNull.  
1e740 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20  **       TK_NE  
1e750 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45              OP_E
1e760 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  q.  **       TK_
1e770 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EQ              
1e780 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Ne.  **      
1e790 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20   TK_GT          
1e7a0 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20      OP_Le.  **  
1e7b0 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20       TK_LE      
1e7c0 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20          OP_Gt.  
1e7d0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20  **       TK_GE  
1e7e0 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c              OP_L
1e7f0 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  t.  **       TK_
1e800 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LT              
1e810 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20  OP_Ge.  **.  ** 
1e820 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73  For other values
1e830 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f   of pExpr->op, o
1e840 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61  p is undefined a
1e850 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20  nd unused..  ** 
1e860 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f  The value of TK_
1e870 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e   and OP_ constan
1e880 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64 20  ts are arranged 
1e890 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a  such that we.  *
1e8a0 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  * can compute th
1e8b0 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20  e mapping above 
1e8c0 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  using the follow
1e8d0 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ing expression..
1e8e0 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76    ** Assert()s v
1e8f0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
1e900 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f  omputation is co
1e910 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70  rrect..  */.  op
1e920 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28   = ((pExpr->op+(
1e930 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29  TK_ISNULL&1))^1)
1e940 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a  -(TK_ISNULL&1);.
1e950 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72  .  /* Verify cor
1e960 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f  rect alignment o
1e970 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f  f TK_ and OP_ co
1e980 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61  nstants.  */.  a
1e990 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1e9a0 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f  !=TK_ISNULL || o
1e9b0 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  p==OP_NotNull );
1e9c0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1e9d0 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op!=TK_NOTNULL
1e9e0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c   || op==OP_IsNul
1e9f0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
1ea00 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20  Expr->op!=TK_NE 
1ea10 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a  || op==OP_Eq );.
1ea20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1ea30 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70  >op!=TK_EQ || op
1ea40 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73  ==OP_Ne );.  ass
1ea50 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
1ea60 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_LT || op==OP_
1ea70 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Ge );.  assert( 
1ea80 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45  pExpr->op!=TK_LE
1ea90 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b   || op==OP_Gt );
1eaa0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1eab0 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f  ->op!=TK_GT || o
1eac0 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73  p==OP_Le );.  as
1ead0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
1eae0 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_GE || op==OP
1eaf0 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  _Lt );..  switch
1eb00 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
1eb10 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
1eb20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1eb30 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1eb40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1eb50 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1eb60 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1eb70 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1eb80 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
1eb90 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
1eba0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1ebb0 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
1ebc0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
1ebd0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1ebe0 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20  ase TK_OR: {.   
1ebf0 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
1ec00 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1ec10 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  (v);.      testc
1ec20 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1ec30 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1ec40 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
1ec50 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1ec60 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
1ec70 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1ec80 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70  >pLeft, d2, jump
1ec90 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55  IfNull^SQLITE_JU
1eca0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
1ecb0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
1ecc0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
1ecd0 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
1ece0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1ecf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1ed00 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
1ed10 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
1ed20 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
1ed30 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  arse, 1);.      
1ed40 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1ed50 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
1ed60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ed70 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1ed80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1ed90 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
1eda0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
1edb0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1edc0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1edd0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1ede0 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
1edf0 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
1ee00 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
1ee10 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
1ee20 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
1ee30 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  _EQ: {.      tes
1ee40 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54  tcase( op==TK_LT
1ee50 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1ee60 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b  se( op==TK_LE );
1ee70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ee80 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20   op==TK_GT );.  
1ee90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1eea0 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20  ==TK_GE );.     
1eeb0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1eec0 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65  K_EQ );.      te
1eed0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
1eee0 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
1eef0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1ef00 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  =0 );.      r1 =
1ef10 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ef20 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1ef30 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1ef40 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
1ef50 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1ef60 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1ef70 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
1ef80 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63  gFree2);.      c
1ef90 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
1efa0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1efb0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1efc0 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
1efd0 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65        r1, r2, de
1efe0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1eff0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f000 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1f010 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f020 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
1f030 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f040 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
1f050 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  :.    case TK_IS
1f060 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
1f070 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
1f080 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20  ==TK_IS );.     
1f090 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
1f0a0 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ->op==TK_ISNOT )
1f0b0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
1f0c0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1f0d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1f0e0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1f0f0 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
1f100 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1f110 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1f120 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
1f130 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20  e2);.      op = 
1f140 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  (pExpr->op==TK_I
1f150 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f  S) ? TK_NE : TK_
1f160 45 51 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  EQ;.      codeCo
1f170 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
1f180 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
1f190 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
1f1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1b0 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 53   r1, r2, dest, S
1f1c0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
1f1d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1f1e0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1f1f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1f200 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
1f210 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f220 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
1f230 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
1f240 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
1f250 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f260 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  K_ISNULL );.    
1f270 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f280 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
1f290 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1f2a0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1f2b0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1f2c0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1f2d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f2e0 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31  AddOp2(v, op, r1
1f2f0 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74  , dest);.      t
1f300 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1f310 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  1==0 );.      br
1f320 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1f330 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
1f340 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1f350 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1f360 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64  );.      exprCod
1f370 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c  eBetween(pParse,
1f380 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 30 2c   pExpr, dest, 0,
1f390 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1f3a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f3b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f3c0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
1f3d0 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
1f3e0 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66        if( jumpIf
1f3f0 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
1f400 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
1f410 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
1f420 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20   dest, dest);.  
1f430 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f440 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c     int destIfNul
1f450 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
1f460 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
1f470 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1f480 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
1f490 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74  Expr, dest, dest
1f4a0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  IfNull);.       
1f4b0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1f4c0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
1f4d0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d  IfNull);.      }
1f4e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f4f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
1f500 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
1f510 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1f520 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1f530 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65   pExpr, &regFree
1f540 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
1f550 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1f560 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73  P_IfNot, r1, des
1f570 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  t, jumpIfNull!=0
1f580 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f590 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1f5a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f5b0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1f5c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f5d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1f5e0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1f5f0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
1f600 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  e1);.  sqlite3Re
1f610 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1f620 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a  rse, regFree2);.
1f630 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65  }../*.** Do a de
1f640 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66  ep comparison of
1f650 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20   two expression 
1f660 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30  trees.  Return 0
1f670 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65   if the two.** e
1f680 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63  xpressions are c
1f690 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69  ompletely identi
1f6a0 63 61 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69  cal.  Return 1 i
1f6b0 66 20 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e  f they differ on
1f6c0 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41  ly.** by a COLLA
1f6d0 54 45 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74  TE operator at t
1f6e0 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52  he top level.  R
1f6f0 65 74 75 72 6e 20 32 20 69 66 20 74 68 65 72 65  eturn 2 if there
1f700 20 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73   are differences
1f710 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74  .** other than t
1f720 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c  he top-level COL
1f730 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  LATE operator..*
1f740 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74  *.** Sometimes t
1f750 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1f760 20 72 65 74 75 72 6e 20 32 20 65 76 65 6e 20 69   return 2 even i
1f770 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65 73  f the two expres
1f780 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20  sions.** really 
1f790 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20  are equivalent. 
1f7a0 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72   If we cannot pr
1f7b0 6f 76 65 20 74 68 61 74 20 74 68 65 20 65 78 70  ove that the exp
1f7c0 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20  ressions are.** 
1f7d0 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65  identical, we re
1f7e0 74 75 72 6e 20 32 20 6a 75 73 74 20 74 6f 20 62  turn 2 just to b
1f7f0 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74  e safe.  So if t
1f800 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
1f810 65 74 75 72 6e 73 20 32 2c 20 74 68 65 6e 20 79  eturns 2, then y
1f820 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79  ou do not really
1f830 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69   know for certai
1f840 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20  n if the two.** 
1f850 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
1f860 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69  the same.  But i
1f870 66 20 79 6f 75 20 67 65 74 20 61 20 30 20 6f 72  f you get a 0 or
1f880 20 31 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20   1 return, then 
1f890 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75  you.** can be su
1f8a0 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  re the expressio
1f8b0 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e  ns are the same.
1f8c0 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20    In the places 
1f8d0 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  where.** this ro
1f8e0 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69  utine is used, i
1f8f0 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20  t does not hurt 
1f900 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61 20  to get an extra 
1f910 32 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74  2 - that.** just
1f920 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e   might result in
1f930 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73   some slightly s
1f940 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74  lower code.  But
1f950 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e   returning.** an
1f960 20 69 6e 63 6f 72 72 65 63 74 20 30 20 6f 72 20   incorrect 0 or 
1f970 31 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  1 could lead to 
1f980 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a  a malfunction..*
1f990 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
1f9a0 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70  rCompare(Expr *p
1f9b0 41 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a 20 20  A, Expr *pB){.  
1f9c0 69 66 28 20 70 41 3d 3d 30 7c 7c 70 42 3d 3d 30  if( pA==0||pB==0
1f9d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
1f9e0 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20  B==pA ? 0 : 2;. 
1f9f0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 45 78   }.  assert( !Ex
1fa00 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
1fa10 28 70 41 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  (pA, EP_TokenOnl
1fa20 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
1fa30 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
1fa40 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
1fa50 42 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  B, EP_TokenOnly|
1fa60 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
1fa70 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
1fa80 65 72 74 79 28 70 41 2c 20 45 50 5f 78 49 73 53  erty(pA, EP_xIsS
1fa90 65 6c 65 63 74 29 20 7c 7c 20 45 78 70 72 48 61  elect) || ExprHa
1faa0 73 50 72 6f 70 65 72 74 79 28 70 42 2c 20 45 50  sProperty(pB, EP
1fab0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
1fac0 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
1fad0 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67  .  if( (pA->flag
1fae0 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29  s & EP_Distinct)
1faf0 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45  !=(pB->flags & E
1fb00 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72 65  P_Distinct) ) re
1fb10 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 70 41  turn 2;.  if( pA
1fb20 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a  ->op!=pB->op ){.
1fb30 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d      if( pA->op==
1fb40 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71  TK_COLLATE && sq
1fb50 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
1fb60 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 29 3c  (pA->pLeft, pB)<
1fb70 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  2 ){.      retur
1fb80 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
1fb90 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pB->op==TK_CO
1fba0 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33  LLATE && sqlite3
1fbb0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2c 20  ExprCompare(pA, 
1fbc0 70 42 2d 3e 70 4c 65 66 74 29 3c 32 20 29 7b 0a  pB->pLeft)<2 ){.
1fbd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1fbe0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1fbf0 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   2;.  }.  if( sq
1fc00 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
1fc10 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e  (pA->pLeft, pB->
1fc20 70 4c 65 66 74 29 20 29 20 72 65 74 75 72 6e 20  pLeft) ) return 
1fc30 32 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  2;.  if( sqlite3
1fc40 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
1fc50 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67  pRight, pB->pRig
1fc60 68 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ht) ) return 2;.
1fc70 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1fc80 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 41 2d  rListCompare(pA-
1fc90 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e  >x.pList, pB->x.
1fca0 70 4c 69 73 74 29 20 29 20 72 65 74 75 72 6e 20  pList) ) return 
1fcb0 32 3b 0a 20 20 69 66 28 20 70 41 2d 3e 69 54 61  2;.  if( pA->iTa
1fcc0 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20  ble!=pB->iTable 
1fcd0 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  || pA->iColumn!=
1fce0 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65  pB->iColumn ) re
1fcf0 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 45 78  turn 2;.  if( Ex
1fd00 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 41  prHasProperty(pA
1fd10 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1fd20 7b 0a 20 20 20 20 69 66 28 20 21 45 78 70 72 48  {.    if( !ExprH
1fd30 61 73 50 72 6f 70 65 72 74 79 28 70 42 2c 20 45  asProperty(pB, E
1fd40 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70  P_IntValue) || p
1fd50 41 2d 3e 75 2e 69 56 61 6c 75 65 21 3d 70 42 2d  A->u.iValue!=pB-
1fd60 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20 20  >u.iValue ){.   
1fd70 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20     return 2;.   
1fd80 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
1fd90 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  A->op!=TK_COLUMN
1fda0 20 26 26 20 41 4c 57 41 59 53 28 70 41 2d 3e 6f   && ALWAYS(pA->o
1fdb0 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p!=TK_AGG_COLUMN
1fdc0 29 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65  ) && pA->u.zToke
1fdd0 6e 29 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72  n){.    if( Expr
1fde0 48 61 73 50 72 6f 70 65 72 74 79 28 70 42 2c 20  HasProperty(pB, 
1fdf0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20  EP_IntValue) || 
1fe00 4e 45 56 45 52 28 70 42 2d 3e 75 2e 7a 54 6f 6b  NEVER(pB->u.zTok
1fe10 65 6e 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  en==0) ) return 
1fe20 32 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  2;.    if( strcm
1fe30 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70  p(pA->u.zToken,p
1fe40 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20  B->u.zToken)!=0 
1fe50 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1fe60 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41  pA->op==TK_COLLA
1fe70 54 45 20 3f 20 31 20 3a 20 32 3b 0a 20 20 20 20  TE ? 1 : 2;.    
1fe80 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 41 2d  }.  }.  if( (pA-
1fe90 3e 66 6c 61 67 73 26 45 50 5f 43 6f 6c 6c 61 74  >flags&EP_Collat
1fea0 65 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 26 45  e)!=(pB->flags&E
1feb0 50 5f 43 6f 6c 6c 61 74 65 29 20 29 20 72 65 74  P_Collate) ) ret
1fec0 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
1fed0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  0;.}../*.** Comp
1fee0 61 72 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74  are two ExprList
1fef0 20 6f 62 6a 65 63 74 73 2e 20 20 52 65 74 75 72   objects.  Retur
1ff00 6e 20 30 20 69 66 20 74 68 65 79 20 61 72 65 20  n 0 if they are 
1ff10 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a  identical and .*
1ff20 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  * non-zero if th
1ff30 65 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79  ey differ in any
1ff40 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   way..**.** This
1ff50 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72   routine might r
1ff60 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66  eturn non-zero f
1ff70 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 45 78  or equivalent Ex
1ff80 70 72 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a  prLists.  The.**
1ff90 20 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63   only consequenc
1ffa0 65 20 77 69 6c 6c 20 62 65 20 64 69 73 61 62 6c  e will be disabl
1ffb0 65 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  ed optimizations
1ffc0 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74  .  But this rout
1ffd0 69 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65  ine.** must neve
1ffe0 72 20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68  r return 0 if th
1fff0 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f  e two ExprList o
20000 62 6a 65 63 74 73 20 61 72 65 20 64 69 66 66 65  bjects are diffe
20010 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61  rent, or.** a ma
20020 6c 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72  lfunction will r
20030 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f  esult..**.** Two
20040 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61   NULL pointers a
20050 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  re considered to
20060 20 62 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42   be the same.  B
20070 75 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  ut a NULL pointe
20080 72 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69 66 66  r.** always diff
20090 65 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e  ers from a non-N
200a0 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  ULL pointer..*/.
200b0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4c  int sqlite3ExprL
200c0 69 73 74 43 6f 6d 70 61 72 65 28 45 78 70 72 4c  istCompare(ExprL
200d0 69 73 74 20 2a 70 41 2c 20 45 78 70 72 4c 69 73  ist *pA, ExprLis
200e0 74 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b  t *pB){.  int i;
200f0 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 26 26 20  .  if( pA==0 && 
20100 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  pB==0 ) return 0
20110 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c  ;.  if( pA==0 ||
20120 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   pB==0 ) return 
20130 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45 78  1;.  if( pA->nEx
20140 70 72 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20  pr!=pB->nExpr ) 
20150 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28  return 1;.  for(
20160 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72  i=0; i<pA->nExpr
20170 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
20180 20 2a 70 45 78 70 72 41 20 3d 20 70 41 2d 3e 61   *pExprA = pA->a
20190 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 45  [i].pExpr;.    E
201a0 78 70 72 20 2a 70 45 78 70 72 42 20 3d 20 70 42  xpr *pExprB = pB
201b0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
201c0 20 20 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73    if( pA->a[i].s
201d0 6f 72 74 4f 72 64 65 72 21 3d 70 42 2d 3e 61 5b  ortOrder!=pB->a[
201e0 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72  i].sortOrder ) r
201f0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28  eturn 1;.    if(
20200 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
20210 61 72 65 28 70 45 78 70 72 41 2c 20 70 45 78 70  are(pExprA, pExp
20220 72 42 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  rB) ) return 1;.
20230 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
20240 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  }../*.** An inst
20250 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
20260 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
20270 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74  is used by the t
20280 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f  ree walker.** to
20290 20 63 6f 75 6e 74 20 72 65 66 65 72 65 6e 63 65   count reference
202a0 73 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d  s to table colum
202b0 6e 73 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  ns in the argume
202c0 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67  nts of an .** ag
202d0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
202e0 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d  , in order to im
202f0 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73  plement the.** s
20300 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 54 68  qlite3FunctionTh
20310 69 73 53 72 63 28 29 20 72 6f 75 74 69 6e 65 2e  isSrc() routine.
20320 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72 63 43 6f  .*/.struct SrcCo
20330 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73 74 20  unt {.  SrcList 
20340 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20  *pSrc;   /* One 
20350 70 61 72 74 69 63 75 6c 61 72 20 46 52 4f 4d 20  particular FROM 
20360 63 6c 61 75 73 65 20 69 6e 20 61 20 6e 65 73 74  clause in a nest
20370 65 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  ed query */.  in
20380 74 20 6e 54 68 69 73 3b 20 20 20 20 20 20 20 2f  t nThis;       /
20390 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  * Number of refe
203a0 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e  rences to column
203b0 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f  s in pSrcList */
203c0 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20  .  int nOther;  
203d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
203e0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
203f0 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20  olumns in other 
20400 46 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a  FROM clauses */.
20410 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  };../*.** Count 
20420 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
20430 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
20440 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  mns..*/.static i
20450 6e 74 20 65 78 70 72 53 72 63 43 6f 75 6e 74 28  nt exprSrcCount(
20460 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
20470 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
20480 20 2f 2a 20 54 68 65 20 4e 45 56 45 52 28 29 20   /* The NEVER() 
20490 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 74 65  on the second te
204a0 72 6d 20 69 73 20 62 65 63 61 75 73 65 20 73 71  rm is because sq
204b0 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65  lite3FunctionUse
204c0 73 54 68 69 73 53 72 63 28 29 0a 20 20 2a 2a 20  sThisSrc().  ** 
204d0 69 73 20 61 6c 77 61 79 73 20 63 61 6c 6c 65 64  is always called
204e0 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 45   before sqlite3E
204f0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
20500 61 74 65 73 28 29 20 61 6e 64 20 73 6f 20 74 68  ates() and so th
20510 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e  e.  ** TK_COLUMN
20520 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62  s have not yet b
20530 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  een converted in
20540 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  to TK_AGG_COLUMN
20550 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74  .  If.  ** sqlit
20560 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68  e3FunctionUsesTh
20570 69 73 53 72 63 28 29 20 69 73 20 75 73 65 64 20  isSrc() is used 
20580 64 69 66 66 65 72 65 6e 74 6c 79 20 69 6e 20 74  differently in t
20590 68 65 20 66 75 74 75 72 65 2c 20 74 68 65 0a 20  he future, the. 
205a0 20 2a 2a 20 4e 45 56 45 52 28 29 20 77 69 6c 6c   ** NEVER() will
205b0 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 6d 6f   need to be remo
205c0 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45  ved. */.  if( pE
205d0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
205e0 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45 78 70  MN || NEVER(pExp
205f0 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
20600 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74  LUMN) ){.    int
20610 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53   i;.    struct S
20620 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61  rcCount *p = pWa
20630 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e  lker->u.pSrcCoun
20640 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  t;.    SrcList *
20650 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
20660 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
20670 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  Src->nSrc; i++){
20680 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
20690 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e  ->iTable==pSrc->
206a0 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20 62  a[i].iCursor ) b
206b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
206c0 69 66 28 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  if( i<pSrc->nSrc
206d0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 68   ){.      p->nTh
206e0 69 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  is++;.    }else{
206f0 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 74 68 65 72  .      p->nOther
20700 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
20710 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
20720 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  nue;.}../*.** De
20730 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 79 20 6f  termine if any o
20740 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  f the arguments 
20750 74 6f 20 74 68 65 20 70 45 78 70 72 20 46 75 6e  to the pExpr Fun
20760 63 74 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 0a  ction reference.
20770 2a 2a 20 70 53 72 63 4c 69 73 74 2e 20 20 52 65  ** pSrcList.  Re
20780 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
20790 79 20 64 6f 2e 20 20 41 6c 73 6f 20 72 65 74 75  y do.  Also retu
207a0 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 66  rn true if the f
207b0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e  unction.** has n
207c0 6f 20 61 72 67 75 6d 65 6e 74 73 20 6f 72 20 68  o arguments or h
207d0 61 73 20 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74  as only constant
207e0 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74   arguments.  Ret
207f0 75 72 6e 20 66 61 6c 73 65 20 69 66 20 70 45 78  urn false if pEx
20800 70 72 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  pr.** references
20810 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 6e 6f 74   columns but not
20820 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 61 62 6c   columns of tabl
20830 65 73 20 66 6f 75 6e 64 20 69 6e 20 70 53 72 63  es found in pSrc
20840 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  List..*/.int sql
20850 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73  ite3FunctionUses
20860 54 68 69 73 53 72 63 28 45 78 70 72 20 2a 70 45  ThisSrc(Expr *pE
20870 78 70 72 2c 20 53 72 63 4c 69 73 74 20 2a 70 53  xpr, SrcList *pS
20880 72 63 4c 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65  rcList){.  Walke
20890 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20 53 72  r w;.  struct Sr
208a0 63 43 6f 75 6e 74 20 63 6e 74 3b 0a 20 20 61 73  cCount cnt;.  as
208b0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
208c0 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
208d0 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c   );.  memset(&w,
208e0 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
208f0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
20900 6b 20 3d 20 65 78 70 72 53 72 63 43 6f 75 6e 74  k = exprSrcCount
20910 3b 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e  ;.  w.u.pSrcCoun
20920 74 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e  t = &cnt;.  cnt.
20930 70 53 72 63 20 3d 20 70 53 72 63 4c 69 73 74 3b  pSrc = pSrcList;
20940 0a 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30  .  cnt.nThis = 0
20950 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d  ;.  cnt.nOther =
20960 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   0;.  sqlite3Wal
20970 6b 45 78 70 72 4c 69 73 74 28 26 77 2c 20 70 45  kExprList(&w, pE
20980 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  xpr->x.pList);. 
20990 20 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69   return cnt.nThi
209a0 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65  s>0 || cnt.nOthe
209b0 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  r==0;.}../*.** A
209c0 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
209d0 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f   to the pAggInfo
209e0 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20  ->aCol[] array. 
209f0 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
20a00 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  x of.** the new 
20a10 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  element.  Return
20a20 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
20a30 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  er if malloc fai
20a40 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
20a50 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75  t addAggInfoColu
20a60 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  mn(sqlite3 *db, 
20a70 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b  AggInfo *pInfo){
20a80 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66  .  int i;.  pInf
20a90 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65  o->aCol = sqlite
20aa0 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
20ab0 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20         db,.     
20ac0 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20    pInfo->aCol,. 
20ad0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e        sizeof(pIn
20ae0 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20  fo->aCol[0]),.  
20af0 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f       &pInfo->nCo
20b00 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a  lumn,.       &i.
20b10 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b    );.  return i;
20b20 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64  .}    ../*.** Ad
20b30 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
20b40 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d  to the pAggInfo-
20b50 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20  >aFunc[] array. 
20b60 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
20b70 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  x of.** the new 
20b80 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  element.  Return
20b90 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
20ba0 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  er if malloc fai
20bb0 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
20bc0 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63  t addAggInfoFunc
20bd0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67  (sqlite3 *db, Ag
20be0 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20  gInfo *pInfo){. 
20bf0 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d   int i;.  pInfo-
20c00 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  >aFunc = sqlite3
20c10 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
20c20 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20        db, .     
20c30 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a    pInfo->aFunc,.
20c40 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49         sizeof(pI
20c50 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a  nfo->aFunc[0]),.
20c60 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
20c70 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 69 0a  Func,.       &i.
20c80 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b    );.  return i;
20c90 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68  .}    ../*.** Th
20ca0 69 73 20 69 73 20 74 68 65 20 78 45 78 70 72 43  is is the xExprC
20cb0 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74 72  allback for a tr
20cc0 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20 69  ee walker.  It i
20cd0 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70  s used to.** imp
20ce0 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45 78  lement sqlite3Ex
20cf0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
20d00 74 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69  tes().  See sqli
20d10 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
20d20 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20  gregates.** for 
20d30 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
20d40 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  mation..*/.stati
20d50 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67  c int analyzeAgg
20d60 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a 70  regate(Walker *p
20d70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
20d80 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  xpr){.  int i;. 
20d90 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
20da0 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  C = pWalker->u.p
20db0 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  NC;.  Parse *pPa
20dc0 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
20dd0 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  e;.  SrcList *pS
20de0 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53  rcList = pNC->pS
20df0 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66  rcList;.  AggInf
20e00 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e  o *pAggInfo = pN
20e10 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20  C->pAggInfo;..  
20e20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
20e30 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
20e40 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  _AGG_COLUMN:.   
20e50 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
20e60 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
20e70 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
20e80 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
20e90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
20ea0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
20eb0 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  UMN );.      /* 
20ec0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
20ed0 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e  the column is in
20ee0 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c   one of the tabl
20ef0 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20  es in the FROM. 
20f00 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f       ** clause o
20f10 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
20f20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69  query */.      i
20f30 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c 69  f( ALWAYS(pSrcLi
20f40 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  st!=0) ){.      
20f50 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
20f60 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70  _item *pItem = p
20f70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  SrcList->a;.    
20f80 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
20f90 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  SrcList->nSrc; i
20fa0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
20fb0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
20fc0 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
20fd0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
20fe0 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79 50  rt( !ExprHasAnyP
20ff0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
21000 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
21010 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20  educed) );.     
21020 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
21030 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69  iTable==pItem->i
21040 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
21050 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72        /* If we r
21060 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
21070 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70   it means that p
21080 45 78 70 72 20 72 65 66 65 72 73 20 74 6f 20 61  Expr refers to a
21090 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20   table.         
210a0 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e     ** that is in
210b0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
210c0 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74   of the aggregat
210d0 65 20 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20  e query.  .     
210e0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
210f0 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e        ** Make an
21100 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63   entry for the c
21110 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66  olumn in pAggInf
21120 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65  o->aCol[] if the
21130 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  re.            *
21140 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72  * is not an entr
21150 79 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  y there already.
21160 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
21170 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
21180 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  k;.            p
21190 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  Col = pAggInfo->
211a0 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  aCol;.          
211b0 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67    for(k=0; k<pAg
211c0 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  gInfo->nColumn; 
211d0 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  k++, pCol++){.  
211e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
211f0 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45  pCol->iTable==pE
21200 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20  xpr->iTable &&. 
21210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21220 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d   pCol->iColumn==
21230 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29  pExpr->iColumn )
21240 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
21250 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
21260 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21270 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
21280 20 20 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49     if( (k>=pAggI
21290 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20  nfo->nColumn).  
212a0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6b             && (k
212b0 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c   = addAggInfoCol
212c0 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  umn(pParse->db, 
212d0 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20  pAggInfo))>=0 . 
212e0 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
212f0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
21300 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43   = &pAggInfo->aC
21310 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20  ol[k];.         
21320 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20       pCol->pTab 
21330 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20  = pExpr->pTab;. 
21340 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
21350 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70  l->iTable = pExp
21360 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  r->iTable;.     
21370 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
21380 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e  Column = pExpr->
21390 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  iColumn;.       
213a0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65         pCol->iMe
213b0 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
213c0 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
213d0 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
213e0 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
213f0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
21400 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
21410 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
21420 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75   pAggInfo->pGrou
21430 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBy ){.         
21440 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b         int j, n;
21450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21460 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d   ExprList *pGB =
21470 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75   pAggInfo->pGrou
21480 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pBy;.           
21490 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
214a0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d  List_item *pTerm
214b0 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20   = pGB->a;.     
214c0 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70             n = p
214d0 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  GB->nExpr;.     
214e0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
214f0 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54  =0; j<n; j++, pT
21500 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
21510 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
21520 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pE = pTerm->pExp
21530 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
21540 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d       if( pE->op=
21550 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45  =TK_COLUMN && pE
21560 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d  ->iTable==pExpr-
21570 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20  >iTable &&.     
21580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21590 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45   pE->iColumn==pE
215a0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  xpr->iColumn ){.
215b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215c0 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
215d0 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20  rColumn = j;.   
215e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
21600 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21610 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
21620 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
21630 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
21640 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
21650 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  umn<0 ){.       
21660 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
21670 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70  SorterColumn = p
21680 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e  AggInfo->nSortin
21690 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20  gColumn++;.     
216a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
216b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
216c0 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73       /* There is
216d0 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f   now an entry fo
216e0 72 20 70 45 78 70 72 20 69 6e 20 70 41 67 67 49  r pExpr in pAggI
216f0 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74  nfo->aCol[] (eit
21700 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  her.            
21710 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20 77 61  ** because it wa
21720 73 20 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f  s there before o
21730 72 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73  r because we jus
21740 74 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20  t created it).. 
21750 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f             ** Co
21760 6e 76 65 72 74 20 74 68 65 20 70 45 78 70 72 20  nvert the pExpr 
21770 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43  to be a TK_AGG_C
21780 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20  OLUMN referring 
21790 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  to that.        
217a0 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d      ** pAggInfo-
217b0 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20  >aCol[] entry.. 
217c0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
217d0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65            ExprSe
217e0 74 49 72 72 65 64 75 63 69 62 6c 65 28 70 45 78  tIrreducible(pEx
217f0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
21800 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
21810 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20   = pAggInfo;.   
21820 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
21830 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  op = TK_AGG_COLU
21840 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  MN;.            
21850 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69  pExpr->iAgg = (i
21860 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  16)k;.          
21870 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
21880 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45     } /* endif pE
21890 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
218a0 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20  em->iCursor */. 
218b0 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20         } /* end 
218c0 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69  loop over pSrcLi
218d0 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  st */.      }.  
218e0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
218f0 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rune;.    }.    
21900 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
21910 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  TION: {.      if
21920 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20  ( (pNC->ncFlags 
21930 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 29 3d  & NC_InAggFunc)=
21940 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 57 61  =0.       && pWa
21950 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74  lker->walkerDept
21960 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a 20 20  h==pExpr->op2.  
21970 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
21980 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
21990 66 20 70 45 78 70 72 20 69 73 20 61 20 64 75 70  f pExpr is a dup
219a0 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65  licate of anothe
219b0 72 20 61 67 67 72 65 67 61 74 65 20 0a 20 20 20  r aggregate .   
219c0 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
219d0 20 74 68 61 74 20 69 73 20 61 6c 72 65 61 64 79   that is already
219e0 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f   in the pAggInfo
219f0 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 20   structure.     
21a00 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74     */.        st
21a10 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
21a20 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49  c *pItem = pAggI
21a30 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20  nfo->aFunc;.    
21a40 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
21a50 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
21a60 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
21a70 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
21a80 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
21a90 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45  pItem->pExpr, pE
21aa0 78 70 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  xpr)==0 ){.     
21ab0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
21ac0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21ad0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
21ae0 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75  i>=pAggInfo->nFu
21af0 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
21b00 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69 67  /* pExpr is orig
21b10 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65  inal.  Make a ne
21b20 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49  w entry in pAggI
21b30 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20  nfo->aFunc[].   
21b40 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
21b50 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43      u8 enc = ENC
21b60 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
21b70 20 20 20 20 20 20 20 20 69 20 3d 20 61 64 64 41          i = addA
21b80 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73  ggInfoFunc(pPars
21b90 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
21ba0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
21bb0 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  i>=0 ){.        
21bc0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
21bd0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
21be0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
21bf0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
21c00 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e   pItem = &pAggIn
21c10 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20  fo->aFunc[i];.  
21c20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
21c30 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
21c40 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
21c50 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  m->iMem = ++pPar
21c60 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
21c70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
21c80 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
21c90 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
21ca0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
21cb0 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d    pItem->pFunc =
21cc0 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
21cd0 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
21ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21cf0 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f      pExpr->u.zTo
21d00 6b 65 6e 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ken, sqlite3Strl
21d10 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54  en30(pExpr->u.zT
21d20 6f 6b 65 6e 29 2c 0a 20 20 20 20 20 20 20 20 20  oken),.         
21d30 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
21d40 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72  >x.pList ? pExpr
21d50 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
21d60 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20   : 0, enc, 0);. 
21d70 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
21d80 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
21d90 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
21da0 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
21db0 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50  ->iDistinct = pP
21dc0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
21dd0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
21de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
21df0 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20  Item->iDistinct 
21e00 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
21e10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
21e20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21e30 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20    /* Make pExpr 
21e40 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70  point to the app
21e50 72 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e 66  ropriate pAggInf
21e60 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79  o->aFunc[] entry
21e70 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
21e80 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
21e90 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
21ea0 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f  pExpr, EP_TokenO
21eb0 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
21ec0 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 53  );.        ExprS
21ed0 65 74 49 72 72 65 64 75 63 69 62 6c 65 28 70 45  etIrreducible(pE
21ee0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 45  xpr);.        pE
21ef0 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36  xpr->iAgg = (i16
21f00 29 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  )i;.        pExp
21f10 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41  r->pAggInfo = pA
21f20 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  ggInfo;.        
21f30 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
21f40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
21f50 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
21f60 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  C_Continue;.    
21f70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
21f80 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
21f90 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  nue;.}.static in
21fa0 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  t analyzeAggrega
21fb0 74 65 73 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b  tesInSelect(Walk
21fc0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
21fd0 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
21fe0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
21ff0 52 28 70 57 61 6c 6b 65 72 29 3b 0a 20 20 55 4e  R(pWalker);.  UN
22000 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
22010 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75 72  Select);.  retur
22020 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
22030 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
22040 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65   the pExpr expre
22050 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ssion looking fo
22060 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  r aggregate func
22070 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72  tions and.** for
22080 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20   variables that 
22090 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64  need to be added
220a0 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65   to AggInfo obje
220b0 63 74 20 74 68 61 74 20 70 4e 43 2d 3e 70 41 67  ct that pNC->pAg
220c0 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20  gInfo.** points 
220d0 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20  to.  Additional 
220e0 65 6e 74 72 69 65 73 20 61 72 65 20 6d 61 64 65  entries are made
220f0 20 6f 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20   on the AggInfo 
22100 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63  object as.** nec
22110 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  essary..**.** Th
22120 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
22130 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  d only be called
22140 20 61 66 74 65 72 20 74 68 65 20 65 78 70 72 65   after the expre
22150 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a  ssion has been.*
22160 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71  * analyzed by sq
22170 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
22180 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Names()..*/.void
22190 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
221a0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e 61  yzeAggregates(Na
221b0 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
221c0 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
221d0 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73  Walker w;.  mems
221e0 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&w, 0, sizeof
221f0 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43  (w));.  w.xExprC
22200 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a  allback = analyz
22210 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e  eAggregate;.  w.
22220 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
22230 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  = analyzeAggrega
22240 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77  tesInSelect;.  w
22250 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20  .u.pNC = pNC;.  
22260 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72  assert( pNC->pSr
22270 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 71  cList!=0 );.  sq
22280 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
22290 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pExpr);.}../*.
222a0 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45  ** Call sqlite3E
222b0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
222c0 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72 79  ates() for every
222d0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
222e0 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
222f0 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68  list.  Return th
22300 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
22310 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  rs..**.** If an 
22320 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20  error is found, 
22330 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20  the analysis is 
22340 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f  cut short..*/.vo
22350 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  id sqlite3ExprAn
22360 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d  alyzeAggList(Nam
22370 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
22380 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
22390 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
223a0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
223b0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
223c0 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
223d0 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
223e0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
223f0 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
22400 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
22410 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
22420 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65  egates(pNC, pIte
22430 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  m->pExpr);.    }
22440 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
22450 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65 20  locate a single 
22460 6e 65 77 20 72 65 67 69 73 74 65 72 20 66 6f 72  new register for
22470 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d   use to hold som
22480 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  e intermediate r
22490 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  esult..*/.int sq
224a0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
224b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
224c0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54    if( pParse->nT
224d0 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20  empReg==0 ){.   
224e0 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65   return ++pParse
224f0 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65  ->nMem;.  }.  re
22500 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65  turn pParse->aTe
22510 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e  mpReg[--pParse->
22520 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a  nTempReg];.}../*
22530 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  .** Deallocate a
22540 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e   register, makin
22550 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  g available for 
22560 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f  reuse for some o
22570 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e  ther.** purpose.
22580 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69  .**.** If a regi
22590 73 74 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c  ster is currentl
225a0 79 20 62 65 69 6e 67 20 75 73 65 64 20 62 79 20  y being used by 
225b0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
225c0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 61  , then.** the da
225d0 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64 65 66  llocation is def
225e0 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20  erred until the 
225f0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e  column cache lin
22600 65 20 74 68 61 74 20 75 73 65 73 0a 2a 2a 20 74  e that uses.** t
22610 68 65 20 72 65 67 69 73 74 65 72 20 62 65 63 6f  he register beco
22620 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f  mes stale..*/.vo
22630 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  id sqlite3Releas
22640 65 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a  eTempReg(Parse *
22650 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
22660 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26  ){.  if( iReg &&
22670 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
22680 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72  g<ArraySize(pPar
22690 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b  se->aTempReg) ){
226a0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
226b0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
226c0 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   *p;.    for(i=0
226d0 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
226e0 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
226f0 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
22700 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   p++){.      if(
22710 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29   p->iReg==iReg )
22720 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 65 6d  {.        p->tem
22730 70 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  pReg = 1;.      
22740 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
22750 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  }.    }.    pPar
22760 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61  se->aTempReg[pPa
22770 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d  rse->nTempReg++]
22780 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a   = iReg;.  }.}..
22790 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f  /*.** Allocate o
227a0 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62  r deallocate a b
227b0 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e  lock of nReg con
227c0 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65  secutive registe
227d0 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  rs.*/.int sqlite
227e0 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61  3GetTempRange(Pa
227f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
22800 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c   nReg){.  int i,
22810 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65   n;.  i = pParse
22820 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e  ->iRangeReg;.  n
22830 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67   = pParse->nRang
22840 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67  eReg;.  if( nReg
22850 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  <=n ){.    asser
22860 74 28 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e  t( !usedAsColumn
22870 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c  Cache(pParse, i,
22880 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20 70   i+n-1) );.    p
22890 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
228a0 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50   += nReg;.    pP
228b0 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
228c0 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65  -= nReg;.  }else
228d0 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73 65  {.    i = pParse
228e0 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50  ->nMem+1;.    pP
228f0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
22900 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  eg;.  }.  return
22910 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74   i;.}.void sqlit
22920 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
22930 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
22940 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20  , int iReg, int 
22950 6e 52 65 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  nReg){.  sqlite3
22960 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
22970 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 52  pParse, iReg, nR
22980 65 67 29 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e  eg);.  if( nReg>
22990 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
229a0 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  g ){.    pParse-
229b0 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65  >nRangeReg = nRe
229c0 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  g;.    pParse->i
229d0 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b  RangeReg = iReg;
229e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
229f0 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79  rk all temporary
22a00 20 72 65 67 69 73 74 65 72 73 20 61 73 20 62 65   registers as be
22a10 69 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c 65 20  ing unavailable 
22a20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f  for reuse..*/.vo
22a30 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54  id sqlite3ClearT
22a40 65 6d 70 52 65 67 43 61 63 68 65 28 50 61 72 73  empRegCache(Pars
22a50 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50  e *pParse){.  pP
22a60 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d  arse->nTempReg =
22a70 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52   0;.  pParse->nR
22a80 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a     angeReg = 0;.}.