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

Artifact 31a2b65339f6c3795d4cfa5e99798cd72f9fdfdf:


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 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0470: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0480: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0490: 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
04a0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c    if( op==TK_SEL
04b0: 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ECT ){.    asser
04c0: 74 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26  t( pExpr->flags&
04d0: 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b 0a  EP_xIsSelect );.
04e0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
04f0: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
0500: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  Expr->x.pSelect-
0510: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
0520: 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  xpr);.  }.#ifnde
0530: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  f SQLITE_OMIT_CA
0540: 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  ST.  if( op==TK_
0550: 43 41 53 54 20 29 7b 0a 20 20 20 20 61 73 73 65  CAST ){.    asse
0560: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
0570: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
0580: 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
0590: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41 66  return sqlite3Af
05a0: 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72  finityType(pExpr
05b0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a  ->u.zToken, 0);.
05c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
05d0: 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c   (op==TK_AGG_COL
05e0: 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f  UMN || op==TK_CO
05f0: 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52  LUMN || op==TK_R
0600: 45 47 49 53 54 45 52 29 20 0a 20 20 20 26 26 20  EGISTER) .   && 
0610: 70 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 0a 20  pExpr->pTab!=0. 
0620: 20 29 7b 0a 20 20 20 20 2f 2a 20 6f 70 3d 3d 54   ){.    /* op==T
0630: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 45  K_REGISTER && pE
0640: 78 70 72 2d 3e 70 54 61 62 21 3d 30 20 68 61 70  xpr->pTab!=0 hap
0650: 70 65 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20  pens when pExpr 
0660: 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  was originally. 
0670: 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d     ** a TK_COLUM
0680: 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f  N but was previo
0690: 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61  usly evaluated a
06a0: 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72  nd cached in a r
06b0: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 69  egister */.    i
06c0: 6e 74 20 6a 20 3d 20 70 45 78 70 72 2d 3e 69 43  nt j = pExpr->iC
06d0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6a  olumn;.    if( j
06e0: 3c 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  <0 ) return SQLI
06f0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a  TE_AFF_INTEGER;.
0700: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
0710: 72 2d 3e 70 54 61 62 20 26 26 20 6a 3c 70 45 78  r->pTab && j<pEx
0720: 70 72 2d 3e 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  pr->pTab->nCol )
0730: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 45 78  ;.    return pEx
0740: 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  pr->pTab->aCol[j
0750: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 7d 0a  ].affinity;.  }.
0760: 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
0770: 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a  affinity;.}../*.
0780: 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61  ** Set the colla
0790: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
07a0: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  r expression pEx
07b0: 70 72 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c  pr to be the col
07c0: 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
07d0: 63 65 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b  ce named by pTok
07e0: 65 6e 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70  en.   Return a p
07f0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20  ointer to a new 
0800: 45 78 70 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a  Expr node that.*
0810: 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  * implements the
0820: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
0830: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  r..**.** If a me
0840: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
0850: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
0860: 61 74 20 66 61 63 74 20 69 73 20 72 65 63 6f 72  at fact is recor
0870: 64 65 64 20 69 6e 20 70 50 61 72 73 65 2d 3e 64  ded in pParse->d
0880: 62 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 45 78  b.** and the pEx
0890: 70 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  pr parameter is 
08a0: 72 65 74 75 72 6e 65 64 20 75 6e 63 68 61 6e 67  returned unchang
08b0: 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ed..*/.Expr *sql
08c0: 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
08d0: 74 65 54 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70  teToken(Parse *p
08e0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
08f0: 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c  pr, Token *pColl
0900: 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 43 6f  Name){.  if( pCo
0910: 6c 6c 4e 61 6d 65 2d 3e 6e 3e 30 20 29 7b 0a 20  llName->n>0 ){. 
0920: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20     Expr *pNew = 
0930: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
0940: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f  (pParse->db, TK_
0950: 43 4f 4c 4c 41 54 45 2c 20 70 43 6f 6c 6c 4e 61  COLLATE, pCollNa
0960: 6d 65 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  me, 1);.    if( 
0970: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e  pNew ){.      pN
0980: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78 70  ew->pLeft = pExp
0990: 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  r;.      pNew->f
09a0: 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61  lags |= EP_Colla
09b0: 74 65 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20  te|EP_Skip;.    
09c0: 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a    pExpr = pNew;.
09d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
09e0: 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70 72  rn pExpr;.}.Expr
09f0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64 64   *sqlite3ExprAdd
0a00: 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 50 61  CollateString(Pa
0a10: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
0a20: 72 20 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20  r *pExpr, const 
0a30: 63 68 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f 6b  char *zC){.  Tok
0a40: 65 6e 20 73 3b 0a 20 20 61 73 73 65 72 74 28 20  en s;.  assert( 
0a50: 7a 43 21 3d 30 20 29 3b 0a 20 20 73 2e 7a 20 3d  zC!=0 );.  s.z =
0a60: 20 7a 43 3b 0a 20 20 73 2e 6e 20 3d 20 73 71 6c   zC;.  s.n = sql
0a70: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73 2e 7a  ite3Strlen30(s.z
0a80: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
0a90: 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
0aa0: 65 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 70  eToken(pParse, p
0ab0: 45 78 70 72 2c 20 26 73 29 3b 0a 7d 0a 0a 2f 2a  Expr, &s);.}../*
0ac0: 0a 2a 2a 20 53 6b 69 70 20 6f 76 65 72 20 61 6e  .** Skip over an
0ad0: 79 20 54 4b 5f 43 4f 4c 4c 41 54 45 20 6f 72 20  y TK_COLLATE or 
0ae0: 54 4b 5f 41 53 20 6f 70 65 72 61 74 6f 72 73 20  TK_AS operators 
0af0: 61 6e 64 20 61 6e 79 20 75 6e 6c 69 6b 65 6c 79  and any unlikely
0b00: 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c 69 68  ().** or likelih
0b10: 6f 6f 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 61  ood() function a
0b20: 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e  t the root of an
0b30: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a   expression..*/.
0b40: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
0b50: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 45 78 70  rSkipCollate(Exp
0b60: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 77 68 69  r *pExpr){.  whi
0b70: 6c 65 28 20 70 45 78 70 72 20 26 26 20 45 78 70  le( pExpr && Exp
0b80: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
0b90: 70 72 2c 20 45 50 5f 53 6b 69 70 29 20 29 7b 0a  pr, EP_Skip) ){.
0ba0: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
0bb0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
0bc0: 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20  P_Unlikely) ){. 
0bd0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
0be0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
0bf0: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
0c00: 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  t) );.      asse
0c10: 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  rt( pExpr->x.pLi
0c20: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
0c30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
0c40: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54  pr->op==TK_FUNCT
0c50: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 45 78  ION );.      pEx
0c60: 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  pr = pExpr->x.pL
0c70: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
0c80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
0c90: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
0ca0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
0cb0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
0cc0: 5f 41 53 20 29 3b 0a 20 20 20 20 20 20 70 45 78  _AS );.      pEx
0cd0: 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  pr = pExpr->pLef
0ce0: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a  t;.    }.  }   .
0cf0: 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a    return pExpr;.
0d00: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
0d10: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
0d20: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65  quence for the e
0d30: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
0d40: 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20   If.** there is 
0d50: 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61  no defined colla
0d60: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 72  ting sequence, r
0d70: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  eturn NULL..**.*
0d80: 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
0d90: 73 65 71 75 65 6e 63 65 20 6d 69 67 68 74 20 62  sequence might b
0da0: 65 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  e determined by 
0db0: 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  a COLLATE operat
0dc0: 6f 72 0a 2a 2a 20 6f 72 20 62 79 20 74 68 65 20  or.** or by the 
0dd0: 70 72 65 73 65 6e 63 65 20 6f 66 20 61 20 63 6f  presence of a co
0de0: 6c 75 6d 6e 20 77 69 74 68 20 61 20 64 65 66 69  lumn with a defi
0df0: 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ned collating se
0e00: 71 75 65 6e 63 65 2e 0a 2a 2a 20 43 4f 4c 4c 41  quence..** COLLA
0e10: 54 45 20 6f 70 65 72 61 74 6f 72 73 20 74 61 6b  TE operators tak
0e20: 65 20 66 69 72 73 74 20 70 72 65 63 65 64 65 6e  e first preceden
0e30: 63 65 2e 20 20 4c 65 66 74 20 6f 70 65 72 61 6e  ce.  Left operan
0e40: 64 73 20 74 61 6b 65 0a 2a 2a 20 70 72 65 63 65  ds take.** prece
0e50: 64 65 6e 63 65 20 6f 76 65 72 20 72 69 67 68 74  dence over right
0e60: 20 6f 70 65 72 61 6e 64 73 2e 0a 2a 2f 0a 43 6f   operands..*/.Co
0e70: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 45 78  llSeq *sqlite3Ex
0e80: 70 72 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  prCollSeq(Parse 
0e90: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
0ea0: 45 78 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  Expr){.  sqlite3
0eb0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
0ec0: 62 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  b;.  CollSeq *pC
0ed0: 6f 6c 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72 20  oll = 0;.  Expr 
0ee0: 2a 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 77 68  *p = pExpr;.  wh
0ef0: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 6e  ile( p ){.    in
0f00: 74 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20  t op = p->op;.  
0f10: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53    if( op==TK_CAS
0f20: 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c 55  T || op==TK_UPLU
0f30: 53 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 70  S ){.      p = p
0f40: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 63  ->pLeft;.      c
0f50: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
0f60: 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 4f     if( op==TK_CO
0f70: 4c 4c 41 54 45 20 7c 7c 20 28 6f 70 3d 3d 54 4b  LLATE || (op==TK
0f80: 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e  _REGISTER && p->
0f90: 6f 70 32 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 29  op2==TK_COLLATE)
0fa0: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20   ){.      pColl 
0fb0: 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c  = sqlite3GetColl
0fc0: 53 65 71 28 70 50 61 72 73 65 2c 20 45 4e 43 28  Seq(pParse, ENC(
0fd0: 64 62 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54 6f  db), 0, p->u.zTo
0fe0: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ken);.      brea
0ff0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
1000: 20 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20 20   p->pTab!=0.    
1010: 20 26 26 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f   && (op==TK_AGG_
1020: 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b  COLUMN || op==TK
1030: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20  _COLUMN.        
1040: 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49    || op==TK_REGI
1050: 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 54  STER || op==TK_T
1060: 52 49 47 47 45 52 29 0a 20 20 20 20 29 7b 0a 20  RIGGER).    ){. 
1070: 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52       /* op==TK_R
1080: 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e 70 54  EGISTER && p->pT
1090: 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20 77 68  ab!=0 happens wh
10a0: 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f 72 69  en pExpr was ori
10b0: 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a  ginally.      **
10c0: 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74   a TK_COLUMN but
10d0: 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
10e0: 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61  evaluated and ca
10f0: 63 68 65 64 20 69 6e 20 61 20 72 65 67 69 73 74  ched in a regist
1100: 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  er */.      int 
1110: 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  j = p->iColumn;.
1120: 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 30 20 29        if( j>=0 )
1130: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
1140: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 2d  char *zColl = p-
1150: 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  >pTab->aCol[j].z
1160: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43  Coll;.        pC
1170: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
1180: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
1190: 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b  (db), zColl, 0);
11a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
11b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
11c0: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45  if( p->flags & E
11d0: 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20  P_Collate ){.   
11e0: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 2d     if( ALWAYS(p-
11f0: 3e 70 4c 65 66 74 29 20 26 26 20 28 70 2d 3e 70  >pLeft) && (p->p
1200: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  Left->flags & EP
1210: 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a  _Collate)!=0 ){.
1220: 20 20 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70          p = p->p
1230: 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Left;.      }els
1240: 65 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70  e{.        p = p
1250: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
1260: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1270: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1280: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
1290: 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50  3CheckCollSeq(pP
12a0: 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20  arse, pColl) ){ 
12b0: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a  .    pColl = 0;.
12c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f    }.  return pCo
12d0: 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78  ll;.}../*.** pEx
12e0: 70 72 20 69 73 20 61 6e 20 6f 70 65 72 61 6e 64  pr is an operand
12f0: 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   of a comparison
1300: 20 6f 70 65 72 61 74 6f 72 2e 20 20 61 66 66 32   operator.  aff2
1310: 20 69 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20   is the.** type 
1320: 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  affinity of the 
1330: 6f 74 68 65 72 20 6f 70 65 72 61 6e 64 2e 20 20  other operand.  
1340: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
1350: 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79 70 65  urns the.** type
1360: 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73   affinity that s
1370: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f  hould be used fo
1380: 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  r the comparison
1390: 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68   operator..*/.ch
13a0: 61 72 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  ar sqlite3Compar
13b0: 65 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  eAffinity(Expr *
13c0: 70 45 78 70 72 2c 20 63 68 61 72 20 61 66 66 32  pExpr, char aff2
13d0: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 31 20 3d  ){.  char aff1 =
13e0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
13f0: 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20 69  nity(pExpr);.  i
1400: 66 28 20 61 66 66 31 20 26 26 20 61 66 66 32 20  f( aff1 && aff2 
1410: 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68 20 73  ){.    /* Both s
1420: 69 64 65 73 20 6f 66 20 74 68 65 20 63 6f 6d 70  ides of the comp
1430: 61 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d  arison are colum
1440: 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61 73 20 6e  ns. If one has n
1450: 75 6d 65 72 69 63 0a 20 20 20 20 2a 2a 20 61 66  umeric.    ** af
1460: 66 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61 74  finity, use that
1470: 2e 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20  . Otherwise use 
1480: 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20  no affinity..   
1490: 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
14a0: 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
14b0: 6e 69 74 79 28 61 66 66 31 29 20 7c 7c 20 73 71  nity(aff1) || sq
14c0: 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66  lite3IsNumericAf
14d0: 66 69 6e 69 74 79 28 61 66 66 32 29 20 29 7b 0a  finity(aff2) ){.
14e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
14f0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
1500: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1510: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1520: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a  AFF_NONE;.    }.
1530: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66    }else if( !aff
1540: 31 20 26 26 20 21 61 66 66 32 20 29 7b 0a 20 20  1 && !aff2 ){.  
1550: 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 73 69 64    /* Neither sid
1560: 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  e of the compari
1570: 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  son is a column.
1580: 20 20 43 6f 6d 70 61 72 65 20 74 68 65 0a 20 20    Compare the.  
1590: 20 20 2a 2a 20 72 65 73 75 6c 74 73 20 64 69 72    ** results dir
15a0: 65 63 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ectly..    */.  
15b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15c0: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73  AFF_NONE;.  }els
15d0: 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69  e{.    /* One si
15e0: 64 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20  de is a column, 
15f0: 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74  the other is not
1600: 2e 20 55 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  . Use the column
1610: 73 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20  s affinity. */. 
1620: 20 20 20 61 73 73 65 72 74 28 20 61 66 66 31 3d     assert( aff1=
1630: 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b  =0 || aff2==0 );
1640: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 61 66 66  .    return (aff
1650: 31 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d  1 + aff2);.  }.}
1660: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
1670: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
1680: 65 72 61 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  erator.  Return 
1690: 74 68 65 20 74 79 70 65 20 61 66 66 69 6e 69 74  the type affinit
16a0: 79 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a  y that should.**
16b0: 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20 62   be applied to b
16c0: 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 70 72 69  oth operands pri
16d0: 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74 68 65 20  or to doing the 
16e0: 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73  comparison..*/.s
16f0: 74 61 74 69 63 20 63 68 61 72 20 63 6f 6d 70 61  tatic char compa
1700: 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 45 78  risonAffinity(Ex
1710: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68  pr *pExpr){.  ch
1720: 61 72 20 61 66 66 3b 0a 20 20 61 73 73 65 72 74  ar aff;.  assert
1730: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1740: 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  EQ || pExpr->op=
1750: 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d  =TK_IN || pExpr-
1760: 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20  >op==TK_LT ||.  
1770: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
1780: 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70  p==TK_GT || pExp
1790: 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20  r->op==TK_GE || 
17a0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45  pExpr->op==TK_LE
17b0: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45   ||.          pE
17c0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c  xpr->op==TK_NE |
17d0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
17e0: 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IS || pExpr->op=
17f0: 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 61  =TK_ISNOT );.  a
1800: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
1810: 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20 73  eft );.  aff = s
1820: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
1830: 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ty(pExpr->pLeft)
1840: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70  ;.  if( pExpr->p
1850: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66 66  Right ){.    aff
1860: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
1870: 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  eAffinity(pExpr-
1880: 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a 20  >pRight, aff);. 
1890: 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72 48   }else if( ExprH
18a0: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
18b0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
18c0: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c  ){.    aff = sql
18d0: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
18e0: 69 74 79 28 70 45 78 70 72 2d 3e 78 2e 70 53 65  ity(pExpr->x.pSe
18f0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
1900: 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a  0].pExpr, aff);.
1910: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66    }else if( !aff
1920: 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51   ){.    aff = SQ
1930: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
1940: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b   }.  return aff;
1950: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
1960: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
1970: 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20  expression, eg. 
1980: 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e  '=', '<', IN(...
1990: 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66  ) etc..** idx_af
19a0: 66 69 6e 69 74 79 20 69 73 20 74 68 65 20 61 66  finity is the af
19b0: 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64  finity of an ind
19c0: 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74  exed column. Ret
19d0: 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74  urn true.** if t
19e0: 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 61 66  he index with af
19f0: 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e  finity idx_affin
1a00: 69 74 79 20 6d 61 79 20 62 65 20 75 73 65 64 20  ity may be used 
1a10: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20  to implement.** 
1a20: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
1a30: 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20  n pExpr..*/.int 
1a40: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
1a50: 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78  nityOk(Expr *pEx
1a60: 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66  pr, char idx_aff
1a70: 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61  inity){.  char a
1a80: 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41  ff = comparisonA
1a90: 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a  ffinity(pExpr);.
1aa0: 20 20 73 77 69 74 63 68 28 20 61 66 66 20 29 7b    switch( aff ){
1ab0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1ac0: 5f 41 46 46 5f 4e 4f 4e 45 3a 0a 20 20 20 20 20  _AFF_NONE:.     
1ad0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63   return 1;.    c
1ae0: 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  ase SQLITE_AFF_T
1af0: 45 58 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72  EXT:.      retur
1b00: 6e 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d  n idx_affinity==
1b10: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
1b20: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
1b30: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1b40: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
1b50: 69 74 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79  ity(idx_affinity
1b60: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1b70: 52 65 74 75 72 6e 20 74 68 65 20 50 35 20 76 61  Return the P5 va
1b80: 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  lue that should 
1b90: 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 62 69  be used for a bi
1ba0: 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a  nary comparison.
1bb0: 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71  ** opcode (OP_Eq
1bc0: 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73  , OP_Ge etc.) us
1bd0: 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45  ed to compare pE
1be0: 78 70 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e  xpr1 and pExpr2.
1bf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69  .*/.static u8 bi
1c00: 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78  naryCompareP5(Ex
1c10: 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72  pr *pExpr1, Expr
1c20: 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75   *pExpr2, int ju
1c30: 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20  mpIfNull){.  u8 
1c40: 61 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69  aff = (char)sqli
1c50: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
1c60: 70 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d  pExpr2);.  aff =
1c70: 20 28 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70   (u8)sqlite3Comp
1c80: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
1c90: 72 31 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a  r1, aff) | (u8)j
1ca0: 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74  umpIfNull;.  ret
1cb0: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
1cc0: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1cd0: 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74  er to the collat
1ce0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61  ion sequence tha
1cf0: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
1d00: 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20   by.** a binary 
1d10: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
1d20: 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c  tor comparing pL
1d30: 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a  eft and pRight..
1d40: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66  **.** If the lef
1d50: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
1d60: 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  n has a collatin
1d70: 67 20 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c  g sequence type,
1d80: 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75   then it is.** u
1d90: 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74  sed. Otherwise t
1da0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
1db0: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69  uence for the ri
1dc0: 67 68 74 20 68 61 6e 64 20 65 78 70 72 65 73 73  ght hand express
1dd0: 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20  ion.** is used, 
1de0: 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 28  or the default (
1df0: 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68  BINARY) if neith
1e00: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  er expression ha
1e10: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a  s a collating.**
1e20: 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67   type..**.** Arg
1e30: 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62 75  ument pRight (bu
1e40: 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79  t not pLeft) may
1e50: 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74   be a null point
1e60: 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  er. In this case
1e70: 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63  ,.** it is not c
1e80: 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f  onsidered..*/.Co
1e90: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69  llSeq *sqlite3Bi
1ea0: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
1eb0: 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  eq(.  Parse *pPa
1ec0: 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c  rse, .  Expr *pL
1ed0: 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52  eft, .  Expr *pR
1ee0: 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65  ight.){.  CollSe
1ef0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65  q *pColl;.  asse
1f00: 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69  rt( pLeft );.  i
1f10: 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  f( pLeft->flags 
1f20: 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a  & EP_Collate ){.
1f30: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1f40: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
1f50: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
1f60: 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68   }else if( pRigh
1f70: 74 20 26 26 20 28 70 52 69 67 68 74 2d 3e 66 6c  t && (pRight->fl
1f80: 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
1f90: 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c  )!=0 ){.    pCol
1fa0: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
1fb0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1fc0: 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  Right);.  }else{
1fd0: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
1fe0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1ff0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
2000: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
2010: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  {.      pColl = 
2020: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
2030: 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  eq(pParse, pRigh
2040: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
2050: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
2060: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
2070: 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61  code for a compa
2080: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
2090: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
20a0: 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72  deCompare(.  Par
20b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
20c0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 28 61  * The parsing (a
20d0: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
20e0: 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ng) context */. 
20f0: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20   Expr *pLeft,   
2100: 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f     /* The left o
2110: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72  perand */.  Expr
2120: 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a   *pRight,     /*
2130: 20 54 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   The right opera
2140: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f  nd */.  int opco
2150: 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  de,       /* The
2160: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f   comparison opco
2170: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c  de */.  int in1,
2180: 20 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67   int in2, /* Reg
2190: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70  ister holding op
21a0: 65 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20  erands */.  int 
21b0: 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  dest,         /*
21c0: 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 72   Jump here if tr
21d0: 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75  ue.  */.  int ju
21e0: 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49  mpIfNull    /* I
21f0: 66 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20  f true, jump if 
2200: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
2210: 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69  s NULL */.){.  i
2220: 6e 74 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64  nt p5;.  int add
2230: 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34  r;.  CollSeq *p4
2240: 3b 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65  ;..  p4 = sqlite
2250: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
2260: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
2270: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
2280: 70 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61  p5 = binaryCompa
2290: 72 65 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67  reP5(pLeft, pRig
22a0: 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  ht, jumpIfNull);
22b0: 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  .  addr = sqlite
22c0: 33 56 64 62 65 41 64 64 4f 70 34 28 70 50 61 72  3VdbeAddOp4(pPar
22d0: 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64  se->pVdbe, opcod
22e0: 65 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e  e, in2, dest, in
22f0: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
2310: 6f 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c  oid*)p4, P4_COLL
2320: 53 45 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  SEQ);.  sqlite3V
2330: 64 62 65 43 68 61 6e 67 65 50 35 28 70 50 61 72  dbeChangeP5(pPar
2340: 73 65 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70  se->pVdbe, (u8)p
2350: 35 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  5);.  return add
2360: 72 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  r;.}..#if SQLITE
2370: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
2380: 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  0./*.** Check th
2390: 61 74 20 61 72 67 75 6d 65 6e 74 20 6e 48 65 69  at argument nHei
23a0: 67 68 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ght is less than
23b0: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
23c0: 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78 70 72   maximum.** expr
23d0: 65 73 73 69 6f 6e 20 64 65 70 74 68 20 61 6c 6c  ession depth all
23e0: 6f 77 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  owed. If it is n
23f0: 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  ot, leave an err
2400: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 0a 2a 2a  or message in.**
2410: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20   pParse..*/.int 
2420: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
2430: 48 65 69 67 68 74 28 50 61 72 73 65 20 2a 70 50  Height(Parse *pP
2440: 61 72 73 65 2c 20 69 6e 74 20 6e 48 65 69 67 68  arse, int nHeigh
2450: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
2460: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
2470: 6d 78 48 65 69 67 68 74 20 3d 20 70 50 61 72 73  mxHeight = pPars
2480: 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  e->db->aLimit[SQ
2490: 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f  LITE_LIMIT_EXPR_
24a0: 44 45 50 54 48 5d 3b 0a 20 20 69 66 28 20 6e 48  DEPTH];.  if( nH
24b0: 65 69 67 68 74 3e 6d 78 48 65 69 67 68 74 20 29  eight>mxHeight )
24c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
24d0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
24e0: 20 20 20 20 20 20 22 45 78 70 72 65 73 73 69 6f        "Expressio
24f0: 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c 61  n tree is too la
2500: 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65 70  rge (maximum dep
2510: 74 68 20 25 64 29 22 2c 20 6d 78 48 65 69 67 68  th %d)", mxHeigh
2520: 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20  t.    );.    rc 
2530: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
2540: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2550: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  .}../* The follo
2560: 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74  wing three funct
2570: 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45 78  ions, heightOfEx
2580: 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45 78  pr(), heightOfEx
2590: 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64 20  prList().** and 
25a0: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 29  heightOfSelect()
25b0: 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 65  , are used to de
25c0: 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78 69  termine the maxi
25d0: 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f 66  mum height.** of
25e0: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
25f0: 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64 20  tree referenced 
2600: 62 79 20 74 68 65 20 73 74 72 75 63 74 75 72 65  by the structure
2610: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a   passed as the.*
2620: 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * first argument
2630: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
2640: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 69  maximum height i
2650: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
2660: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
2670: 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62   pointed.** to b
2680: 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65 20  y pnHeight, the 
2690: 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
26a0: 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48 65  , then set *pnHe
26b0: 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  ight to that.** 
26c0: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
26d0: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78   void heightOfEx
26e0: 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  pr(Expr *p, int 
26f0: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
2700: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ( p ){.    if( p
2710: 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65 69  ->nHeight>*pnHei
2720: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e  ght ){.      *pn
2730: 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65 69  Height = p->nHei
2740: 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ght;.    }.  }.}
2750: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
2760: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45 78  ghtOfExprList(Ex
2770: 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 2a  prList *p, int *
2780: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28  pnHeight){.  if(
2790: 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b   p ){.    int i;
27a0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
27b0: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  p->nExpr; i++){.
27c0: 20 20 20 20 20 20 68 65 69 67 68 74 4f 66 45 78        heightOfEx
27d0: 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  pr(p->a[i].pExpr
27e0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
27f0: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
2800: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65 6c  void heightOfSel
2810: 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69  ect(Select *p, i
2820: 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20  nt *pnHeight){. 
2830: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 68 65   if( p ){.    he
2840: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 57  ightOfExpr(p->pW
2850: 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29 3b  here, pnHeight);
2860: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2870: 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e  r(p->pHaving, pn
2880: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
2890: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69  ghtOfExpr(p->pLi
28a0: 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  mit, pnHeight);.
28b0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
28c0: 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70 6e 48  (p->pOffset, pnH
28d0: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
28e0: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
28f0: 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67 68 74  pEList, pnHeight
2900: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
2910: 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75  xprList(p->pGrou
2920: 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  pBy, pnHeight);.
2930: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
2940: 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79  List(p->pOrderBy
2950: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2960: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
2970: 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65 69  p->pPrior, pnHei
2980: 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ght);.  }.}../*.
2990: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
29a0: 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65  nHeight variable
29b0: 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72   in the structur
29c0: 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a  e passed as an .
29d0: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20  ** argument. An 
29e0: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20  expression with 
29f0: 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70  no children, Exp
2a00: 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45  r.pList or .** E
2a10: 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62  xpr.pSelect memb
2a20: 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20  er has a height 
2a30: 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20  of 1. Any other 
2a40: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61  expression.** ha
2a50: 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c  s a height equal
2a60: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
2a70: 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74  height of any ot
2a80: 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63  her .** referenc
2a90: 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65  ed Expr plus one
2aa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2ab0: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 45   exprSetHeight(E
2ac0: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  xpr *p){.  int n
2ad0: 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65  Height = 0;.  he
2ae0: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
2af0: 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  eft, &nHeight);.
2b00: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
2b10: 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67  ->pRight, &nHeig
2b20: 68 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48  ht);.  if( ExprH
2b30: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
2b40: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
2b50: 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63     heightOfSelec
2b60: 74 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  t(p->x.pSelect, 
2b70: 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c  &nHeight);.  }el
2b80: 73 65 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  se{.    heightOf
2b90: 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c  ExprList(p->x.pL
2ba0: 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ist, &nHeight);.
2bb0: 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74    }.  p->nHeight
2bc0: 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a   = nHeight + 1;.
2bd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
2be0: 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61   Expr.nHeight va
2bf0: 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65  riable using the
2c00: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 29   exprSetHeight()
2c10: 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a   function. If.**
2c20: 20 74 68 65 20 68 65 69 67 68 74 20 69 73 20 67   the height is g
2c30: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
2c40: 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  maximum allowed 
2c50: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68  expression depth
2c60: 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72  ,.** leave an er
2c70: 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  ror in pParse..*
2c80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
2c90: 70 72 53 65 74 48 65 69 67 68 74 28 50 61 72 73  prSetHeight(Pars
2ca0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
2cb0: 2a 70 29 7b 0a 20 20 65 78 70 72 53 65 74 48 65  *p){.  exprSetHe
2cc0: 69 67 68 74 28 70 29 3b 0a 20 20 73 71 6c 69 74  ight(p);.  sqlit
2cd0: 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68  e3ExprCheckHeigh
2ce0: 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65  t(pParse, p->nHe
2cf0: 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ight);.}../*.** 
2d00: 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  Return the maxim
2d10: 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79  um height of any
2d20: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
2d30: 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62   referenced.** b
2d40: 79 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61  y the select sta
2d50: 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73  tement passed as
2d60: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f   an argument..*/
2d70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65  .int sqlite3Sele
2d80: 63 74 45 78 70 72 48 65 69 67 68 74 28 53 65 6c  ctExprHeight(Sel
2d90: 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ect *p){.  int n
2da0: 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65  Height = 0;.  he
2db0: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2c 20  ightOfSelect(p, 
2dc0: 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 72 65 74  &nHeight);.  ret
2dd0: 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23  urn nHeight;.}.#
2de0: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 65  else.  #define e
2df0: 78 70 72 53 65 74 48 65 69 67 68 74 28 79 29 0a  xprSetHeight(y).
2e00: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2e10: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
2e20: 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0 */../*.** This
2e30: 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
2e40: 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20 66  core allocator f
2e50: 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a 2a  or Expr nodes..*
2e60: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61  *.** Construct a
2e70: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
2e80: 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20  node and return 
2e90: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e  a pointer to it.
2ea0: 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20    Memory.** for 
2eb0: 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20 66 6f  this node and fo
2ec0: 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61 72 67  r the pToken arg
2ed0: 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e 67 6c  ument is a singl
2ee0: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20  e allocation.** 
2ef0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
2f00: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e  lite3DbMalloc().
2f10: 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75    The calling fu
2f20: 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73  nction.** is res
2f30: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b  ponsible for mak
2f40: 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f 64  ing sure the nod
2f50: 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74  e eventually get
2f60: 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  s freed..**.** I
2f70: 66 20 64 65 71 75 6f 74 65 20 69 73 20 74 72 75  f dequote is tru
2f80: 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65  e, then the toke
2f90: 6e 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29  n (if it exists)
2fa0: 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2a   is dequoted..**
2fb0: 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 66   If dequote is f
2fc0: 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74 69  alse, no dequoti
2fd0: 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 61 6e 63  ng is performanc
2fe0: 65 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65 0a  e.  The deQuote.
2ff0: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
3000: 69 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b 65  ignored if pToke
3010: 6e 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20  n is NULL or if 
3020: 74 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e  the token does n
3030: 6f 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f 20  ot.** appear to 
3040: 62 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20 74  be quoted.  If t
3050: 68 65 20 71 75 6f 74 65 73 20 77 65 72 65 20 6f  he quotes were o
3060: 66 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22  f the form "..."
3070: 20 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29   (double-quotes)
3080: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50 5f  .** then the EP_
3090: 44 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20 69  DblQuoted flag i
30a0: 73 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78 70  s set on the exp
30b0: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a  ression node..**
30c0: 0a 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65  .** Special case
30d0: 3a 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54  :  If op==TK_INT
30e0: 45 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20  EGER and pToken 
30f0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
3100: 6e 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62  ng that.** can b
3110: 65 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74  e translated int
3120: 6f 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  o a 32-bit integ
3130: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b  er, then the tok
3140: 65 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f  en is not.** sto
3150: 72 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e  red in u.zToken.
3160: 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 69    Instead, the i
3170: 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 69 73  nteger values is
3180: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
3190: 20 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74 68   u.iValue and th
31a0: 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c  e EP_IntValue fl
31b0: 61 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20 65  ag is set.  No e
31c0: 78 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20  xtra storage.** 
31d0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  is allocated to 
31e0: 68 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72  hold the integer
31f0: 20 74 65 78 74 20 61 6e 64 20 74 68 65 20 64 65   text and the de
3200: 71 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69 67  quote flag is ig
3210: 6e 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  nored..*/.Expr *
3220: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
3230: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
3240: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
3250: 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  andle for sqlite
3260: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20  3DbMallocZero() 
3270: 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f  (may be null) */
3280: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
3290: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
32a0: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
32b0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e  */.  const Token
32c0: 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20   *pToken,    /* 
32d0: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  Token argument. 
32e0: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
32f0: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
3300: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3310: 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20 2a  rue to dequote *
3320: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  /.){.  Expr *pNe
3330: 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  w;.  int nExtra 
3340: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 6c 75  = 0;.  int iValu
3350: 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 54  e = 0;..  if( pT
3360: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  oken ){.    if( 
3370: 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c  op!=TK_INTEGER |
3380: 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20  | pToken->z==0. 
3390: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
33a0: 74 65 33 47 65 74 49 6e 74 33 32 28 70 54 6f 6b  te3GetInt32(pTok
33b0: 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d  en->z, &iValue)=
33c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74  =0 ){.      nExt
33d0: 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31  ra = pToken->n+1
33e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
33f0: 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 20  iValue>=0 );.   
3400: 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20   }.  }.  pNew = 
3410: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
3420: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45  ero(db, sizeof(E
3430: 78 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20  xpr)+nExtra);.  
3440: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
3450: 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29 6f  pNew->op = (u8)o
3460: 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41 67  p;.    pNew->iAg
3470: 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  g = -1;.    if( 
3480: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  pToken ){.      
3490: 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29 7b  if( nExtra==0 ){
34a0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
34b0: 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61  lags |= EP_IntVa
34c0: 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  lue;.        pNe
34d0: 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 56  w->u.iValue = iV
34e0: 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  alue;.      }els
34f0: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  e{.        int c
3500: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
3510: 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72  u.zToken = (char
3520: 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20  *)&pNew[1];.    
3530: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b      assert( pTok
3540: 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70 54 6f 6b  en->z!=0 || pTok
3550: 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  en->n==0 );.    
3560: 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e      if( pToken->
3570: 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d  n ) memcpy(pNew-
3580: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b 65  >u.zToken, pToke
3590: 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29  n->z, pToken->n)
35a0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
35b0: 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e 2d  u.zToken[pToken-
35c0: 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  >n] = 0;.       
35d0: 20 69 66 28 20 64 65 71 75 6f 74 65 20 26 26 20   if( dequote && 
35e0: 6e 45 78 74 72 61 3e 3d 33 20 0a 20 20 20 20 20  nExtra>=3 .     
35f0: 20 20 20 20 20 20 20 20 26 26 20 28 28 63 20 3d          && ((c =
3600: 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 29 3d 3d   pToken->z[0])==
3610: 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 22 27 20 7c  '\'' || c=='"' |
3620: 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27  | c=='[' || c=='
3630: 60 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  `') ){.         
3640: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
3650: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  pNew->u.zToken);
3660: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
3670: 3d 3d 27 22 27 20 29 20 70 4e 65 77 2d 3e 66 6c  =='"' ) pNew->fl
3680: 61 67 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75 6f  ags |= EP_DblQuo
3690: 74 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ted;.        }. 
36a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
36b0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
36c0: 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e 65  _DEPTH>0.    pNe
36d0: 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b 0a  w->nHeight = 1;.
36e0: 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20 72  #endif  .  }.  r
36f0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
3700: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
3710: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
3720: 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d  ode from a zero-
3730: 74 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65 6e  terminated token
3740: 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c 72   that has.** alr
3750: 65 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f 74  eady been dequot
3760: 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ed..*/.Expr *sql
3770: 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c 69  ite3Expr(.  sqli
3780: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
3790: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f      /* Handle fo
37a0: 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  r sqlite3DbMallo
37b0: 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20  cZero() (may be 
37c0: 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f  null) */.  int o
37d0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
37e0: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
37f0: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e   opcode */.  con
3800: 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20  st char *zToken 
3810: 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72       /* Token ar
3820: 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62  gument.  Might b
3830: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54  e NULL */.){.  T
3840: 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d 20  oken x;.  x.z = 
3850: 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d 20  zToken;.  x.n = 
3860: 7a 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74 65 33  zToken ? sqlite3
3870: 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e 29  Strlen30(zToken)
3880: 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73   : 0;.  return s
3890: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
38a0: 64 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a  db, op, &x, 0);.
38b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20  }../*.** Attach 
38c0: 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61  subtrees pLeft a
38d0: 6e 64 20 70 52 69 67 68 74 20 74 6f 20 74 68 65  nd pRight to the
38e0: 20 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74   Expr node pRoot
38f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74  ..**.** If pRoot
3900: 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
3910: 73 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79 20  s that a memory 
3920: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
3930: 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a   has occurred..*
3940: 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20  * In that case, 
3950: 64 65 6c 65 74 65 20 74 68 65 20 73 75 62 74 72  delete the subtr
3960: 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52  ees pLeft and pR
3970: 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ight..*/.void sq
3980: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
3990: 75 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69 74  ubtrees(.  sqlit
39a0: 65 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a  e3 *db,.  Expr *
39b0: 70 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70  pRoot,.  Expr *p
39c0: 4c 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70 52  Left,.  Expr *pR
39d0: 69 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70 52  ight.){.  if( pR
39e0: 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  oot==0 ){.    as
39f0: 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
3a00: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71  Failed );.    sq
3a10: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3a20: 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  db, pLeft);.    
3a30: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
3a40: 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20  e(db, pRight);. 
3a50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
3a60: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
3a70: 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20  pRoot->pRight = 
3a80: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 52  pRight;.      pR
3a90: 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  oot->flags |= EP
3aa0: 5f 43 6f 6c 6c 61 74 65 20 26 20 70 52 69 67 68  _Collate & pRigh
3ab0: 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a  t->flags;.    }.
3ac0: 20 20 20 20 69 66 28 20 70 4c 65 66 74 20 29 7b      if( pLeft ){
3ad0: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c  .      pRoot->pL
3ae0: 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20  eft = pLeft;.   
3af0: 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20     pRoot->flags 
3b00: 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 20 26 20  |= EP_Collate & 
3b10: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a 20 20  pLeft->flags;.  
3b20: 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65 74 48    }.    exprSetH
3b30: 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a 20 20  eight(pRoot);.  
3b40: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
3b50: 61 74 65 20 61 20 45 78 70 72 20 6e 6f 64 65 20  ate a Expr node 
3b60: 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d  which joins as m
3b70: 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62 74 72  any as two subtr
3b80: 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f  ees..**.** One o
3b90: 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 73 75  r both of the su
3ba0: 62 74 72 65 65 73 20 63 61 6e 20 62 65 20 4e 55  btrees can be NU
3bb0: 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  LL.  Return a po
3bc0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77  inter to the new
3bd0: 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e 20 20  .** Expr node.  
3be0: 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72  Or, if an OOM er
3bf0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
3c00: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
3c10: 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65  ocFailed,.** fre
3c20: 65 20 74 68 65 20 73 75 62 74 72 65 65 73 20 61  e the subtrees a
3c30: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  nd return NULL..
3c40: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3c50: 50 45 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a  PExpr(.  Parse *
3c60: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
3c70: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
3c80: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ext */.  int op,
3c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ca0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f   /* Expression o
3cb0: 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20  pcode */.  Expr 
3cc0: 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20  *pLeft,         
3cd0: 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61     /* Left opera
3ce0: 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52  nd */.  Expr *pR
3cf0: 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
3d00: 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64  /* Right operand
3d10: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65   */.  const Toke
3d20: 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20 20 2f 2a  n *pToken     /*
3d30: 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b 65 6e 20   Argument token 
3d40: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b  */.){.  Expr *p;
3d50: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e  .  if( op==TK_AN
3d60: 44 20 26 26 20 70 4c 65 66 74 20 26 26 20 70 52  D && pLeft && pR
3d70: 69 67 68 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ight ){.    /* T
3d80: 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66  ake advantage of
3d90: 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74 20 66   short-circuit f
3da0: 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  alse optimizatio
3db0: 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20 20  n for AND */.   
3dc0: 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   p = sqlite3Expr
3dd0: 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  And(pParse->db, 
3de0: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a  pLeft, pRight);.
3df0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
3e00: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
3e10: 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6f 70  c(pParse->db, op
3e20: 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20  , pToken, 1);.  
3e30: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74    sqlite3ExprAtt
3e40: 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61 72  achSubtrees(pPar
3e50: 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66 74  se->db, p, pLeft
3e60: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20  , pRight);.  }. 
3e70: 20 69 66 28 20 70 20 29 20 7b 0a 20 20 20 20 73   if( p ) {.    s
3e80: 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48  qlite3ExprCheckH
3e90: 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d  eight(pParse, p-
3ea0: 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 20  >nHeight);.  }. 
3eb0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
3ec0: 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20  .** Return 1 if 
3ed0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75  an expression mu
3ee0: 73 74 20 62 65 20 46 41 4c 53 45 20 69 6e 20 61  st be FALSE in a
3ef0: 6c 6c 20 63 61 73 65 73 20 61 6e 64 20 30 20 69  ll cases and 0 i
3f00: 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  f the.** express
3f10: 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 74 72 75  ion might be tru
3f20: 65 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f  e.  This is an o
3f30: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 66  ptimization.  If
3f40: 20 69 73 20 4f 4b 20 74 6f 0a 2a 2a 20 72 65 74   is OK to.** ret
3f50: 75 72 6e 20 30 20 68 65 72 65 20 65 76 65 6e 20  urn 0 here even 
3f60: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
3f70: 6e 20 72 65 61 6c 6c 79 20 69 73 20 61 6c 77 61  n really is alwa
3f80: 79 73 20 66 61 6c 73 65 20 28 61 20 0a 2a 2a 20  ys false (a .** 
3f90: 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 29 2e  false negative).
3fa0: 20 20 42 75 74 20 69 74 20 69 73 20 61 20 62 75    But it is a bu
3fb0: 67 20 74 6f 20 72 65 74 75 72 6e 20 31 20 69 66  g to return 1 if
3fc0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
3fd0: 2a 2a 20 6d 69 67 68 74 20 62 65 20 74 72 75 65  ** might be true
3fe0: 20 69 6e 20 73 6f 6d 65 20 72 61 72 65 20 63 69   in some rare ci
3ff0: 72 63 75 6d 73 74 61 6e 63 65 73 20 28 61 20 66  rcumstances (a f
4000: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 29 0a  alse positive.).
4010: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
4020: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
4030: 6e 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6e  n is part of con
4040: 64 69 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a  ditional for a.*
4050: 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  * LEFT JOIN, the
4060: 6e 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65  n we cannot dete
4070: 72 6d 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65  rmine at compile
4080: 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72  -time whether or
4090: 20 6e 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74 72   not.** is it tr
40a0: 75 65 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20  ue or false, so 
40b0: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 30 2e  always return 0.
40c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
40d0: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 45  xprAlwaysFalse(E
40e0: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76  xpr *p){.  int v
40f0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72   = 0;.  if( Expr
4100: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
4110: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65  P_FromJoin) ) re
4120: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
4130: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
4140: 67 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74  ger(p, &v) ) ret
4150: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
4160: 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a  v==0;.}../*.** J
4170: 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69  oin two expressi
4180: 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44  ons using an AND
4190: 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65   operator.  If e
41a0: 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  ither expression
41b0: 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65   is.** NULL, the
41c0: 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68  n just return th
41d0: 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  e other expressi
41e0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65  on..**.** If one
41f0: 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74 68   side or the oth
4200: 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69 73  er of the AND is
4210: 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61 6c   known to be fal
4220: 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64  se, then instead
4230: 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e 67  .** of returning
4240: 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73 69   an AND expressi
4250: 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20  on, just return 
4260: 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  a constant expre
4270: 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61 20  ssion with.** a 
4280: 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e 0a  value of false..
4290: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
42a0: 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20  ExprAnd(sqlite3 
42b0: 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74  *db, Expr *pLeft
42c0: 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b  , Expr *pRight){
42d0: 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20  .  if( pLeft==0 
42e0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52  ){.    return pR
42f0: 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ight;.  }else if
4300: 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20  ( pRight==0 ){. 
4310: 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b     return pLeft;
4320: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70  .  }else if( exp
4330: 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c 65  rAlwaysFalse(pLe
4340: 66 74 29 20 7c 7c 20 65 78 70 72 41 6c 77 61 79  ft) || exprAlway
4350: 73 46 61 6c 73 65 28 70 52 69 67 68 74 29 20 29  sFalse(pRight) )
4360: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
4370: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66  rDelete(db, pLef
4380: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
4390: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52  xprDelete(db, pR
43a0: 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72  ight);.    retur
43b0: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  n sqlite3ExprAll
43c0: 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  oc(db, TK_INTEGE
43d0: 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f  R, &sqlite3IntTo
43e0: 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d  kens[0], 0);.  }
43f0: 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20 2a  else{.    Expr *
4400: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
4410: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 41  prAlloc(db, TK_A
4420: 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  ND, 0, 0);.    s
4430: 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68  qlite3ExprAttach
4440: 53 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e 65  Subtrees(db, pNe
4450: 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  w, pLeft, pRight
4460: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4e  );.    return pN
4470: 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ew;.  }.}../*.**
4480: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   Construct a new
4490: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
44a0: 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20   for a function 
44b0: 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  with multiple.**
44c0: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45   arguments..*/.E
44d0: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
44e0: 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  Function(Parse *
44f0: 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74  pParse, ExprList
4500: 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
4510: 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20  pToken){.  Expr 
4520: 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65 33  *pNew;.  sqlite3
4530: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
4540: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  b;.  assert( pTo
4550: 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20  ken );.  pNew = 
4560: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
4570: 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  (db, TK_FUNCTION
4580: 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20  , pToken, 1);.  
4590: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
45a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
45b0: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
45c0: 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65  st); /* Avoid me
45d0: 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d  mory leak when m
45e0: 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20  alloc fails */. 
45f0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
4600: 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74  .  pNew->x.pList
4610: 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73 65   = pList;.  asse
4620: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
4630: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49  erty(pNew, EP_xI
4640: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71  sSelect) );.  sq
4650: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
4660: 68 74 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29  ht(pParse, pNew)
4670: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
4680: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
4690: 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62   a variable numb
46a0: 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73  er to an express
46b0: 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73  ion that encodes
46c0: 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69   a wildcard.** i
46d0: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
46e0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a  QL statement.  .
46f0: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
4700: 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20  consisting of a 
4710: 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61  single "?" are a
4720: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74  ssigned the next
4730: 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76   sequential.** v
4740: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a  ariable number..
4750: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
4760: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
4770: 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  n" are assigned 
4780: 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22  the number "nnn"
4790: 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75  .  We make.** su
47a0: 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20  re "nnn" is not 
47b0: 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69 64 20  too be to avoid 
47c0: 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72 76  a denial of serv
47d0: 69 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e 0a  ice attack when.
47e0: 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  ** the SQL state
47f0: 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ment comes from 
4800: 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75 72  an external sour
4810: 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  ce..**.** Wildca
4820: 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rds of the form 
4830: 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22 2c 20  ":aaa", "@aaa", 
4840: 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61 73  or "$aaa" are as
4850: 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65 20  signed the same 
4860: 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68 65  number.** as the
4870: 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61 6e   previous instan
4880: 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 77  ce of the same w
4890: 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66 20  ildcard.  Or if 
48a0: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
48b0: 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66  t.** instance of
48c0: 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20 74   the wildcard, t
48d0: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 69 61  he next sequenia
48e0: 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  l variable numbe
48f0: 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65 64  r is.** assigned
4900: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4910: 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e 75  3ExprAssignVarNu
4920: 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61 72  mber(Parse *pPar
4930: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
4940: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
4950: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
4960: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 0a  const char *z;..
4970: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
4980: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
4990: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
49a0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
49b0: 74 56 61 6c 75 65 7c 45 50 5f 52 65 64 75 63 65  tValue|EP_Reduce
49c0: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  d|EP_TokenOnly) 
49d0: 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70 72 2d 3e  );.  z = pExpr->
49e0: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65  u.zToken;.  asse
49f0: 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 61 73  rt( z!=0 );.  as
4a00: 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30 20 29 3b  sert( z[0]!=0 );
4a10: 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29  .  if( z[1]==0 )
4a20: 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72  {.    /* Wildcar
4a30: 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  d of the form "?
4a40: 22 2e 20 20 41 73 73 69 67 6e 20 74 68 65 20 6e  ".  Assign the n
4a50: 65 78 74 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ext variable num
4a60: 62 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ber */.    asser
4a70: 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a  t( z[0]=='?' );.
4a80: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
4a90: 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70  mn = (ynVar)(++p
4aa0: 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20  Parse->nVar);.  
4ab0: 7d 65 6c 73 65 7b 0a 20 20 20 20 79 6e 56 61 72  }else{.    ynVar
4ac0: 20 78 20 3d 20 30 3b 0a 20 20 20 20 75 33 32 20   x = 0;.    u32 
4ad0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
4ae0: 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28 20  n30(z);.    if( 
4af0: 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20  z[0]=='?' ){.   
4b00: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f     /* Wildcard o
4b10: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e  f the form "?nnn
4b20: 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e 6e  ".  Convert "nnn
4b30: 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  " to an integer 
4b40: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 73 65  and.      ** use
4b50: 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69 61   it as the varia
4b60: 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
4b70: 20 20 20 20 69 36 34 20 69 3b 0a 20 20 20 20 20      i64 i;.     
4b80: 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3d 3d 73 71   int bOk = 0==sq
4b90: 6c 69 74 65 33 41 74 6f 69 36 34 28 26 7a 5b 31  lite3Atoi64(&z[1
4ba0: 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c 49  ], &i, n-1, SQLI
4bb0: 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20  TE_UTF8);.      
4bc0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
4bd0: 20 78 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20   x = (ynVar)i;. 
4be0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
4bf0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
4c00: 74 63 61 73 65 28 20 69 3d 3d 31 20 29 3b 0a 20  tcase( i==1 );. 
4c10: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
4c20: 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ==db->aLimit[SQL
4c30: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
4c40: 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29 3b 0a  LE_NUMBER]-1 );.
4c50: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
4c60: 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  i==db->aLimit[SQ
4c70: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
4c80: 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a 20  BLE_NUMBER] );. 
4c90: 20 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20       if( bOk==0 
4ca0: 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e  || i<1 || i>db->
4cb0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
4cc0: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
4cd0: 42 45 52 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  BER] ){.        
4ce0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
4cf0: 70 50 61 72 73 65 2c 20 22 76 61 72 69 61 62 6c  pParse, "variabl
4d00: 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62 65  e number must be
4d10: 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64 20   between ?1 and 
4d20: 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ?%d",.          
4d30: 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c    db->aLimit[SQL
4d40: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
4d50: 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20 20 20  LE_NUMBER]);.   
4d60: 20 20 20 20 20 78 20 3d 20 30 3b 0a 20 20 20 20       x = 0;.    
4d70: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e    }.      if( i>
4d80: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a  pParse->nVar ){.
4d90: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
4da0: 6e 56 61 72 20 3d 20 28 69 6e 74 29 69 3b 0a 20  nVar = (int)i;. 
4db0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
4dc0: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63  {.      /* Wildc
4dd0: 61 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22  ards like ":aaa"
4de0: 2c 20 22 24 61 61 61 22 20 6f 72 20 22 40 61 61  , "$aaa" or "@aa
4df0: 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73  a".  Reuse the s
4e00: 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20  ame variable.   
4e10: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20     ** number as 
4e20: 74 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72  the prior appear
4e30: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
4e40: 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65   name, or if the
4e50: 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68   name.      ** h
4e60: 61 73 20 6e 65 76 65 72 20 61 70 70 65 61 72 65  as never appeare
4e70: 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20  d before, reuse 
4e80: 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c  the same variabl
4e90: 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a  e number.      *
4ea0: 2f 0a 20 20 20 20 20 20 79 6e 56 61 72 20 69 3b  /.      ynVar i;
4eb0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
4ec0: 69 3c 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3b  i<pParse->nzVar;
4ed0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
4ee0: 66 28 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  f( pParse->azVar
4ef0: 5b 69 5d 20 26 26 20 73 74 72 63 6d 70 28 70 50  [i] && strcmp(pP
4f00: 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69 5d 2c 7a  arse->azVar[i],z
4f10: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
4f20: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
4f30: 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69 2b   = x = (ynVar)i+
4f40: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
4f50: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
4f60: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
4f70: 78 3d 3d 30 20 29 20 78 20 3d 20 70 45 78 70 72  x==0 ) x = pExpr
4f80: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56  ->iColumn = (ynV
4f90: 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  ar)(++pParse->nV
4fa0: 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ar);.    }.    i
4fb0: 66 28 20 78 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( x>0 ){.      
4fc0: 69 66 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e 7a  if( x>pParse->nz
4fd0: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Var ){.        c
4fe0: 68 61 72 20 2a 2a 61 3b 0a 20 20 20 20 20 20 20  har **a;.       
4ff0: 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65   a = sqlite3DbRe
5000: 61 6c 6c 6f 63 28 64 62 2c 20 70 50 61 72 73 65  alloc(db, pParse
5010: 2d 3e 61 7a 56 61 72 2c 20 78 2a 73 69 7a 65 6f  ->azVar, x*sizeo
5020: 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20  f(a[0]));.      
5030: 20 20 69 66 28 20 61 3d 3d 30 20 29 20 72 65 74    if( a==0 ) ret
5040: 75 72 6e 3b 20 20 2f 2a 20 45 72 72 6f 72 20 72  urn;  /* Error r
5050: 65 70 6f 72 74 65 64 20 74 68 72 6f 75 67 68 20  eported through 
5060: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
5070: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 61 72   */.        pPar
5080: 73 65 2d 3e 61 7a 56 61 72 20 3d 20 61 3b 0a 20  se->azVar = a;. 
5090: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61         memset(&a
50a0: 5b 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 5d 2c  [pParse->nzVar],
50b0: 20 30 2c 20 28 78 2d 70 50 61 72 73 65 2d 3e 6e   0, (x-pParse->n
50c0: 7a 56 61 72 29 2a 73 69 7a 65 6f 66 28 61 5b 30  zVar)*sizeof(a[0
50d0: 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  ]));.        pPa
50e0: 72 73 65 2d 3e 6e 7a 56 61 72 20 3d 20 78 3b 0a  rse->nzVar = x;.
50f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
5100: 28 20 7a 5b 30 5d 21 3d 27 3f 27 20 7c 7c 20 70  ( z[0]!='?' || p
5110: 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31  Parse->azVar[x-1
5120: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
5130: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5140: 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b  , pParse->azVar[
5150: 78 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 70  x-1]);.        p
5160: 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31  Parse->azVar[x-1
5170: 5d 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  ] = sqlite3DbStr
5180: 4e 44 75 70 28 64 62 2c 20 7a 2c 20 6e 29 3b 0a  NDup(db, z, n);.
5190: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
51a0: 7d 20 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  } .  if( !pParse
51b0: 2d 3e 6e 45 72 72 20 26 26 20 70 50 61 72 73 65  ->nErr && pParse
51c0: 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61 4c 69 6d 69  ->nVar>db->aLimi
51d0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
51e0: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20  ARIABLE_NUMBER] 
51f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
5200: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
5210: 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72  too many SQL var
5220: 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a  iables");.  }.}.
5230: 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65  ./*.** Recursive
5240: 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70  ly delete an exp
5250: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f  ression tree..*/
5260: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
5270: 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  rDelete(sqlite3 
5280: 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20  *db, Expr *p){. 
5290: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
52a0: 72 6e 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20  rn;.  /* Sanity 
52b0: 63 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74 68  check: Assert th
52c0: 61 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65 20  at the IntValue 
52d0: 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20  is non-negative 
52e0: 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a  if it exists */.
52f0: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
5300: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5310: 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70 2d  _IntValue) || p-
5320: 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a  >u.iValue>=0 );.
5330: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
5340: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
5350: 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 2f  enOnly) ){.    /
5360: 2a 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69  * The Expr.x uni
5370: 6f 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  on is never used
5380: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
5390: 65 20 61 73 20 45 78 70 72 2e 70 52 69 67 68 74  e as Expr.pRight
53a0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
53b0: 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c  p->x.pList==0 ||
53c0: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b   p->pRight==0 );
53d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
53e0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
53f0: 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eft);.    sqlite
5400: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
5410: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  p->pRight);.    
5420: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
5430: 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b  rty(p, EP_MemTok
5440: 65 6e 29 20 29 20 73 71 6c 69 74 65 33 44 62 46  en) ) sqlite3DbF
5450: 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f  ree(db, p->u.zTo
5460: 6b 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 45 78  ken);.    if( Ex
5470: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
5480: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
5490: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
54a0: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
54b0: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
54c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
54d0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
54e0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70  elete(db, p->x.p
54f0: 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
5500: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
5510: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53 74  roperty(p, EP_St
5520: 61 74 69 63 29 20 29 7b 0a 20 20 20 20 73 71 6c  atic) ){.    sql
5530: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5540: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
5550: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
5560: 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63  r of bytes alloc
5570: 61 74 65 64 20 66 6f 72 20 74 68 65 20 65 78 70  ated for the exp
5580: 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75 72  ression structur
5590: 65 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20  e .** passed as 
55a0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
55b0: 6e 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61  nt. This is alwa
55c0: 79 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46  ys one of EXPR_F
55d0: 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50 52  ULLSIZE,.** EXPR
55e0: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72 20  _REDUCEDSIZE or 
55f0: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
5600: 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ZE..*/.static in
5610: 74 20 65 78 70 72 53 74 72 75 63 74 53 69 7a 65  t exprStructSize
5620: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
5630: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
5640: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
5650: 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ) ) return EXPR_
5660: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20  TOKENONLYSIZE;. 
5670: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
5680: 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63  erty(p, EP_Reduc
5690: 65 64 29 20 29 20 72 65 74 75 72 6e 20 45 58 50  ed) ) return EXP
56a0: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a 20  R_REDUCEDSIZE;. 
56b0: 20 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55 4c   return EXPR_FUL
56c0: 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  LSIZE;.}../*.** 
56d0: 54 68 65 20 64 75 70 65 64 45 78 70 72 2a 53 69  The dupedExpr*Si
56e0: 7a 65 28 29 20 72 6f 75 74 69 6e 65 73 20 65 61  ze() routines ea
56f0: 63 68 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  ch return the nu
5700: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
5710: 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74 6f  quired.** to sto
5720: 72 65 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20  re a copy of an 
5730: 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 65 78  expression or ex
5740: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
5750: 54 68 65 79 20 64 69 66 66 65 72 20 69 6e 0a 2a  They differ in.*
5760: 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74 68  * how much of th
5770: 65 20 74 72 65 65 20 69 73 20 6d 65 61 73 75 72  e tree is measur
5780: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 75  ed..**.**     du
5790: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
57a0: 65 28 29 20 20 20 20 20 53 69 7a 65 20 6f 66 20  e()     Size of 
57b0: 6f 6e 6c 79 20 74 68 65 20 45 78 70 72 20 73 74  only the Expr st
57c0: 72 75 63 74 75 72 65 20 0a 2a 2a 20 20 20 20 20  ructure .**     
57d0: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
57e0: 65 28 29 20 20 20 20 20 20 20 53 69 7a 65 20 6f  e()       Size o
57f0: 66 20 45 78 70 72 20 2b 20 73 70 61 63 65 20 66  f Expr + space f
5800: 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20  or token.**     
5810: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 29 20  dupedExprSize() 
5820: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2b            Expr +
5830: 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65 65   token + subtree
5840: 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a   components.**.*
5850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
58a0: 20 54 68 65 20 64 75 70 65 64 45 78 70 72 53 74   The dupedExprSt
58b0: 72 75 63 74 53 69 7a 65 28 29 20 66 75 6e 63 74  ructSize() funct
58c0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 77 6f 20  ion returns two 
58d0: 76 61 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f 67  values OR-ed tog
58e0: 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29 20  ether:  .** (1) 
58f0: 74 68 65 20 73 70 61 63 65 20 72 65 71 75 69 72  the space requir
5900: 65 64 20 66 6f 72 20 61 20 63 6f 70 79 20 6f 66  ed for a copy of
5910: 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74   the Expr struct
5920: 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a  ure only and .**
5930: 20 28 32 29 20 74 68 65 20 45 50 5f 78 78 78 20   (2) the EP_xxx 
5940: 66 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69 63  flags that indic
5950: 61 74 65 20 77 68 61 74 20 74 68 65 20 73 74 72  ate what the str
5960: 75 63 74 75 72 65 20 73 69 7a 65 20 73 68 6f 75  ucture size shou
5970: 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72 65  ld be..** The re
5980: 74 75 72 6e 20 76 61 6c 75 65 73 20 69 73 20 61  turn values is a
5990: 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a  lways one of:.**
59a0: 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 46 55  .**      EXPR_FU
59b0: 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20 45  LLSIZE.**      E
59c0: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
59d0: 20 20 7c 20 45 50 5f 52 65 64 75 63 65 64 0a 2a    | EP_Reduced.*
59e0: 2a 20 20 20 20 20 20 45 58 50 52 5f 54 4f 4b 45  *      EXPR_TOKE
59f0: 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54  NONLYSIZE | EP_T
5a00: 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54  okenOnly.**.** T
5a10: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73  he size of the s
5a20: 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20  tructure can be 
5a30: 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67  found by masking
5a40: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
5a50: 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75  e.** of this rou
5a60: 74 69 6e 65 20 77 69 74 68 20 30 78 66 66 66 2e  tine with 0xfff.
5a70: 20 20 54 68 65 20 66 6c 61 67 73 20 63 61 6e 20    The flags can 
5a80: 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b  be found by mask
5a90: 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74 75 72  ing the.** retur
5aa0: 6e 20 76 61 6c 75 65 20 77 69 74 68 20 45 50 5f  n value with EP_
5ab0: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
5ac0: 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  Only..**.** Note
5ad0: 20 74 68 61 74 20 77 69 74 68 20 66 6c 61 67 73   that with flags
5ae0: 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  ==EXPRDUP_REDUCE
5af0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 73 20  , this routines 
5b00: 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73 69  works on full-si
5b10: 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65 64  ze.** (unreduced
5b20: 29 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20 61  ) Expr objects a
5b30: 73 20 74 68 65 79 20 6f 72 20 6f 72 69 67 69 6e  s they or origin
5b40: 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74 65 64  ally constructed
5b50: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e 0a   by the parser..
5b60: 2a 2a 20 44 75 72 69 6e 67 20 65 78 70 72 65 73  ** During expres
5b70: 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20 65  sion analysis, e
5b80: 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
5b90: 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64   is computed and
5ba0: 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c   moved into.** l
5bb0: 61 74 65 72 20 70 61 72 74 73 20 6f 66 20 74 65  ater parts of te
5bc0: 68 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e  h Expr object an
5bd0: 64 20 74 68 61 74 20 65 78 74 72 61 20 69 6e 66  d that extra inf
5be0: 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20 67  ormation might g
5bf0: 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f 66  et chopped.** of
5c00: 66 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  f if the express
5c10: 69 6f 6e 20 69 73 20 72 65 64 75 63 65 64 2e 20  ion is reduced. 
5c20: 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20   Note also that 
5c30: 69 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  it does not work
5c40: 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 20 45 58   to.** make a EX
5c50: 50 52 44 55 50 5f 52 45 44 55 43 45 20 63 6f 70  PRDUP_REDUCE cop
5c60: 79 20 6f 66 20 61 20 72 65 64 75 63 65 64 20 65  y of a reduced e
5c70: 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 74 20 69  xpression.  It i
5c80: 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20  s only legal.** 
5c90: 74 6f 20 72 65 64 75 63 65 20 61 20 70 72 69 73  to reduce a pris
5ca0: 74 69 6e 65 20 65 78 70 72 65 73 73 69 6f 6e 20  tine expression 
5cb0: 74 72 65 65 20 66 72 6f 6d 20 74 68 65 20 70 61  tree from the pa
5cc0: 72 73 65 72 2e 20 20 54 68 65 20 69 6d 70 6c 65  rser.  The imple
5cd0: 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  mentation.** of 
5ce0: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
5cf0: 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d 75  ize() contain mu
5d00: 6c 74 69 70 6c 65 20 61 73 73 65 72 74 28 29 20  ltiple assert() 
5d10: 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
5d20: 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e  attempt.** to en
5d30: 66 6f 72 63 65 20 74 68 69 73 20 63 6f 6e 73 74  force this const
5d40: 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  raint..*/.static
5d50: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 74   int dupedExprSt
5d60: 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70  ructSize(Expr *p
5d70: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
5d80: 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73 73  int nSize;.  ass
5d90: 65 72 74 28 20 66 6c 61 67 73 3d 3d 45 58 50 52  ert( flags==EXPR
5da0: 44 55 50 5f 52 45 44 55 43 45 20 7c 7c 20 66 6c  DUP_REDUCE || fl
5db0: 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c  ags==0 ); /* Onl
5dc0: 79 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75 65  y one flag value
5dd0: 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 61 73   allowed */.  as
5de0: 73 65 72 74 28 20 45 58 50 52 5f 46 55 4c 4c 53  sert( EXPR_FULLS
5df0: 49 5a 45 3c 3d 30 78 66 66 66 20 29 3b 0a 20 20  IZE<=0xfff );.  
5e00: 61 73 73 65 72 74 28 20 28 30 78 66 66 66 20 26  assert( (0xfff &
5e10: 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f   (EP_Reduced|EP_
5e20: 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29  TokenOnly))==0 )
5e30: 3b 0a 20 20 69 66 28 20 30 3d 3d 28 66 6c 61 67  ;.  if( 0==(flag
5e40: 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  s&EXPRDUP_REDUCE
5e50: 29 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d  ) ){.    nSize =
5e60: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a   EXPR_FULLSIZE;.
5e70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
5e80: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
5e90: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
5ea0: 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
5eb0: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
5ec0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
5ed0: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
5ee0: 29 20 29 3b 20 0a 20 20 20 20 61 73 73 65 72 74  ) ); .    assert
5ef0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
5f00: 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65  ty(p, EP_MemToke
5f10: 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  n) );.    assert
5f20: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
5f30: 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63  ty(p, EP_NoReduc
5f40: 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  e) );.    if( p-
5f50: 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 78 2e 70  >pLeft || p->x.p
5f60: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 53  List ){.      nS
5f70: 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55 43  ize = EXPR_REDUC
5f80: 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64 75  EDSIZE | EP_Redu
5f90: 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ced;.    }else{.
5fa0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
5fb0: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
5fc0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
5fd0: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c  _TOKENONLYSIZE |
5fe0: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20   EP_TokenOnly;. 
5ff0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6000: 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n nSize;.}../*.*
6010: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
6020: 72 65 74 75 72 6e 73 20 74 68 65 20 73 70 61 63  returns the spac
6030: 65 20 69 6e 20 62 79 74 65 73 20 72 65 71 75 69  e in bytes requi
6040: 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  red to store the
6050: 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68 65   copy .** of the
6060: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
6070: 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68  and a copy of th
6080: 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20  e Expr.u.zToken 
6090: 73 74 72 69 6e 67 20 28 69 66 20 74 68 61 74 0a  string (if that.
60a0: 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 64 65 66  ** string is def
60b0: 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69 63  ined.).*/.static
60c0: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 4e 6f   int dupedExprNo
60d0: 64 65 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20  deSize(Expr *p, 
60e0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
60f0: 74 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45  t nByte = dupedE
6100: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c  xprStructSize(p,
6110: 20 66 6c 61 67 73 29 20 26 20 30 78 66 66 66 3b   flags) & 0xfff;
6120: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
6130: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e  roperty(p, EP_In
6140: 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e  tValue) && p->u.
6150: 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e 42  zToken ){.    nB
6160: 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  yte += sqlite3St
6170: 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b  rlen30(p->u.zTok
6180: 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74  en)+1;.  }.  ret
6190: 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74 65  urn ROUND8(nByte
61a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
61b0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
61c0: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
61d0: 74 6f 20 63 72 65 61 74 65 20 61 20 64 75 70 6c  to create a dupl
61e0: 69 63 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a  icate of the .**
61f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73   expression pass
6200: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
6210: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 73 65  argument. The se
6220: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
6230: 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61   a.** mask conta
6240: 69 6e 69 6e 67 20 45 58 50 52 44 55 50 5f 58 58  ining EXPRDUP_XX
6250: 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54  X flags..**.** T
6260: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
6270: 64 20 69 6e 63 6c 75 64 65 73 20 73 70 61 63 65  d includes space
6280: 20 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f 70   to create a cop
6290: 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  y of the Expr st
62a0: 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61  ruct.** itself a
62b0: 6e 64 20 74 68 65 20 62 75 66 66 65 72 20 72 65  nd the buffer re
62c0: 66 65 72 72 65 64 20 74 6f 20 62 79 20 45 78 70  ferred to by Exp
62d0: 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61  r.u.zToken, if a
62e0: 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ny..**.** If the
62f0: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20   EXPRDUP_REDUCE 
6300: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
6310: 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
6320: 75 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20  ue includes .** 
6330: 73 70 61 63 65 20 74 6f 20 64 75 70 6c 69 63 61  space to duplica
6340: 74 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65  te all Expr node
6350: 73 20 69 6e 20 74 68 65 20 74 72 65 65 20 66 6f  s in the tree fo
6360: 72 6d 65 64 20 62 79 20 45 78 70 72 2e 70 4c 65  rmed by Expr.pLe
6370: 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e  ft .** and Expr.
6380: 70 52 69 67 68 74 20 76 61 72 69 61 62 6c 65 73  pRight variables
6390: 20 28 62 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e   (but not for an
63a0: 79 20 73 74 72 75 63 74 75 72 65 73 20 70 6f 69  y structures poi
63b0: 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64  nted to or .** d
63c0: 65 73 63 65 6e 64 65 64 20 66 72 6f 6d 20 74 68  escended from th
63d0: 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f  e Expr.x.pList o
63e0: 72 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74  r Expr.x.pSelect
63f0: 20 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a   variables)..*/.
6400: 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64  static int duped
6410: 45 78 70 72 53 69 7a 65 28 45 78 70 72 20 2a 70  ExprSize(Expr *p
6420: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
6430: 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20  int nByte = 0;. 
6440: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6e 42   if( p ){.    nB
6450: 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 4e  yte = dupedExprN
6460: 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  odeSize(p, flags
6470: 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  );.    if( flags
6480: 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  &EXPRDUP_REDUCE 
6490: 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b  ){.      nByte +
64a0: 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  = dupedExprSize(
64b0: 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73 29  p->pLeft, flags)
64c0: 20 2b 20 64 75 70 65 64 45 78 70 72 53 69 7a 65   + dupedExprSize
64d0: 28 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61 67  (p->pRight, flag
64e0: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  s);.    }.  }.  
64f0: 72 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a  return nByte;.}.
6500: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
6510: 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20  tion is similar 
6520: 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  to sqlite3ExprDu
6530: 70 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74  p(), except that
6540: 20 69 66 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a   if pzBuffer .**
6550: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
6560: 6e 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20 61  n *pzBuffer is a
6570: 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20  ssumed to point 
6580: 74 6f 20 61 20 62 75 66 66 65 72 20 6c 61 72 67  to a buffer larg
6590: 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20  e enough .** to 
65a0: 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f  store the copy o
65b0: 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2c 20  f expression p, 
65c0: 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 70 2d  the copies of p-
65d0: 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66  >u.zToken.** (if
65e0: 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e   applicable), an
65f0: 64 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20  d the copies of 
6600: 74 68 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64  the p->pLeft and
6610: 20 70 2d 3e 70 52 69 67 68 74 20 65 78 70 72 65   p->pRight expre
6620: 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e  ssions,.** if an
6630: 79 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  y. Before return
6640: 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72 20 69  ing, *pzBuffer i
6650: 73 20 73 65 74 20 74 6f 20 74 68 65 20 66 69 72  s set to the fir
6660: 73 74 20 62 79 74 65 20 70 61 73 73 65 64 20 74  st byte passed t
6670: 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f 66  he.** portion of
6680: 20 74 68 65 20 62 75 66 66 65 72 20 63 6f 70 69   the buffer copi
6690: 65 64 20 69 6e 74 6f 20 62 79 20 74 68 69 73 20  ed into by this 
66a0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
66b0: 74 69 63 20 45 78 70 72 20 2a 65 78 70 72 44 75  tic Expr *exprDu
66c0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
66d0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
66e0: 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65 72  s, u8 **pzBuffer
66f0: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 20  ){.  Expr *pNew 
6700: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
6710: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
6720: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
6730: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63    if( p ){.    c
6740: 6f 6e 73 74 20 69 6e 74 20 69 73 52 65 64 75 63  onst int isReduc
6750: 65 64 20 3d 20 28 66 6c 61 67 73 26 45 58 50 52  ed = (flags&EXPR
6760: 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20  DUP_REDUCE);.   
6770: 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a 20 20 20   u8 *zAlloc;.   
6780: 20 75 33 32 20 73 74 61 74 69 63 46 6c 61 67 20   u32 staticFlag 
6790: 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  = 0;..    assert
67a0: 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c  ( pzBuffer==0 ||
67b0: 20 69 73 52 65 64 75 63 65 64 20 29 3b 0a 0a 20   isReduced );.. 
67c0: 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
67d0: 20 77 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   where to write 
67e0: 74 68 65 20 6e 65 77 20 45 78 70 72 20 73 74 72  the new Expr str
67f0: 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20 20 69  ucture. */.    i
6800: 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20  f( pzBuffer ){. 
6810: 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70       zAlloc = *p
6820: 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 20 20 73  zBuffer;.      s
6830: 74 61 74 69 63 46 6c 61 67 20 3d 20 45 50 5f 53  taticFlag = EP_S
6840: 74 61 74 69 63 3b 0a 20 20 20 20 7d 65 6c 73 65  tatic;.    }else
6850: 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d  {.      zAlloc =
6860: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
6870: 52 61 77 28 64 62 2c 20 64 75 70 65 64 45 78 70  Raw(db, dupedExp
6880: 72 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 29  rSize(p, flags))
6890: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
68a0: 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f   = (Expr *)zAllo
68b0: 63 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77  c;..    if( pNew
68c0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65 74   ){.      /* Set
68d0: 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74 68 65   nNewSize to the
68e0: 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64 20   size allocated 
68f0: 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75 72  for the structur
6900: 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20 20  e pointed to.   
6910: 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20 54     ** by pNew. T
6920: 68 69 73 20 69 73 20 65 69 74 68 65 72 20 45 58  his is either EX
6930: 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58 50  PR_FULLSIZE, EXP
6940: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72  R_REDUCEDSIZE or
6950: 0a 20 20 20 20 20 20 2a 2a 20 45 58 50 52 5f 54  .      ** EXPR_T
6960: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54  OKENONLYSIZE. nT
6970: 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74  oken is set to t
6980: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
6990: 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20  es consumed.    
69a0: 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f 70 79    ** by the copy
69b0: 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f   of the p->u.zTo
69c0: 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 61  ken string (if a
69d0: 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ny)..      */.  
69e0: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
69f0: 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20 3d  ed nStructSize =
6a00: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
6a10: 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a  Size(p, flags);.
6a20: 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
6a30: 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72 75  nNewSize = nStru
6a40: 63 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b 0a  ctSize & 0xfff;.
6a50: 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e        int nToken
6a60: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 45 78 70  ;.      if( !Exp
6a70: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
6a80: 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20  EP_IntValue) && 
6a90: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20  p->u.zToken ){. 
6aa0: 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20         nToken = 
6ab0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
6ac0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31  p->u.zToken) + 1
6ad0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6ae0: 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20         nToken = 
6af0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
6b00: 20 69 66 28 20 69 73 52 65 64 75 63 65 64 20 29   if( isReduced )
6b10: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
6b20: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
6b30: 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29  y(p, EP_Reduced)
6b40: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  ==0 );.        m
6b50: 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c  emcpy(zAlloc, p,
6b60: 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20   nNewSize);.    
6b70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6b80: 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20 65 78 70   int nSize = exp
6b90: 72 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b 0a  rStructSize(p);.
6ba0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
6bb0: 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65 29  Alloc, p, nSize)
6bc0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
6bd0: 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c  (&zAlloc[nSize],
6be0: 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a   0, EXPR_FULLSIZ
6bf0: 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  E-nSize);.      
6c00: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20  }..      /* Set 
6c10: 74 68 65 20 45 50 5f 52 65 64 75 63 65 64 2c 20  the EP_Reduced, 
6c20: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e  EP_TokenOnly, an
6c30: 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c 61 67  d EP_Static flag
6c40: 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e  s appropriately.
6c50: 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
6c60: 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52 65  flags &= ~(EP_Re
6c70: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
6c80: 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c 45 50 5f  ly|EP_Static|EP_
6c90: 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  MemToken);.     
6ca0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
6cb0: 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 28 45  nStructSize & (E
6cc0: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
6cd0: 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 70  enOnly);.      p
6ce0: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74  New->flags |= st
6cf0: 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20 20  aticFlag;..     
6d00: 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 2d 3e   /* Copy the p->
6d10: 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c  u.zToken string,
6d20: 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20   if any. */.    
6d30: 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a    if( nToken ){.
6d40: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
6d50: 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a  oken = pNew->u.z
6d60: 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26  Token = (char*)&
6d70: 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d  zAlloc[nNewSize]
6d80: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
6d90: 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54  (zToken, p->u.zT
6da0: 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20  oken, nToken);. 
6db0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
6dc0: 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c  ( 0==((p->flags|
6dd0: 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20 45  pNew->flags) & E
6de0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
6df0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
6e00: 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e 70  in the pNew->x.p
6e10: 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d 3e  Select or pNew->
6e20: 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e 20  x.pList member. 
6e30: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 45  */.        if( E
6e40: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
6e50: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
6e60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
6e70: 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73  w->x.pSelect = s
6e80: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
6e90: 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74  db, p->x.pSelect
6ea0: 2c 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20  , isReduced);.  
6eb0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6ec0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70         pNew->x.p
6ed0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
6ee0: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
6ef0: 3e 78 2e 70 4c 69 73 74 2c 20 69 73 52 65 64 75  >x.pList, isRedu
6f00: 63 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ced);.        }.
6f10: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
6f20: 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e  * Fill in pNew->
6f30: 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d 3e  pLeft and pNew->
6f40: 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20  pRight. */.     
6f50: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
6f60: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65  erty(pNew, EP_Re
6f70: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
6f80: 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ly) ){.        z
6f90: 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78  Alloc += dupedEx
6fa0: 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c  prNodeSize(p, fl
6fb0: 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ags);.        if
6fc0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
6fd0: 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75 63  y(pNew, EP_Reduc
6fe0: 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ed) ){.         
6ff0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 65   pNew->pLeft = e
7000: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
7010: 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44  eft, EXPRDUP_RED
7020: 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a 20  UCE, &zAlloc);. 
7030: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
7040: 52 69 67 68 74 20 3d 20 65 78 70 72 44 75 70 28  Right = exprDup(
7050: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45  db, p->pRight, E
7060: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
7070: 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  zAlloc);.       
7080: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
7090: 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20  zBuffer ){.     
70a0: 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72 20 3d       *pzBuffer =
70b0: 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 20   zAlloc;.       
70c0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
70d0: 20 20 20 20 20 20 20 20 69 66 28 20 21 45 78 70          if( !Exp
70e0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
70f0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
7100: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
7110: 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  >pLeft = sqlite3
7120: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
7130: 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Left, 0);.      
7140: 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74      pNew->pRight
7150: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
7160: 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c  p(db, p->pRight,
7170: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
7180: 20 20 20 20 20 7d 0a 0a 20 20 20 20 7d 0a 20 20       }..    }.  
7190: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
71a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
71b0: 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66  llowing group of
71c0: 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64   routines make d
71d0: 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78  eep copies of ex
71e0: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78  pressions,.** ex
71f0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20  pression lists, 
7200: 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65  ID lists, and se
7210: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e  lect statements.
7220: 20 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e    The copies can
7230: 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28  .** be deleted (
7240: 62 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20  by being passed 
7250: 74 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74  to their respect
7260: 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20  ive ...Delete() 
7270: 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74  routines).** wit
7280: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
7290: 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a  he originals..**
72a0: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
72b0: 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64  on list, ID, and
72c0: 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65   source lists re
72d0: 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45  turn by sqlite3E
72e0: 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a  xprListDup(),.**
72f0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
7300: 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33  p(), and sqlite3
7310: 53 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e  SrcListDup() can
7320: 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20   not be further 
7330: 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20  expanded .** by 
7340: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
7350: 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41   to sqlite*ListA
7360: 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73  ppend() routines
7370: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c  ..**.** Any tabl
7380: 65 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c  es that the SrcL
7390: 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ist might point 
73a0: 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69  to are not dupli
73b0: 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cated..**.** The
73c0: 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
73d0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62   contains a comb
73e0: 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45  ination of the E
73f0: 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73  XPRDUP_XXX flags
7400: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52  ..** If the EXPR
7410: 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20  DUP_REDUCE flag 
7420: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
7430: 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72   structure retur
7440: 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e  ned is a.** trun
7450: 63 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  cated version of
7460: 20 74 68 65 20 75 73 75 61 6c 20 45 78 70 72 20   the usual Expr 
7470: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77  structure that w
7480: 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73  ill be stored as
7490: 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20  .** part of the 
74a0: 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
74b0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
74c0: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
74d0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
74e0: 33 45 78 70 72 44 75 70 28 73 71 6c 69 74 65 33  3ExprDup(sqlite3
74f0: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69   *db, Expr *p, i
7500: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 72 65 74  nt flags){.  ret
7510: 75 72 6e 20 65 78 70 72 44 75 70 28 64 62 2c 20  urn exprDup(db, 
7520: 70 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 7d 0a  p, flags, 0);.}.
7530: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
7540: 33 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c  3ExprListDup(sql
7550: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69  ite3 *db, ExprLi
7560: 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  st *p, int flags
7570: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
7580: 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78  New;.  struct Ex
7590: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
75a0: 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20  em, *pOldItem;. 
75b0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d   int i;.  if( p=
75c0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
75d0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
75e0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
75f0: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
7600: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
7610: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
7620: 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 30 3b 0a  ->iECursor = 0;.
7630: 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20    pNew->nExpr = 
7640: 69 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20  i = p->nExpr;.  
7650: 69 66 28 20 28 66 6c 61 67 73 20 26 20 45 58 50  if( (flags & EXP
7660: 52 44 55 50 5f 52 45 44 55 43 45 29 3d 3d 30 20  RDUP_REDUCE)==0 
7670: 29 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e  ) for(i=1; i<p->
7680: 6e 45 78 70 72 3b 20 69 2b 3d 69 29 7b 7d 0a 20  nExpr; i+=i){}. 
7690: 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d   pNew->a = pItem
76a0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
76b0: 6f 63 52 61 77 28 64 62 2c 20 20 69 2a 73 69 7a  ocRaw(db,  i*siz
76c0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
76d0: 20 20 69 66 28 20 70 49 74 65 6d 3d 3d 30 20 29    if( pItem==0 )
76e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
76f0: 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20  ree(db, pNew);. 
7700: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7710: 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70   .  pOldItem = p
7720: 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ->a;.  for(i=0; 
7730: 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  i<p->nExpr; i++,
7740: 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74   pItem++, pOldIt
7750: 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  em++){.    Expr 
7760: 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64  *pOldExpr = pOld
7770: 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
7780: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20   pItem->pExpr = 
7790: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
77a0: 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61  b, pOldExpr, fla
77b0: 67 73 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  gs);.    pItem->
77c0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
77d0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
77e0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
77f0: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
7800: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
7810: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
7820: 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d  Span);.    pItem
7830: 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f  ->sortOrder = pO
7840: 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65  ldItem->sortOrde
7850: 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f  r;.    pItem->do
7860: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65  ne = 0;.    pIte
7870: 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20  m->bSpanIsTab = 
7880: 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 70 61 6e 49  pOldItem->bSpanI
7890: 73 54 61 62 3b 0a 20 20 20 20 70 49 74 65 6d 2d  sTab;.    pItem-
78a0: 3e 75 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 75  >u = pOldItem->u
78b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
78c0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  New;.}../*.** If
78d0: 20 63 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65   cursors, trigge
78e0: 72 73 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75  rs, views and su
78f0: 62 71 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c  bqueries are all
7900: 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a   omitted from.**
7910: 20 74 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e   the build, then
7920: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c   none of the fol
7930: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c  lowing routines,
7940: 20 65 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20   except for .** 
7950: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
7960: 28 29 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  (), can be calle
7970: 64 2e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  d. sqlite3Select
7980: 44 75 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d  Dup() is sometim
7990: 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74  es.** called wit
79a0: 68 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e  h a NULL argumen
79b0: 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  t..*/.#if !defin
79c0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
79d0: 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
79e0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  (SQLITE_OMIT_TRI
79f0: 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66  GGER) \. || !def
7a00: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
7a10: 5f 53 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69  _SUBQUERY).SrcLi
7a20: 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
7a30: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
7a40: 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 69  b, SrcList *p, i
7a50: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 72 63  nt flags){.  Src
7a60: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  List *pNew;.  in
7a70: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  t i;.  int nByte
7a80: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
7a90: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65  eturn 0;.  nByte
7aa0: 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20   = sizeof(*p) + 
7ab0: 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a  (p->nSrc>0 ? siz
7ac0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28  eof(p->a[0]) * (
7ad0: 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b  p->nSrc-1) : 0);
7ae0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
7af0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
7b00: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
7b10: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
7b20: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63   0;.  pNew->nSrc
7b30: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
7b40: 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72  = p->nSrc;.  for
7b50: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b  (i=0; i<p->nSrc;
7b60: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
7b70: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
7b80: 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77  pNewItem = &pNew
7b90: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75  ->a[i];.    stru
7ba0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
7bb0: 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e  *pOldItem = &p->
7bc0: 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20  a[i];.    Table 
7bd0: 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49  *pTab;.    pNewI
7be0: 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70  tem->pSchema = p
7bf0: 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61  OldItem->pSchema
7c00: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
7c10: 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69  zDatabase = sqli
7c20: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
7c30: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62  pOldItem->zDatab
7c40: 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ase);.    pNewIt
7c50: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = 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 4e 61 6d 65 29  pOldItem->zName)
7c80: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
7c90: 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33  zAlias = sqlite3
7ca0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
7cb0: 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  dItem->zAlias);.
7cc0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f      pNewItem->jo
7cd0: 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64 49 74 65  intype = pOldIte
7ce0: 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  m->jointype;.   
7cf0: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72 73   pNewItem->iCurs
7d00: 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  or = pOldItem->i
7d10: 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77  Cursor;.    pNew
7d20: 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
7d30: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 61 64  b = pOldItem->ad
7d40: 64 72 46 69 6c 6c 53 75 62 3b 0a 20 20 20 20 70  drFillSub;.    p
7d50: 4e 65 77 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  NewItem->regRetu
7d60: 72 6e 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 72  rn = pOldItem->r
7d70: 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 70 4e  egReturn;.    pN
7d80: 65 77 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c  ewItem->isCorrel
7d90: 61 74 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  ated = pOldItem-
7da0: 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 3b 0a 20  >isCorrelated;. 
7db0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 76 69 61     pNewItem->via
7dc0: 43 6f 72 6f 75 74 69 6e 65 20 3d 20 70 4f 6c 64  Coroutine = pOld
7dd0: 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69  Item->viaCorouti
7de0: 6e 65 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ne;.    pNewItem
7df0: 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69 74  ->zIndex = sqlit
7e00: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
7e10: 4f 6c 64 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 29  OldItem->zIndex)
7e20: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
7e30: 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 70 4f 6c  notIndexed = pOl
7e40: 64 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65  dItem->notIndexe
7e50: 64 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  d;.    pNewItem-
7e60: 3e 70 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74  >pIndex = pOldIt
7e70: 65 6d 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  em->pIndex;.    
7e80: 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d  pTab = pNewItem-
7e90: 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d  >pTab = pOldItem
7ea0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20  ->pTab;.    if( 
7eb0: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54  pTab ){.      pT
7ec0: 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  ab->nRef++;.    
7ed0: 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  }.    pNewItem->
7ee0: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
7ef0: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
7f00: 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  OldItem->pSelect
7f10: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
7f20: 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71  ewItem->pOn = sq
7f30: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
7f40: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20   pOldItem->pOn, 
7f50: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
7f60: 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73  Item->pUsing = s
7f70: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
7f80: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55  db, pOldItem->pU
7f90: 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49  sing);.    pNewI
7fa0: 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70  tem->colUsed = p
7fb0: 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  OldItem->colUsed
7fc0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
7fd0: 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73  New;.}.IdList *s
7fe0: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
7ff0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c  sqlite3 *db, IdL
8000: 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73  ist *p){.  IdLis
8010: 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t *pNew;.  int i
8020: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
8030: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
8040: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
8050: 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
8060: 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
8070: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
8080: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20   0;.  pNew->nId 
8090: 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77  = p->nId;.  pNew
80a0: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ->a = sqlite3DbM
80b0: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70 2d 3e  allocRaw(db, p->
80c0: 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  nId*sizeof(p->a[
80d0: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  0]) );.  if( pNe
80e0: 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73  w->a==0 ){.    s
80f0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8100: 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75   pNew);.    retu
8110: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e  rn 0;.  }.  /* N
8120: 6f 74 65 20 74 68 61 74 20 62 65 63 61 75 73 65  ote that because
8130: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
8140: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20   allocation for 
8150: 70 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20  p->a[] is not.  
8160: 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20 61  ** necessarily a
8170: 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 2c 20 73   power of two, s
8180: 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65  qlite3IdListAppe
8190: 6e 64 28 29 20 6d 61 79 20 6e 6f 74 20 62 65 20  nd() may not be 
81a0: 63 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74  called.  ** on t
81b0: 68 65 20 64 75 70 6c 69 63 61 74 65 20 63 72 65  he duplicate cre
81c0: 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ated by this fun
81d0: 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28  ction. */.  for(
81e0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69  i=0; i<p->nId; i
81f0: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
8200: 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65  IdList_item *pNe
8210: 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61  wItem = &pNew->a
8220: 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  [i];.    struct 
8230: 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c  IdList_item *pOl
8240: 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d  dItem = &p->a[i]
8250: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
8260: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
8270: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
8280: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
8290: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20    pNewItem->idx 
82a0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b  = pOldItem->idx;
82b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
82c0: 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71  ew;.}.Select *sq
82d0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73  lite3SelectDup(s
82e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
82f0: 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  ct *p, int flags
8300: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  ){.  Select *pNe
8310: 77 2c 20 2a 70 50 72 69 6f 72 3b 0a 20 20 69 66  w, *pPrior;.  if
8320: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
8330: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
8340: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
8350: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  b, sizeof(*p) );
8360: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
8370: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
8380: 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  w->pEList = sqli
8390: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
83a0: 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c  b, p->pEList, fl
83b0: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53  ags);.  pNew->pS
83c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
83d0: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53  istDup(db, p->pS
83e0: 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  rc, flags);.  pN
83f0: 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  ew->pWhere = sql
8400: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
8410: 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73  p->pWhere, flags
8420: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  );.  pNew->pGrou
8430: 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
8440: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
8450: 70 47 72 6f 75 70 42 79 2c 20 66 6c 61 67 73 29  pGroupBy, flags)
8460: 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e  ;.  pNew->pHavin
8470: 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  g = sqlite3ExprD
8480: 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  up(db, p->pHavin
8490: 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  g, flags);.  pNe
84a0: 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  w->pOrderBy = sq
84b0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
84c0: 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
84d0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
84e0: 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20  ->op = p->op;.  
84f0: 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70  pNew->pPrior = p
8500: 50 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53  Prior = sqlite3S
8510: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e  electDup(db, p->
8520: 70 50 72 69 6f 72 2c 20 66 6c 61 67 73 29 3b 0a  pPrior, flags);.
8530: 20 20 69 66 28 20 70 50 72 69 6f 72 20 29 20 70    if( pPrior ) p
8540: 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Prior->pNext = p
8550: 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65  New;.  pNew->pNe
8560: 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  xt = 0;.  pNew->
8570: 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  pLimit = sqlite3
8580: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
8590: 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20  Limit, flags);. 
85a0: 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d   pNew->pOffset =
85b0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
85c0: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20  db, p->pOffset, 
85d0: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
85e0: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e  iLimit = 0;.  pN
85f0: 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b  ew->iOffset = 0;
8600: 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67  .  pNew->selFlag
8610: 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  s = p->selFlags 
8620: 26 20 7e 53 46 5f 55 73 65 73 45 70 68 65 6d 65  & ~SF_UsesEpheme
8630: 72 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69  ral;.  pNew->pRi
8640: 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 70  ghtmost = 0;.  p
8650: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
8660: 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  m[0] = -1;.  pNe
8670: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
8680: 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  1] = -1;.  pNew-
8690: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d  >addrOpenEphm[2]
86a0: 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20   = -1;.  return 
86b0: 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65  pNew;.}.#else.Se
86c0: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
86d0: 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  ectDup(sqlite3 *
86e0: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  db, Select *p, i
86f0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73  nt flags){.  ass
8700: 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72  ert( p==0 );.  r
8710: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
8720: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  f.../*.** Add a 
8730: 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
8740: 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70  he end of an exp
8750: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49  ression list.  I
8760: 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e  f pList is.** in
8770: 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68  itially NULL, th
8780: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
8790: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
87a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
87b0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
87c0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
87d0: 65 6e 74 69 72 65 20 6c 69 73 74 20 69 73 20 66  entire list is f
87e0: 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c  reed and.** NULL
87f0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49   is returned.  I
8800: 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65  f non-NULL is re
8810: 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 69 74 20  turned, then it 
8820: 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a  is guaranteed.**
8830: 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 65 6e   that the new en
8840: 74 72 79 20 77 61 73 20 73 75 63 63 65 73 73 66  try was successf
8850: 75 6c 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a  ully appended..*
8860: 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  /.ExprList *sqli
8870: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
8880: 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  d(.  Parse *pPar
8890: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
88a0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
88b0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
88c0: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
88d0: 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f  List to which to
88e0: 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62   append. Might b
88f0: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
8900: 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20   *pExpr         
8910: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
8920: 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  n to be appended
8930: 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  . Might be NULL 
8940: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
8950: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
8960: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
8970: 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
8980: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
8990: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45  ero(db, sizeof(E
89a0: 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  xprList) );.    
89b0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
89c0: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
89d0: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  m;.    }.    pLi
89e0: 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44  st->a = sqlite3D
89f0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
8a00: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
8a10: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ]));.    if( pLi
8a20: 73 74 2d 3e 61 3d 3d 30 20 29 20 67 6f 74 6f 20  st->a==0 ) goto 
8a30: 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 20  no_mem;.  }else 
8a40: 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70  if( (pList->nExp
8a50: 72 20 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70  r & (pList->nExp
8a60: 72 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  r-1))==0 ){.    
8a70: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
8a80: 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61 73 73  item *a;.    ass
8a90: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
8aa0: 72 3e 30 20 29 3b 0a 20 20 20 20 61 20 3d 20 73  r>0 );.    a = s
8ab0: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
8ac0: 64 62 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 70 4c  db, pList->a, pL
8ad0: 69 73 74 2d 3e 6e 45 78 70 72 2a 32 2a 73 69 7a  ist->nExpr*2*siz
8ae0: 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
8af0: 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20  );.    if( a==0 
8b00: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f  ){.      goto no
8b10: 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _mem;.    }.    
8b20: 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20  pList->a = a;.  
8b30: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  }.  assert( pLis
8b40: 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28  t->a!=0 );.  if(
8b50: 20 31 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74   1 ){.    struct
8b60: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
8b70: 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
8b80: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b  a[pList->nExpr++
8b90: 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49  ];.    memset(pI
8ba0: 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  tem, 0, sizeof(*
8bb0: 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74  pItem));.    pIt
8bc0: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
8bd0: 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  r;.  }.  return 
8be0: 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20  pList;..no_mem: 
8bf0: 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20      .  /* Avoid 
8c00: 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69  leaking memory i
8c10: 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69  f malloc has fai
8c20: 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  led. */.  sqlite
8c30: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
8c40: 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  pExpr);.  sqlite
8c50: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
8c60: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65  db, pList);.  re
8c70: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
8c80: 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73   Set the ExprLis
8c90: 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d  t.a[].zName elem
8ca0: 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ent of the most 
8cb0: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69  recently added i
8cc0: 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78  tem.** on the ex
8cd0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
8ce0: 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74  *.** pList might
8cf0: 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69   be NULL followi
8d00: 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  ng an OOM error.
8d10: 20 20 42 75 74 20 70 4e 61 6d 65 20 73 68 6f 75    But pName shou
8d20: 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e  ld never be.** N
8d30: 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ULL.  If a memor
8d40: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
8d50: 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e  ls, the pParse->
8d60: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8d70: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e   flag.** is set.
8d80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8d90: 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28  ExprListSetName(
8da0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
8db0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
8dc0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
8dd0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
8de0: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
8df0: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
8e00: 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a  dd the span. */.
8e10: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20    Token *pName, 
8e20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
8e30: 65 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f  e to be added */
8e40: 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20  .  int dequote  
8e50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
8e60: 75 65 20 74 6f 20 63 61 75 73 65 20 74 68 65 20  ue to cause the 
8e70: 6e 61 6d 65 20 74 6f 20 62 65 20 64 65 71 75 6f  name to be dequo
8e80: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  ted */.){.  asse
8e90: 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20  rt( pList!=0 || 
8ea0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
8eb0: 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20  ocFailed!=0 );. 
8ec0: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
8ed0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
8ee0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
8ef0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
8f00: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
8f10: 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
8f20: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  >a[pList->nExpr-
8f30: 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
8f40: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20  pItem->zName==0 
8f50: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  );.    pItem->zN
8f60: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
8f70: 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64  trNDup(pParse->d
8f80: 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  b, pName->z, pNa
8f90: 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20  me->n);.    if( 
8fa0: 64 65 71 75 6f 74 65 20 26 26 20 70 49 74 65 6d  dequote && pItem
8fb0: 2d 3e 7a 4e 61 6d 65 20 29 20 73 71 6c 69 74 65  ->zName ) sqlite
8fc0: 33 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e  3Dequote(pItem->
8fd0: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  zName);.  }.}../
8fe0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
8ff0: 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20  rList.a[].zSpan 
9000: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d  element of the m
9010: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
9020: 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68  ed item.** on th
9030: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
9040: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d  t..**.** pList m
9050: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c  ight be NULL fol
9060: 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72  lowing an OOM er
9070: 72 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20  ror.  But pSpan 
9080: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a  should never be.
9090: 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d  ** NULL.  If a m
90a0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
90b0: 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72   fails, the pPar
90c0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
90d0: 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20  iled flag.** is 
90e0: 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
90f0: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53  ite3ExprListSetS
9100: 70 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  pan(.  Parse *pP
9110: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
9120: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
9130: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
9140: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
9150: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
9160: 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e  to add the span.
9170: 20 2a 2f 0a 20 20 45 78 70 72 53 70 61 6e 20 2a   */.  ExprSpan *
9180: 70 53 70 61 6e 20 20 20 20 20 20 20 20 20 2f 2a  pSpan         /*
9190: 20 54 68 65 20 73 70 61 6e 20 74 6f 20 62 65 20   The span to be 
91a0: 61 64 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71  added */.){.  sq
91b0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
91c0: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
91d0: 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62  ( pList!=0 || db
91e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d  ->mallocFailed!=
91f0: 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  0 );.  if( pList
9200: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
9210: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
9220: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
9230: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b  pList->nExpr-1];
9240: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
9250: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
9260: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
9270: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
9280: 49 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70  Item->pExpr==pSp
9290: 61 6e 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20  an->pExpr );.   
92a0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
92b0: 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29  b, pItem->zSpan)
92c0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70  ;.    pItem->zSp
92d0: 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  an = sqlite3DbSt
92e0: 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
92f0: 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a  )pSpan->zStart,.
9300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9320: 20 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d      (int)(pSpan-
9330: 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a  >zEnd - pSpan->z
9340: 53 74 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  Start));.  }.}..
9350: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
9360: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c  ression list pEL
9370: 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72  ist contains mor
9380: 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c  e than iLimit el
9390: 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65  ements,.** leave
93a0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
93b0: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
93c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
93d0: 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28  ListCheckLength(
93e0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
93f0: 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ,.  ExprList *pE
9400: 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68  List,.  const ch
9410: 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20  ar *zObject.){. 
9420: 20 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65   int mx = pParse
9430: 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
9440: 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
9450: 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  ];.  testcase( p
9460: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
9470: 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20  >nExpr==mx );.  
9480: 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74  testcase( pEList
9490: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
94a0: 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28  r==mx+1 );.  if(
94b0: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
94c0: 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20  t->nExpr>mx ){. 
94d0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
94e0: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
94f0: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
9500: 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20  %s", zObject);. 
9510: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
9520: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70  te an entire exp
9530: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
9540: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
9550: 72 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  rListDelete(sqli
9560: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
9570: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
9580: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70   i;.  struct Exp
9590: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
95a0: 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  m;.  if( pList==
95b0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
95c0: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d  sert( pList->a!=
95d0: 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70  0 || pList->nExp
95e0: 72 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 49  r==0 );.  for(pI
95f0: 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
9600: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
9610: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
9620: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
9630: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  rDelete(db, pIte
9640: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73  m->pExpr);.    s
9650: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
9660: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
9670: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9680: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70  e(db, pItem->zSp
9690: 61 6e 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  an);.  }.  sqlit
96a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69  e3DbFree(db, pLi
96b0: 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
96c0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
96d0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  t);.}../*.** The
96e0: 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
96f0: 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73  Walker callbacks
9700: 2e 20 20 57 61 6c 6b 65 72 2e 75 2e 70 69 20 69  .  Walker.u.pi i
9710: 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  s a pointer.** t
9720: 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 54  o an integer.  T
9730: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
9740: 65 20 63 68 65 63 6b 69 6e 67 20 61 6e 20 65 78  e checking an ex
9750: 70 72 65 73 73 69 6f 6e 20 74 6f 20 73 65 65 0a  pression to see.
9760: 2a 2a 20 69 66 20 69 74 20 69 73 20 61 20 63 6f  ** if it is a co
9770: 6e 73 74 61 6e 74 2e 20 20 53 65 74 20 2a 57 61  nstant.  Set *Wa
9780: 6c 6b 65 72 2e 75 2e 70 69 20 74 6f 20 30 20 69  lker.u.pi to 0 i
9790: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
97a0: 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 73 74   is.** not const
97b0: 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  ant..**.** These
97c0: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
97d0: 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 69  es are used to i
97e0: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c  mplement the fol
97f0: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
9800: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
9810: 6f 6e 73 74 61 6e 74 28 29 0a 2a 2a 20 20 20 20  onstant().**    
9820: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
9830: 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 0a  nstantNotJoin().
9840: 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  **     sqlite3Ex
9850: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
9860: 6e 63 74 69 6f 6e 28 29 0a 2a 2a 0a 2a 2f 0a 73  nction().**.*/.s
9870: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f  tatic int exprNo
9880: 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c  deIsConstant(Wal
9890: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
98a0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f  pr *pExpr){..  /
98b0: 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  * If pWalker->u.
98c0: 69 20 69 73 20 33 20 74 68 65 6e 20 61 6e 79 20  i is 3 then any 
98d0: 74 65 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72  term of the expr
98e0: 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65  ession that come
98f0: 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  s from.  ** the 
9900: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
9910: 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e 20 64 69  ses of a join di
9920: 73 71 75 61 6c 69 66 69 65 73 20 74 68 65 20 65  squalifies the e
9930: 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66  xpression.  ** f
9940: 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69 64  rom being consid
9950: 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a  ered constant. *
9960: 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d  /.  if( pWalker-
9970: 3e 75 2e 69 3d 3d 33 20 26 26 20 45 78 70 72 48  >u.i==3 && ExprH
9980: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
9990: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
99a0: 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75  {.    pWalker->u
99b0: 2e 69 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  .i = 0;.    retu
99c0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
99d0: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  }..  switch( pEx
99e0: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a  pr->op ){.    /*
99f0: 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69   Consider functi
9a00: 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61  ons to be consta
9a10: 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20  nt if all their 
9a20: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f  arguments are co
9a30: 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e  nstant.    ** an
9a40: 64 20 65 69 74 68 65 72 20 70 57 61 6c 6b 65 72  d either pWalker
9a50: 2d 3e 75 2e 69 3d 3d 32 20 6f 72 20 74 68 65 20  ->u.i==2 or the 
9a60: 66 75 6e 63 74 69 6f 6e 20 61 73 20 74 68 65 20  function as the 
9a70: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53  SQLITE_FUNC_CONS
9a80: 54 0a 20 20 20 20 2a 2a 20 66 6c 61 67 2e 20 2a  T.    ** flag. *
9a90: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  /.    case TK_FU
9aa0: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66  NCTION:.      if
9ab0: 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d  ( pWalker->u.i==
9ac0: 32 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70  2 || ExprHasProp
9ad0: 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f  erty(pExpr,EP_Co
9ae0: 6e 73 74 61 6e 74 29 20 29 7b 0a 20 20 20 20 20  nstant) ){.     
9af0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
9b00: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
9b10: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
9b20: 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73  rough */.    cas
9b30: 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73  e TK_ID:.    cas
9b40: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  e TK_COLUMN:.   
9b50: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
9b60: 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20  CTION:.    case 
9b70: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
9b80: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
9b90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
9ba0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
9bb0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
9bc0: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
9bd0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
9be0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
9bf0: 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74  CTION );.      t
9c00: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
9c10: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
9c20: 4e 20 29 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b  N );.      pWalk
9c30: 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 20  er->u.i = 0;.   
9c40: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
9c50: 6f 72 74 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  ort;.    default
9c60: 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
9c70: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
9c80: 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 65 6c  SELECT ); /* sel
9c90: 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  ectNodeIsConstan
9ca0: 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20  t will disallow 
9cb0: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
9cc0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
9cd0: 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 65  _EXISTS ); /* se
9ce0: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
9cf0: 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77  nt will disallow
9d00: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
9d10: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
9d20: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20   }.}.static int 
9d30: 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73  selectNodeIsCons
9d40: 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  tant(Walker *pWa
9d50: 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f  lker, Select *No
9d60: 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44  tUsed){.  UNUSED
9d70: 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
9d80: 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e  ed);.  pWalker->
9d90: 75 2e 69 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  u.i = 0;.  retur
9da0: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73  n WRC_Abort;.}.s
9db0: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 73  tatic int exprIs
9dc0: 43 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69  Const(Expr *p, i
9dd0: 6e 74 20 69 6e 69 74 46 6c 61 67 29 7b 0a 20 20  nt initFlag){.  
9de0: 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73  Walker w;.  mems
9df0: 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&w, 0, sizeof
9e00: 28 77 29 29 3b 0a 20 20 77 2e 75 2e 69 20 3d 20  (w));.  w.u.i = 
9e10: 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45  initFlag;.  w.xE
9e20: 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
9e30: 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
9e40: 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
9e50: 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f  lback = selectNo
9e60: 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20  deIsConstant;.  
9e70: 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
9e80: 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e  &w, p);.  return
9e90: 20 77 2e 75 2e 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   w.u.i;.}../*.**
9ea0: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
9eb0: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
9ec0: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
9ed0: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
9ee0: 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74  t.** and 0 if it
9ef0: 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62   involves variab
9f00: 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20  les or function 
9f10: 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  calls..**.** For
9f20: 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
9f30: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
9f40: 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20  a double-quoted 
9f50: 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63  string (ex: "abc
9f60: 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65  ").** is conside
9f70: 72 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62  red a variable b
9f80: 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74  ut a single-quot
9f90: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27  ed string (ex: '
9fa0: 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f  abc') is.** a co
9fb0: 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  nstant..*/.int s
9fc0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
9fd0: 74 61 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20  tant(Expr *p){. 
9fe0: 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f   return exprIsCo
9ff0: 6e 73 74 28 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a  nst(p, 1);.}../*
a000: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
a010: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
a020: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
a030: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
a040: 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65  tant.** that doe
a050: 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20 66  s no originate f
a060: 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53  rom the ON or US
a070: 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61  ING clauses of a
a080: 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e   join..** Return
a090: 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65   0 if it involve
a0a0: 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66  s variables or f
a0b0: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72  unction calls or
a0c0: 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61   terms from.** a
a0d0: 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  n ON or USING cl
a0e0: 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ause..*/.int sql
a0f0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
a100: 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a  ntNotJoin(Expr *
a110: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70  p){.  return exp
a120: 72 49 73 43 6f 6e 73 74 28 70 2c 20 33 29 3b 0a  rIsConst(p, 3);.
a130: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
a140: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
a150: 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
a160: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
a170: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20   constant.** or 
a180: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  a function call 
a190: 77 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72  with constant ar
a1a0: 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e  guments.  Return
a1b0: 20 61 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a   and 0 if there.
a1c0: 2a 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69 61  ** are any varia
a1d0: 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  bles..**.** For 
a1e0: 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
a1f0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
a200: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
a210: 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22  tring (ex: "abc"
a220: 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  ).** is consider
a230: 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75  ed a variable bu
a240: 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65  t a single-quote
a250: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61  d string (ex: 'a
a260: 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e  bc') is.** a con
a270: 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stant..*/.int sq
a280: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
a290: 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78  antOrFunction(Ex
a2a0: 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  pr *p){.  return
a2b0: 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20   exprIsConst(p, 
a2c0: 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  2);.}../*.** If 
a2d0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
a2e0: 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e   codes a constan
a2f0: 74 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 69  t integer that i
a300: 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a  s small enough.*
a310: 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32  * to fit in a 32
a320: 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65  -bit integer, re
a330: 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74  turn 1 and put t
a340: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
a350: 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70  integer.** in *p
a360: 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65  Value.  If the e
a370: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
a380: 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69   an integer or i
a390: 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a  f it is too big.
a3a0: 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73  ** to fit in a s
a3b0: 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74  igned 32-bit int
a3c0: 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61  eger, return 0 a
a3d0: 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65  nd leave *pValue
a3e0: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69   unchanged..*/.i
a3f0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
a400: 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c  Integer(Expr *p,
a410: 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20   int *pValue){. 
a420: 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20   int rc = 0;..  
a430: 2f 2a 20 49 66 20 61 6e 20 65 78 70 72 65 73 73  /* If an express
a440: 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65  ion is an intege
a450: 72 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 66  r literal that f
a460: 69 74 73 20 69 6e 20 61 20 73 69 67 6e 65 64 20  its in a signed 
a470: 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65  32-bit.  ** inte
a480: 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20 45 50  ger, then the EP
a490: 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 77  _IntValue flag w
a4a0: 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79  ill have already
a4b0: 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61   been set */.  a
a4c0: 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b  ssert( p->op!=TK
a4d0: 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e  _INTEGER || (p->
a4e0: 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  flags & EP_IntVa
a4f0: 6c 75 65 29 21 3d 30 0a 20 20 20 20 20 20 20 20  lue)!=0.        
a500: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74     || sqlite3Get
a510: 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65  Int32(p->u.zToke
a520: 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20  n, &rc)==0 );.. 
a530: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
a540: 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20  EP_IntValue ){. 
a550: 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e     *pValue = p->
a560: 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 72 65  u.iValue;.    re
a570: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77  turn 1;.  }.  sw
a580: 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
a590: 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53     case TK_UPLUS
a5a0: 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  : {.      rc = s
a5b0: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
a5c0: 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56  ger(p->pLeft, pV
a5d0: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65  alue);.      bre
a5e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
a5f0: 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
a600: 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20        int v;.   
a610: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
a620: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70  prIsInteger(p->p
a630: 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20  Left, &v) ){.   
a640: 20 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d       assert( v!=
a650: 28 2d 32 31 34 37 34 38 33 36 34 37 2d 31 29 20  (-2147483647-1) 
a660: 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c  );.        *pVal
a670: 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20  ue = -v;.       
a680: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d   rc = 1;.      }
a690: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a6a0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
a6b0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
a6c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
a6d0: 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69  * Return FALSE i
a6e0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  f there is no ch
a6f0: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 65 78  ance that the ex
a700: 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20  pression can be 
a710: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  NULL..**.** If t
a720: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69  he expression mi
a730: 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69  ght be NULL or i
a740: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
a750: 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a   is too complex.
a760: 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74 75 72  ** to tell retur
a770: 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20  n TRUE.  .**.** 
a780: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
a790: 75 73 65 64 20 61 73 20 61 6e 20 6f 70 74 69 6d  used as an optim
a7a0: 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70  ization, to skip
a7b0: 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64   OP_IsNull opcod
a7c0: 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e  es.** when we kn
a7d0: 6f 77 20 74 68 61 74 20 61 20 76 61 6c 75 65 20  ow that a value 
a7e0: 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20  cannot be NULL. 
a7f0: 20 48 65 6e 63 65 2c 20 61 20 66 61 6c 73 65 20   Hence, a false 
a800: 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72 65 74  positive.** (ret
a810: 75 72 6e 69 6e 67 20 54 52 55 45 20 77 68 65 6e  urning TRUE when
a820: 20 69 6e 20 66 61 63 74 20 74 68 65 20 65 78 70   in fact the exp
a830: 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65  ression can neve
a840: 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74  r be NULL) might
a850: 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20 70  .** be a small p
a860: 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 20 62  erformance hit b
a870: 75 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20  ut is otherwise 
a880: 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68  harmless.  On th
a890: 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c  e other.** hand,
a8a0: 20 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76   a false negativ
a8b0: 65 20 28 72 65 74 75 72 6e 69 6e 67 20 46 41 4c  e (returning FAL
a8c0: 53 45 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  SE when the resu
a8d0: 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c  lt could be NULL
a8e0: 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ).** will likely
a8f0: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
a900: 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e 20  correct answer. 
a910: 20 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75 62   So when in doub
a920: 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55  t, return.** TRU
a930: 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
a940: 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63  3ExprCanBeNull(c
a950: 6f 6e 73 74 20 45 78 70 72 20 2a 70 29 7b 0a 20  onst Expr *p){. 
a960: 20 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28   u8 op;.  while(
a970: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   p->op==TK_UPLUS
a980: 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d   || p->op==TK_UM
a990: 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70  INUS ){ p = p->p
a9a0: 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70  Left; }.  op = p
a9b0: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
a9c0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
a9d0: 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69   = p->op2;.  swi
a9e0: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
a9f0: 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a  ase TK_INTEGER:.
aa00: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
aa10: 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NG:.    case TK_
aa20: 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20  FLOAT:.    case 
aa30: 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72  TK_BLOB:.      r
aa40: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 64 65 66  eturn 0;.    def
aa50: 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
aa60: 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 1;.  }.}../*.
aa70: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 4f  ** Generate an O
aa80: 50 5f 49 73 4e 75 6c 6c 20 69 6e 73 74 72 75 63  P_IsNull instruc
aa90: 74 69 6f 6e 20 74 68 61 74 20 74 65 73 74 73 20  tion that tests 
aaa0: 72 65 67 69 73 74 65 72 20 69 52 65 67 20 61 6e  register iReg an
aab0: 64 20 6a 75 6d 70 73 0a 2a 2a 20 74 6f 20 6c 6f  d jumps.** to lo
aac0: 63 61 74 69 6f 6e 20 69 44 65 73 74 20 69 66 20  cation iDest if 
aad0: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 69 52 65  the value in iRe
aae0: 67 20 69 73 20 4e 55 4c 4c 2e 20 20 54 68 65 20  g is NULL.  The 
aaf0: 76 61 6c 75 65 20 69 6e 20 69 52 65 67 20 0a 2a  value in iReg .*
ab00: 2a 20 77 61 73 20 63 6f 6d 70 75 74 65 64 20 62  * was computed b
ab10: 79 20 70 45 78 70 72 2e 20 20 49 66 20 77 65 20  y pExpr.  If we 
ab20: 63 61 6e 20 6c 6f 6f 6b 20 61 74 20 70 45 78 70  can look at pExp
ab30: 72 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  r at compile-tim
ab40: 65 20 61 6e 64 0a 2a 2a 20 64 65 74 65 72 6d 69  e and.** determi
ab50: 6e 65 20 74 68 61 74 20 69 74 20 63 61 6e 20 6e  ne that it can n
ab60: 65 76 65 72 20 67 65 6e 65 72 61 74 65 20 61 20  ever generate a 
ab70: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 4f  NULL, then the O
ab80: 50 5f 49 73 4e 75 6c 6c 20 6f 70 65 72 61 74 69  P_IsNull operati
ab90: 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69  on.** can be omi
aba0: 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tted..*/.void sq
abb0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e  lite3ExprCodeIsN
abc0: 75 6c 6c 4a 75 6d 70 28 0a 20 20 56 64 62 65 20  ullJump(.  Vdbe 
abd0: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *v,            /
abe0: 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64 65 72  * The VDBE under
abf0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
ac00: 0a 20 20 63 6f 6e 73 74 20 45 78 70 72 20 2a 70  .  const Expr *p
ac10: 45 78 70 72 2c 20 20 2f 2a 20 4f 6e 6c 79 20 67  Expr,  /* Only g
ac20: 65 6e 65 72 61 74 65 20 4f 50 5f 49 73 4e 75 6c  enerate OP_IsNul
ac30: 6c 20 69 66 20 74 68 69 73 20 65 78 70 72 20 63  l if this expr c
ac40: 61 6e 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  an be NULL */.  
ac50: 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20 20 20  int iReg,       
ac60: 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 65 20      /* Test the 
ac70: 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65  value in this re
ac80: 67 69 73 74 65 72 20 66 6f 72 20 4e 55 4c 4c 20  gister for NULL 
ac90: 2a 2f 0a 20 20 69 6e 74 20 69 44 65 73 74 20 20  */.  int iDest  
aca0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
acb0: 20 68 65 72 65 20 69 66 20 74 68 65 20 76 61 6c   here if the val
acc0: 75 65 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 29 7b  ue is null */.){
acd0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
ace0: 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45 78 70  prCanBeNull(pExp
acf0: 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  r) ){.    sqlite
ad00: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ad10: 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67 2c 20  P_IsNull, iReg, 
ad20: 69 44 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  iDest);.  }.}../
ad30: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
ad40: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   if the given ex
ad50: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
ad60: 6e 73 74 61 6e 74 20 77 68 69 63 68 20 77 6f 75  nstant which wou
ad70: 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67  ld be.** unchang
ad80: 65 64 20 62 79 20 4f 50 5f 41 66 66 69 6e 69 74  ed by OP_Affinit
ad90: 79 20 77 69 74 68 20 74 68 65 20 61 66 66 69 6e  y with the affin
ada0: 69 74 79 20 67 69 76 65 6e 20 69 6e 20 74 68 65  ity given in the
adb0: 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d   second.** argum
adc0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ent..**.** This 
add0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
ade0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
adf0: 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20  the OP_Affinity 
ae00: 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  operation.** can
ae10: 20 62 65 20 6f 6d 69 74 74 65 64 2e 20 20 57 68   be omitted.  Wh
ae20: 65 6e 20 69 6e 20 64 6f 75 62 74 20 72 65 74 75  en in doubt retu
ae30: 72 6e 20 46 41 4c 53 45 2e 20 20 41 20 66 61 6c  rn FALSE.  A fal
ae40: 73 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69  se negative.** i
ae50: 73 20 68 61 72 6d 6c 65 73 73 2e 20 20 41 20 66  s harmless.  A f
ae60: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2c 20 68  alse positive, h
ae70: 6f 77 65 76 65 72 2c 20 63 61 6e 20 72 65 73 75  owever, can resu
ae80: 6c 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a  lt in the wrong.
ae90: 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e  ** answer..*/.in
aea0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  t sqlite3ExprNee
aeb0: 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
aec0: 67 65 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70  ge(const Expr *p
aed0: 2c 20 63 68 61 72 20 61 66 66 29 7b 0a 20 20 75  , char aff){.  u
aee0: 38 20 6f 70 3b 0a 20 20 69 66 28 20 61 66 66 3d  8 op;.  if( aff=
aef0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
af00: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 77   ) return 1;.  w
af10: 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  hile( p->op==TK_
af20: 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  UPLUS || p->op==
af30: 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d  TK_UMINUS ){ p =
af40: 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f   p->pLeft; }.  o
af50: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28  p = p->op;.  if(
af60: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
af70: 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a   ) op = p->op2;.
af80: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
af90: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
afa0: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  GER: {.      ret
afb0: 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  urn aff==SQLITE_
afc0: 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61  AFF_INTEGER || a
afd0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
afe0: 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20  UMERIC;.    }.  
aff0: 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
b000: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
b010: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
b020: 52 45 41 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  REAL || aff==SQL
b030: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
b040: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
b050: 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
b060: 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53     return aff==S
b070: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
b080: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
b090: 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  K_BLOB: {.      
b0a0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
b0b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
b0c0: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  MN: {.      asse
b0d0: 72 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30  rt( p->iTable>=0
b0e0: 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74   );  /* p cannot
b0f0: 20 62 65 20 70 61 72 74 20 6f 66 20 61 20 43 48   be part of a CH
b100: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  ECK constraint *
b110: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  /.      return p
b120: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20  ->iColumn<0.    
b130: 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53        && (aff==S
b140: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
b150: 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  R || aff==SQLITE
b160: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20  _AFF_NUMERIC);. 
b170: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
b180: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
b190: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
b1a0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
b1b0: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
b1c0: 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d  string is a row-
b1d0: 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a  id column name..
b1e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73  */.int sqlite3Is
b1f0: 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72  Rowid(const char
b200: 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   *z){.  if( sqli
b210: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f  te3StrICmp(z, "_
b220: 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65  ROWID_")==0 ) re
b230: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
b240: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
b250: 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65  "ROWID")==0 ) re
b260: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
b270: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
b280: 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  "OID")==0 ) retu
b290: 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
b2a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
b2b0: 6e 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65  n true if we are
b2c0: 20 61 62 6c 65 20 74 6f 20 74 68 65 20 49 4e 20   able to the IN 
b2d0: 6f 70 65 72 61 74 6f 72 20 6f 70 74 69 6d 69 7a  operator optimiz
b2e0: 61 74 69 6f 6e 20 6f 6e 20 61 0a 2a 2a 20 71 75  ation on a.** qu
b2f0: 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a  ery of the form.
b300: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 78 20 49 4e  **.**       x IN
b310: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a   (SELECT ...).**
b320: 0a 2a 2a 20 57 68 65 72 65 20 74 68 65 20 53 45  .** Where the SE
b330: 4c 45 43 54 2e 2e 2e 20 63 6c 61 75 73 65 20 69  LECT... clause i
b340: 73 20 61 73 20 73 70 65 63 69 66 69 65 64 20 62  s as specified b
b350: 79 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  y the parameter 
b360: 74 6f 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  to this.** routi
b370: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 65  ne..**.** The Se
b380: 6c 65 63 74 20 6f 62 6a 65 63 74 20 70 61 73 73  lect object pass
b390: 65 64 20 69 6e 20 68 61 73 20 61 6c 72 65 61 64  ed in has alread
b3a0: 79 20 62 65 65 6e 20 70 72 65 70 72 6f 63 65 73  y been preproces
b3b0: 73 65 64 20 61 6e 64 20 6e 6f 0a 2a 2a 20 65 72  sed and no.** er
b3c0: 72 6f 72 73 20 68 61 76 65 20 62 65 65 6e 20 66  rors have been f
b3d0: 6f 75 6e 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ound..*/.#ifndef
b3e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
b3f0: 51 55 45 52 59 0a 73 74 61 74 69 63 20 69 6e 74  QUERY.static int
b400: 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
b410: 6e 4f 70 74 28 53 65 6c 65 63 74 20 2a 70 29 7b  nOpt(Select *p){
b420: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
b430: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
b440: 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70  List;.  Table *p
b450: 54 61 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  Tab;.  if( p==0 
b460: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
b470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b480: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
b490: 20 6f 66 20 49 4e 20 69 73 20 53 45 4c 45 43 54   of IN is SELECT
b4a0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
b4b0: 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ior ) return 0; 
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b4d0: 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53  Not a compound S
b4e0: 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70  ELECT */.  if( p
b4f0: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
b500: 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
b510: 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74  regate) ){.    t
b520: 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c  estcase( (p->sel
b530: 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
b540: 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
b550: 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
b560: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
b570: 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
b580: 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
b590: 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
b5a0: 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20  _Aggregate );.  
b5b0: 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e    return 0; /* N
b5c0: 6f 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  o DISTINCT keywo
b5d0: 72 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67  rd and no aggreg
b5e0: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
b5f0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
b600: 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b  ->pGroupBy==0 );
b610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b620: 20 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59   Has no GROUP BY
b630: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28   clause */.  if(
b640: 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74   p->pLimit ) ret
b650: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
b660: 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49      /* Has no LI
b670: 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  MIT clause */.  
b680: 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73  assert( p->pOffs
b690: 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20  et==0 );        
b6a0: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d         /* No LIM
b6b0: 49 54 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53  IT means no OFFS
b6c0: 45 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  ET */.  if( p->p
b6d0: 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30  Where ) return 0
b6e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
b6f0: 2a 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63  * Has no WHERE c
b700: 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20  lause */.  pSrc 
b710: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
b720: 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a  ert( pSrc!=0 );.
b730: 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
b740: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  !=1 ) return 0; 
b750: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67           /* Sing
b760: 6c 65 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20  le term in FROM 
b770: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
b780: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
b790: 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ct ) return 0;  
b7a0: 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f     /* FROM is no
b7b0: 74 20 61 20 73 75 62 71 75 65 72 79 20 6f 72 20  t a subquery or 
b7c0: 76 69 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d  view */.  pTab =
b7d0: 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62   pSrc->a[0].pTab
b7e0: 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 54  ;.  if( NEVER(pT
b7f0: 61 62 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  ab==0) ) return 
b800: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  0;.  assert( pTa
b810: 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  b->pSelect==0 );
b820: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
b830: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f  ROM clause is no
b840: 74 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66  t a view */.  if
b850: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
b860: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  ) ) return 0;   
b870: 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
b880: 75 73 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61  use not a virtua
b890: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c  l table */.  pEL
b8a0: 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
b8b0: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e  .  if( pEList->n
b8c0: 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
b8d0: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65   0;       /* One
b8e0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72   column in the r
b8f0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69  esult set */.  i
b900: 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  f( pEList->a[0].
b910: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
b920: 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  LUMN ) return 0;
b930: 20 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61 20   /* Result is a 
b940: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 72 65 74 75  column */.  retu
b950: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
b960: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
b970: 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  BQUERY */../*.**
b980: 20 43 6f 64 65 20 61 6e 20 4f 50 5f 4f 6e 63 65   Code an OP_Once
b990: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64   instruction and
b9a0: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
b9b0: 66 6f 72 20 69 74 73 20 66 6c 61 67 2e 20 52 65  for its flag. Re
b9c0: 74 75 72 6e 20 74 68 65 20 0a 2a 2a 20 61 64 64  turn the .** add
b9d0: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20  ress of the new 
b9e0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
b9f0: 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65 4f  int sqlite3CodeO
ba00: 6e 63 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nce(Parse *pPars
ba10: 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  e){.  Vdbe *v = 
ba20: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
ba30: 50 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20  Parse);      /* 
ba40: 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  Virtual machine 
ba50: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
ba60: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
ba70: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
ba80: 4f 6e 63 65 2c 20 70 50 61 72 73 65 2d 3e 6e 4f  Once, pParse->nO
ba90: 6e 63 65 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nce++);.}../*.**
baa0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
bab0: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6d  s used by the im
bac0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
bad0: 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65  the IN (...) ope
bae0: 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65 20 70 58  rator..** The pX
baf0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
bb00: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20  e expression on 
bb10: 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
bb20: 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 68 69 63  N operator, whic
bb30: 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 65 69  h.** might be ei
bb40: 74 68 65 72 20 61 20 6c 69 73 74 20 6f 66 20 65  ther a list of e
bb50: 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20  xpressions or a 
bb60: 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  subquery..**.** 
bb70: 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
bb80: 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 66 69  routine is to fi
bb90: 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61 20 62  nd or create a b
bba0: 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61  -tree object tha
bbb0: 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64  t can.** be used
bbc0: 20 65 69 74 68 65 72 20 74 6f 20 74 65 73 74 20   either to test 
bbd0: 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 69  for membership i
bbe0: 6e 20 74 68 65 20 52 48 53 20 73 65 74 20 6f 72  n the RHS set or
bbf0: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
bc00: 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65  ugh.** all membe
bc10: 72 73 20 6f 66 20 74 68 65 20 52 48 53 20 73 65  rs of the RHS se
bc20: 74 2c 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c  t, skipping dupl
bc30: 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20  icates..**.** A 
bc40: 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64  cursor is opened
bc50: 20 6f 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6f   on the b-tree o
bc60: 62 6a 65 63 74 20 74 68 61 74 20 74 68 65 20 52  bject that the R
bc70: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
bc80: 72 61 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d  rator.** and pX-
bc90: 3e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74  >iTable is set t
bca0: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
bcb0: 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  hat cursor..**.*
bcc0: 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
bcd0: 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
bce0: 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20  ction indicates 
bcf0: 74 68 65 20 62 2d 74 72 65 65 20 74 79 70 65 2c  the b-tree type,
bd00: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
bd10: 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  **   IN_INDEX_RO
bd20: 57 49 44 20 20 20 20 20 20 2d 20 54 68 65 20 63  WID      - The c
bd30: 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
bd40: 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74   on a database t
bd50: 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  able..**   IN_IN
bd60: 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d  DEX_INDEX_ASC  -
bd70: 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
bd80: 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63  opened on an asc
bd90: 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a  ending index..**
bda0: 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45     IN_INDEX_INDE
bdb0: 58 5f 44 45 53 43 20 2d 20 54 68 65 20 63 75 72  X_DESC - The cur
bdc0: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
bdd0: 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69  n a descending i
bde0: 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  ndex..**   IN_IN
bdf0: 44 45 58 5f 45 50 48 20 20 20 20 20 20 20 20 2d  DEX_EPH        -
be00: 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
be10: 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63  opened on a spec
be20: 69 61 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e  ially created an
be30: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
be40: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 70               pop
be50: 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c  ulated epheremal
be60: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e   table..**.** An
be70: 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65   existing b-tree
be80: 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20 69   might be used i
be90: 66 20 74 68 65 20 52 48 53 20 65 78 70 72 65 73  f the RHS expres
bea0: 73 69 6f 6e 20 70 58 20 69 73 20 61 20 73 69 6d  sion pX is a sim
beb0: 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  ple.** subquery 
bec0: 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20  such as:.**.**  
bed0: 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d     SELECT <colum
bee0: 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a  n> FROM <table>.
bef0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53  **.** If the RHS
bf00: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
bf10: 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72  tor is a list or
bf20: 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20   a more complex 
bf30: 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a  subquery, then.*
bf40: 2a 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  * an ephemeral t
bf50: 61 62 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20  able might need 
bf60: 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  to be generated 
bf70: 66 72 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64  from the RHS and
bf80: 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61   then.** pX->iTa
bf90: 62 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e  ble made to poin
bfa0: 74 20 74 6f 20 74 68 65 20 65 70 68 65 72 6d 65  t to the epherme
bfb0: 72 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 65 61  ral table instea
bfc0: 64 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74  d of an.** exist
bfd0: 69 6e 67 20 74 61 62 6c 65 2e 20 20 0a 2a 2a 0a  ing table.  .**.
bfe0: 2a 2a 20 49 66 20 74 68 65 20 70 72 4e 6f 74 46  ** If the prNotF
bff0: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  ound parameter i
c000: 73 20 30 2c 20 74 68 65 6e 20 74 68 65 20 62 2d  s 0, then the b-
c010: 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65  tree will be use
c020: 64 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20  d to iterate.** 
c030: 74 68 72 6f 75 67 68 20 74 68 65 20 73 65 74 20  through the set 
c040: 6d 65 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e  members, skippin
c050: 67 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65 73  g any duplicates
c060: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
c070: 6e 0a 2a 2a 20 65 70 68 65 72 65 6d 61 6c 20 74  n.** epheremal t
c080: 61 62 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65  able must be use
c090: 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c  d unless the sel
c0a0: 65 63 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69  ected <column> i
c0b0: 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
c0c0: 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65  to be unique - e
c0d0: 69 74 68 65 72 20 62 65 63 61 75 73 65 20 69 74  ither because it
c0e0: 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50   is an INTEGER P
c0f0: 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 69 74  RIMARY KEY or it
c100: 0a 2a 2a 20 68 61 73 20 61 20 55 4e 49 51 55 45  .** has a UNIQUE
c110: 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 55   constraint or U
c120: 4e 49 51 55 45 20 69 6e 64 65 78 2e 0a 2a 2a 0a  NIQUE index..**.
c130: 2a 2a 20 49 66 20 74 68 65 20 70 72 4e 6f 74 46  ** If the prNotF
c140: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  ound parameter i
c150: 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 74 68  s not 0, then th
c160: 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65  e b-tree will be
c170: 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61   used .** for fa
c180: 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69  st set membershi
c190: 70 20 74 65 73 74 73 2e 20 49 6e 20 74 68 69 73  p tests. In this
c1a0: 20 63 61 73 65 20 61 6e 20 65 70 68 65 72 65 6d   case an epherem
c1b0: 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a  al table must .*
c1c0: 2a 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73  * be used unless
c1d0: 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e 20   <column> is an 
c1e0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
c1f0: 4b 45 59 20 6f 72 20 61 6e 20 69 6e 64 65 78 20  KEY or an index 
c200: 63 61 6e 20 0a 2a 2a 20 62 65 20 66 6f 75 6e 64  can .** be found
c210: 20 77 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61   with <column> a
c220: 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 20  s its left-most 
c230: 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68  column..**.** Wh
c240: 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 69 73  en the b-tree is
c250: 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20   being used for 
c260: 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73  membership tests
c270: 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  , the calling fu
c280: 6e 63 74 69 6f 6e 0a 2a 2a 20 6e 65 65 64 73 20  nction.** needs 
c290: 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20  to know whether 
c2a0: 6f 72 20 6e 6f 74 20 74 68 65 20 73 74 72 75 63  or not the struc
c2b0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e  ture contains an
c2c0: 20 53 51 4c 20 4e 55 4c 4c 20 0a 2a 2a 20 76 61   SQL NULL .** va
c2d0: 6c 75 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  lue in order to 
c2e0: 63 6f 72 72 65 63 74 6c 79 20 65 76 61 6c 75 61  correctly evalua
c2f0: 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c  te expressions l
c300: 69 6b 65 20 22 58 20 49 4e 20 28 59 2c 20 5a 29  ike "X IN (Y, Z)
c310: 22 2e 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  "..** If there i
c320: 73 20 61 6e 79 20 63 68 61 6e 63 65 20 74 68 61  s any chance tha
c330: 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68  t the (...) migh
c340: 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c  t contain a NULL
c350: 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e   value at.** run
c360: 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67  time, then a reg
c370: 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74  ister is allocat
c380: 65 64 20 61 6e 64 20 74 68 65 20 72 65 67 69 73  ed and the regis
c390: 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74  ter number writt
c3a0: 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 4e 6f 74 46  en.** to *prNotF
c3b0: 6f 75 6e 64 2e 20 49 66 20 74 68 65 72 65 20 69  ound. If there i
c3c0: 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74  s no chance that
c3d0: 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61   the (...) conta
c3e0: 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61  ins a.** NULL va
c3f0: 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72 4e 6f 74  lue, then *prNot
c400: 46 6f 75 6e 64 20 69 73 20 6c 65 66 74 20 75 6e  Found is left un
c410: 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
c420: 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  f a register is 
c430: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74  allocated and it
c440: 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65  s location store
c450: 64 20 69 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64  d in *prNotFound
c460: 2c 20 74 68 65 6e 0a 2a 2a 20 69 74 73 20 69 6e  , then.** its in
c470: 69 74 69 61 6c 20 76 61 6c 75 65 20 69 73 20 4e  itial value is N
c480: 55 4c 4c 2e 20 20 49 66 20 74 68 65 20 28 2e 2e  ULL.  If the (..
c490: 2e 29 20 64 6f 65 73 20 6e 6f 74 20 72 65 6d 61  .) does not rema
c4a0: 69 6e 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66  in constant.** f
c4b0: 6f 72 20 74 68 65 20 64 75 72 61 74 69 6f 6e 20  or the duration 
c4c0: 6f 66 20 74 68 65 20 71 75 65 72 79 20 28 69 2e  of the query (i.
c4d0: 65 2e 20 74 68 65 20 53 45 4c 45 43 54 20 77 69  e. the SELECT wi
c4e0: 74 68 69 6e 20 74 68 65 20 28 2e 2e 2e 29 0a 2a  thin the (...).*
c4f0: 2a 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65  * is a correlate
c500: 64 20 73 75 62 71 75 65 72 79 29 20 74 68 65 6e  d subquery) then
c510: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
c520: 65 20 61 6c 6c 6f 63 61 74 65 64 20 72 65 67 69  e allocated regi
c530: 73 74 65 72 20 69 73 0a 2a 2a 20 72 65 73 65 74  ster is.** reset
c540: 20 74 6f 20 4e 55 4c 4c 20 65 61 63 68 20 74 69   to NULL each ti
c550: 6d 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  me the subquery 
c560: 69 73 20 72 65 72 75 6e 2e 20 54 68 69 73 20 61  is rerun. This a
c570: 6c 6c 6f 77 73 20 74 68 65 0a 2a 2a 20 63 61 6c  llows the.** cal
c580: 6c 65 72 20 74 6f 20 75 73 65 20 76 64 62 65 20  ler to use vdbe 
c590: 63 6f 64 65 20 65 71 75 69 76 61 6c 65 6e 74 20  code equivalent 
c5a0: 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
c5b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 72 65  :.**.**   if( re
c5c0: 67 69 73 74 65 72 3d 3d 4e 55 4c 4c 20 29 7b 0a  gister==NULL ){.
c5d0: 2a 2a 20 20 20 20 20 68 61 73 5f 6e 75 6c 6c 20  **     has_null 
c5e0: 3d 20 3c 74 65 73 74 20 69 66 20 64 61 74 61 20  = <test if data 
c5f0: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
c600: 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 20 20 20 20  ns null>.**     
c610: 72 65 67 69 73 74 65 72 20 3d 20 31 0a 2a 2a 20  register = 1.** 
c620: 20 20 7d 0a 2a 2a 0a 2a 2a 20 69 6e 20 6f 72 64    }.**.** in ord
c630: 65 72 20 74 6f 20 61 76 6f 69 64 20 72 75 6e 6e  er to avoid runn
c640: 69 6e 67 20 74 68 65 20 3c 74 65 73 74 20 69 66  ing the <test if
c650: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
c660: 63 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a  contains null>.*
c670: 2a 20 74 65 73 74 20 6d 6f 72 65 20 6f 66 74 65  * test more ofte
c680: 6e 20 74 68 61 6e 20 69 73 20 6e 65 63 65 73 73  n than is necess
c690: 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ary..*/.#ifndef 
c6a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
c6b0: 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33  UERY.int sqlite3
c6c0: 46 69 6e 64 49 6e 49 6e 64 65 78 28 50 61 72 73  FindInIndex(Pars
c6d0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
c6e0: 2a 70 58 2c 20 69 6e 74 20 2a 70 72 4e 6f 74 46  *pX, int *prNotF
c6f0: 6f 75 6e 64 29 7b 0a 20 20 53 65 6c 65 63 74 20  ound){.  Select 
c700: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
c710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c720: 2a 20 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20  * SELECT to the 
c730: 72 69 67 68 74 20 6f 66 20 49 4e 20 6f 70 65 72  right of IN oper
c740: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54  ator */.  int eT
c750: 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ype = 0;        
c760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c770: 2f 2a 20 54 79 70 65 20 6f 66 20 52 48 53 20 74  /* Type of RHS t
c780: 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a  able. IN_INDEX_*
c790: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
c7a0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
c7c0: 75 72 73 6f 72 20 6f 66 20 74 68 65 20 52 48 53  ursor of the RHS
c7d0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
c7e0: 6d 75 73 74 42 65 55 6e 69 71 75 65 20 3d 20 28  mustBeUnique = (
c7f0: 70 72 4e 6f 74 46 6f 75 6e 64 3d 3d 30 29 3b 20  prNotFound==0); 
c800: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 52 48 53    /* True if RHS
c810: 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75 65 20   must be unique 
c820: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
c830: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
c840: 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 56 69  arse);     /* Vi
c850: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65  rtual machine be
c860: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20  ing coded */..  
c870: 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d  assert( pX->op==
c880: 54 4b 5f 49 4e 20 29 3b 0a 0a 20 20 2f 2a 20 43  TK_IN );..  /* C
c890: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
c8a0: 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  n existing table
c8b0: 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 62 65   or index can be
c8c0: 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61   used to.  ** sa
c8d0: 74 69 73 66 79 20 74 68 65 20 71 75 65 72 79 2e  tisfy the query.
c8e0: 20 20 54 68 69 73 20 69 73 20 70 72 65 66 65 72    This is prefer
c8f0: 61 62 6c 65 20 74 6f 20 67 65 6e 65 72 61 74 69  able to generati
c900: 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65  ng a new .  ** e
c910: 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a  phemeral table..
c920: 20 20 2a 2f 0a 20 20 70 20 3d 20 28 45 78 70 72    */.  p = (Expr
c930: 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20  HasProperty(pX, 
c940: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 3f 20  EP_xIsSelect) ? 
c950: 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20  pX->x.pSelect : 
c960: 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  0);.  if( ALWAYS
c970: 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30  (pParse->nErr==0
c980: 29 20 26 26 20 69 73 43 61 6e 64 69 64 61 74 65  ) && isCandidate
c990: 46 6f 72 49 6e 4f 70 74 28 70 29 20 29 7b 0a 20  ForInOpt(p) ){. 
c9a0: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
c9b0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
c9c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
c9d0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
c9e0: 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   */.    Table *p
c9f0: 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
ca00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ca10: 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e  * Table <table>.
ca20: 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 45   */.    Expr *pE
ca30: 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
ca40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ca50: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 3c 63 6f  * Expression <co
ca60: 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69 31 36  lumn> */.    i16
ca70: 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
ca80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca90: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
caa0: 63 6f 6c 75 6d 6e 20 3c 63 6f 6c 75 6d 6e 3e 20  column <column> 
cab0: 2a 2f 0a 20 20 20 20 69 31 36 20 69 44 62 3b 20  */.    i16 iDb; 
cac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cae0: 20 44 61 74 61 62 61 73 65 20 69 64 78 20 66 6f   Database idx fo
caf0: 72 20 70 54 61 62 20 2a 2f 0a 0a 20 20 20 20 61  r pTab */..    a
cb00: 73 73 65 72 74 28 20 70 20 29 3b 20 20 20 20 20  ssert( p );     
cb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb20: 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66     /* Because of
cb30: 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
cb40: 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61  nOpt(p) */.    a
cb50: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
cb60: 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  !=0 );          
cb70: 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66     /* Because of
cb80: 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
cb90: 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61  nOpt(p) */.    a
cba0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
cbb0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20  ->a[0].pExpr!=0 
cbc0: 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66  ); /* Because of
cbd0: 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
cbe0: 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61  nOpt(p) */.    a
cbf0: 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d  ssert( p->pSrc!=
cc00: 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
cc10: 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66     /* Because of
cc20: 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
cc30: 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 70  nOpt(p) */.    p
cc40: 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Tab = p->pSrc->a
cc50: 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 20 20 70 45  [0].pTab;.    pE
cc60: 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
cc70: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
cc80: 20 69 43 6f 6c 20 3d 20 28 69 31 36 29 70 45 78   iCol = (i16)pEx
cc90: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
cca0: 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20  .    /* Code an 
ccb0: 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 20  OP_VerifyCookie 
ccc0: 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b  and OP_TableLock
ccd0: 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f   for <table>. */
cce0: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
ccf0: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
cd00: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
cd10: 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  a);.    sqlite3C
cd20: 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
cd30: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
cd40: 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
cd50: 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
cd60: 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
cd70: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
cd80: 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
cd90: 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  on is only calle
cda0: 64 20 66 72 6f 6d 20 74 77 6f 20 70 6c 61 63 65  d from two place
cdb0: 73 2e 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73  s. In both cases
cdc0: 20 74 68 65 20 76 64 62 65 0a 20 20 20 20 2a 2a   the vdbe.    **
cdd0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
cde0: 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20 53 6f 20  n allocated. So 
cdf0: 61 73 73 75 6d 65 20 73 71 6c 69 74 65 33 47 65  assume sqlite3Ge
ce00: 74 56 64 62 65 28 29 20 69 73 20 61 6c 77 61 79  tVdbe() is alway
ce10: 73 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73  s.    ** success
ce20: 66 75 6c 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f  ful here..    */
ce30: 0a 20 20 20 20 61 73 73 65 72 74 28 76 29 3b 0a  .    assert(v);.
ce40: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
ce50: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64 64  {.      int iAdd
ce60: 72 3b 0a 0a 20 20 20 20 20 20 69 41 64 64 72 20  r;..      iAddr 
ce70: 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63  = sqlite3CodeOnc
ce80: 65 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20  e(pParse);..    
ce90: 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
cea0: 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c  le(pParse, iTab,
ceb0: 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
cec0: 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20  penRead);.      
ced0: 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
cee0: 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20 20 20 73  _ROWID;..      s
cef0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
cf00: 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20  re(v, iAddr);.  
cf10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
cf20: 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf40: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
cf50: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  variable */..   
cf60: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74     /* The collat
cf70: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65  ion sequence use
cf80: 64 20 62 79 20 74 68 65 20 63 6f 6d 70 61 72 69  d by the compari
cf90: 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64 65 78  son. If an index
cfa0: 20 69 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20   is to.      ** 
cfb0: 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65  be used in place
cfc0: 20 6f 66 20 61 20 74 65 6d 70 2d 74 61 62 6c 65   of a temp-table
cfd0: 2c 20 69 74 20 6d 75 73 74 20 62 65 20 6f 72 64  , it must be ord
cfe0: 65 72 65 64 20 61 63 63 6f 72 64 69 6e 67 0a 20  ered according. 
cff0: 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20       ** to this 
d000: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
d010: 63 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 43 6f  ce.  */.      Co
d020: 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d 20 73 71  llSeq *pReq = sq
d030: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
d040: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
d050: 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 45 78  , pX->pLeft, pEx
d060: 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  pr);..      /* C
d070: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 66  heck that the af
d080: 66 69 6e 69 74 79 20 74 68 61 74 20 77 69 6c 6c  finity that will
d090: 20 62 65 20 75 73 65 64 20 74 6f 20 70 65 72 66   be used to perf
d0a0: 6f 72 6d 20 74 68 65 20 0a 20 20 20 20 20 20 2a  orm the .      *
d0b0: 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  * comparison is 
d0c0: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
d0d0: 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  affinity of the 
d0e0: 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20 20 20 20 20  column. If.     
d0f0: 20 2a 2a 20 69 74 20 69 73 20 6e 6f 74 2c 20 69   ** it is not, i
d100: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
d110: 65 20 74 6f 20 75 73 65 20 61 6e 79 20 69 6e 64  e to use any ind
d120: 65 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ex..      */.   
d130: 20 20 20 69 6e 74 20 61 66 66 69 6e 69 74 79 5f     int affinity_
d140: 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  ok = sqlite3Inde
d150: 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20  xAffinityOk(pX, 
d160: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
d170: 2e 61 66 66 69 6e 69 74 79 29 3b 0a 0a 20 20 20  .affinity);..   
d180: 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
d190: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26  ->pIndex; pIdx &
d1a0: 26 20 65 54 79 70 65 3d 3d 30 20 26 26 20 61 66  & eType==0 && af
d1b0: 66 69 6e 69 74 79 5f 6f 6b 3b 20 70 49 64 78 3d  finity_ok; pIdx=
d1c0: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
d1d0: 20 20 20 20 20 20 69 66 28 20 28 70 49 64 78 2d        if( (pIdx-
d1e0: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43  >aiColumn[0]==iC
d1f0: 6f 6c 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  ol).         && 
d200: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
d210: 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20  eq(db, ENC(db), 
d220: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c  pIdx->azColl[0],
d230: 20 30 29 3d 3d 70 52 65 71 0a 20 20 20 20 20 20   0)==pReq.      
d240: 20 20 20 26 26 20 28 21 6d 75 73 74 42 65 55 6e     && (!mustBeUn
d250: 69 71 75 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e  ique || (pIdx->n
d260: 4b 65 79 43 6f 6c 3d 3d 31 20 26 26 20 70 49 64  KeyCol==1 && pId
d270: 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
d280: 6f 6e 65 29 29 0a 20 20 20 20 20 20 20 20 29 7b  one)).        ){
d290: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
d2a0: 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f  Addr = sqlite3Co
d2b0: 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a  deOnce(pParse);.
d2c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d2d0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d2e0: 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62  P_OpenRead, iTab
d2f0: 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44  , pIdx->tnum, iD
d300: 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  b);.          sq
d310: 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65  lite3VdbeSetP4Ke
d320: 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yInfo(pParse, pI
d330: 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  dx);.          V
d340: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
d350: 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  %s", pIdx->zName
d360: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ));.          as
d370: 73 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49  sert( IN_INDEX_I
d380: 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f  NDEX_DESC == IN_
d390: 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b  INDEX_INDEX_ASC+
d3a0: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65  1 );.          e
d3b0: 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
d3c0: 49 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64 78  INDEX_ASC + pIdx
d3d0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3b  ->aSortOrder[0];
d3e0: 0a 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ..          sqli
d3f0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
d400: 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20  v, iAddr);.     
d410: 20 20 20 20 20 69 66 28 20 70 72 4e 6f 74 46 6f       if( prNotFo
d420: 75 6e 64 20 26 26 20 21 70 54 61 62 2d 3e 61 43  und && !pTab->aC
d430: 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c  ol[iCol].notNull
d440: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d450: 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 2b 2b  *prNotFound = ++
d460: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
d470: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d480: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d490: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 2a 70 72 4e 6f  P_Null, 0, *prNo
d4a0: 74 46 6f 75 6e 64 29 3b 0a 20 20 20 20 20 20 20  tFound);.       
d4b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
d4c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
d4d0: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30  ..  if( eType==0
d4e0: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64   ){.    /* Could
d4f0: 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 20 65 78   not found an ex
d500: 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20  isting table or 
d510: 69 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73 20  index to use as 
d520: 74 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a  the RHS b-tree..
d530: 20 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68      ** We will h
d540: 61 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20  ave to generate 
d550: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
d560: 6c 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62  le to do the job
d570: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 33 32  ..    */.    u32
d580: 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70   savedNQueryLoop
d590: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72   = pParse->nQuer
d5a0: 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72  yLoop;.    int r
d5b0: 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b  MayHaveNull = 0;
d5c0: 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f  .    eType = IN_
d5d0: 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69  INDEX_EPH;.    i
d5e0: 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20 29 7b  f( prNotFound ){
d5f0: 0a 20 20 20 20 20 20 2a 70 72 4e 6f 74 46 6f 75  .      *prNotFou
d600: 6e 64 20 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c  nd = rMayHaveNul
d610: 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  l = ++pParse->nM
d620: 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
d630: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d640: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 2a 70 72 4e 6f  P_Null, 0, *prNo
d650: 74 46 6f 75 6e 64 29 3b 0a 20 20 20 20 7d 65 6c  tFound);.    }el
d660: 73 65 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  se{.      testca
d670: 73 65 28 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  se( pParse->nQue
d680: 72 79 4c 6f 6f 70 3e 30 20 29 3b 0a 20 20 20 20  ryLoop>0 );.    
d690: 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
d6a0: 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Loop = 0;.      
d6b0: 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69  if( pX->pLeft->i
d6c0: 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78 70  Column<0 && !Exp
d6d0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c  rHasProperty(pX,
d6e0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
d6f0: 7b 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 20  {.        eType 
d700: 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  = IN_INDEX_ROWID
d710: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d720: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53      sqlite3CodeS
d730: 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
d740: 20 70 58 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c   pX, rMayHaveNul
d750: 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  l, eType==IN_IND
d760: 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20 20 20 70  EX_ROWID);.    p
d770: 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
d780: 70 20 3d 20 73 61 76 65 64 4e 51 75 65 72 79 4c  p = savedNQueryL
d790: 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oop;.  }else{.  
d7a0: 20 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69    pX->iTable = i
d7b0: 54 61 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Tab;.  }.  retur
d7c0: 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69  n eType;.}.#endi
d7d0: 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
d7e0: 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61  e code for scala
d7f0: 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73 65  r subqueries use
d800: 64 20 61 73 20 61 20 73 75 62 71 75 65 72 79 20  d as a subquery 
d810: 65 78 70 72 65 73 73 69 6f 6e 2c 20 45 58 49 53  expression, EXIS
d820: 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65  TS,.** or IN ope
d830: 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65  rators.  Example
d840: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45  s:.**.**     (SE
d850: 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
d860: 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75          -- subqu
d870: 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54  ery.**     EXIST
d880: 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  S (SELECT a FROM
d890: 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20   b)   -- EXISTS 
d8a0: 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20  subquery.**     
d8b0: 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20  x IN (4,5,11)   
d8c0: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e             -- IN
d8d0: 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c   operator with l
d8e0: 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e  ist on right-han
d8f0: 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20  d side.**     x 
d900: 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  IN (SELECT a FRO
d910: 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f  M b)     -- IN o
d920: 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75 62  perator with sub
d930: 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67  query on the rig
d940: 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78  ht.**.** The pEx
d950: 70 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 73  pr parameter des
d960: 63 72 69 62 65 73 20 74 68 65 20 65 78 70 72 65  cribes the expre
d970: 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61  ssion that conta
d980: 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70  ins the IN.** op
d990: 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65  erator or subque
d9a0: 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ry..**.** If par
d9b0: 61 6d 65 74 65 72 20 69 73 52 6f 77 69 64 20 69  ameter isRowid i
d9c0: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
d9d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
d9e0: 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a  r is guaranteed.
d9f0: 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20  ** to be of the 
da00: 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e  form "<rowid> IN
da10: 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65   (?, ?, ?)", whe
da20: 72 65 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20  re <rowid> is a 
da30: 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20  reference.** to 
da40: 73 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79  some integer key
da50: 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62   column of a tab
da60: 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68  le B-Tree. In th
da70: 69 73 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a  is case, use an.
da80: 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65  ** intkey B-Tree
da90: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65   to store the se
daa0: 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c  t of IN(...) val
dab0: 75 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74  ues instead of t
dac0: 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f  he usual.** (slo
dad0: 77 65 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65  wer) variable le
dae0: 6e 67 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65  ngth keys B-Tree
daf0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48  ..**.** If rMayH
db00: 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a  aveNull is non-z
db10: 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ero, that means 
db20: 74 68 61 74 20 74 68 65 20 6f 70 65 72 61 74 69  that the operati
db30: 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28  on is an IN.** (
db40: 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 6f 72 20  not a SELECT or 
db50: 45 58 49 53 54 53 29 20 61 6e 64 20 74 68 61 74  EXISTS) and that
db60: 20 74 68 65 20 52 48 53 20 6d 69 67 68 74 20 63   the RHS might c
db70: 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a  ontains NULLs..*
db80: 2a 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 74  * Furthermore, t
db90: 68 65 20 49 4e 20 69 73 20 69 6e 20 61 20 57 48  he IN is in a WH
dba0: 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64 20 74  ERE clause and t
dbb0: 68 61 74 20 77 65 20 72 65 61 6c 6c 79 20 77 61  hat we really wa
dbc0: 6e 74 0a 2a 2a 20 74 6f 20 69 74 65 72 61 74 65  nt.** to iterate
dbd0: 20 6f 76 65 72 20 74 68 65 20 52 48 53 20 6f 66   over the RHS of
dbe0: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
dbf0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 71 75 69   in order to qui
dc00: 63 6b 6c 79 20 6c 6f 63 61 74 65 0a 2a 2a 20 61  ckly locate.** a
dc10: 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ll corresponding
dc20: 20 4c 48 53 20 65 6c 65 6d 65 6e 74 73 2e 20 20   LHS elements.  
dc30: 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  All this routine
dc40: 20 64 6f 65 73 20 69 73 20 69 6e 69 74 69 61 6c   does is initial
dc50: 69 7a 65 0a 2a 2a 20 74 68 65 20 72 65 67 69 73  ize.** the regis
dc60: 74 65 72 20 67 69 76 65 6e 20 62 79 20 72 4d 61  ter given by rMa
dc70: 79 48 61 76 65 4e 75 6c 6c 20 74 6f 20 4e 55 4c  yHaveNull to NUL
dc80: 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74  L.  Calling rout
dc90: 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65 0a 2a  ines will take.*
dca0: 2a 20 63 61 72 65 20 6f 66 20 63 68 61 6e 67 69  * care of changi
dcb0: 6e 67 20 74 68 69 73 20 72 65 67 69 73 74 65 72  ng this register
dcc0: 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55   value to non-NU
dcd0: 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20 69 73  LL if the RHS is
dce0: 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a   NULL-free..**.*
dcf0: 2a 20 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c  * If rMayHaveNul
dd00: 6c 20 69 73 20 7a 65 72 6f 2c 20 74 68 61 74 20  l is zero, that 
dd10: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73  means that the s
dd20: 75 62 71 75 65 72 79 20 69 73 20 62 65 69 6e 67  ubquery is being
dd30: 20 75 73 65 64 0a 2a 2a 20 66 6f 72 20 6d 65 6d   used.** for mem
dd40: 62 65 72 73 68 69 70 20 74 65 73 74 69 6e 67 20  bership testing 
dd50: 6f 6e 6c 79 2e 20 20 54 68 65 72 65 20 69 73 20  only.  There is 
dd60: 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 69 74 69  no need to initi
dd70: 61 6c 69 7a 65 20 61 6e 79 0a 2a 2a 20 72 65 67  alize any.** reg
dd80: 69 73 74 65 72 73 20 74 6f 20 69 6e 64 69 63 61  isters to indica
dd90: 74 65 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  te the presence 
dda0: 6f 72 20 61 62 73 65 6e 63 65 20 6f 66 20 4e 55  or absence of NU
ddb0: 4c 4c 73 20 6f 6e 20 74 68 65 20 52 48 53 2e 0a  LLs on the RHS..
ddc0: 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45  **.** For a SELE
ddd0: 43 54 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65  CT or EXISTS ope
dde0: 72 61 74 6f 72 2c 20 72 65 74 75 72 6e 20 74 68  rator, return th
ddf0: 65 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20  e register that 
de00: 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65 73  holds the.** res
de10: 75 6c 74 2e 20 20 46 6f 72 20 49 4e 20 6f 70 65  ult.  For IN ope
de20: 72 61 74 6f 72 73 20 6f 72 20 69 66 20 61 6e 20  rators or if an 
de30: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
de40: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
de50: 73 20 30 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  s 0..*/.#ifndef 
de60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
de70: 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33  UERY.int sqlite3
de80: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a 20  CodeSubselect(. 
de90: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
dea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
deb0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
dec0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
ded0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
dee0: 49 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20 45  IN, SELECT, or E
def0: 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20 2a  XISTS operator *
df00: 2f 0a 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65  /.  int rMayHave
df10: 4e 75 6c 6c 2c 20 20 20 20 20 20 20 2f 2a 20 52  Null,       /* R
df20: 65 67 69 73 74 65 72 20 74 68 61 74 20 72 65 63  egister that rec
df30: 6f 72 64 73 20 77 68 65 74 68 65 72 20 4e 55 4c  ords whether NUL
df40: 4c 73 20 65 78 69 73 74 20 69 6e 20 52 48 53 20  Ls exist in RHS 
df50: 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64  */.  int isRowid
df60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
df70: 49 66 20 74 72 75 65 2c 20 4c 48 53 20 6f 66 20  If true, LHS of 
df80: 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
df90: 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69   rowid */.){.  i
dfa0: 6e 74 20 74 65 73 74 41 64 64 72 20 3d 20 2d 31  nt testAddr = -1
dfb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dfc0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69         /* One-ti
dfd0: 6d 65 20 74 65 73 74 20 61 64 64 72 65 73 73 20  me test address 
dfe0: 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20  */.  int rReg = 
dff0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
e000: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e010: 52 65 67 69 73 74 65 72 20 73 74 6f 72 69 6e 67  Register storing
e020: 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20   resulting */.  
e030: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
e040: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
e050: 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
e060: 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  =0) ) return 0;.
e070: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
e080: 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
e090: 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20  .  /* This code 
e0a0: 6d 75 73 74 20 62 65 20 72 75 6e 20 69 6e 20 69  must be run in i
e0b0: 74 73 20 65 6e 74 69 72 65 74 79 20 65 76 65 72  ts entirety ever
e0c0: 79 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63  y time it is enc
e0d0: 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69 66  ountered.  ** if
e0e0: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
e0f0: 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20  owing is true:. 
e100: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54   **.  **    *  T
e110: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
e120: 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74  de is a correlat
e130: 65 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a  ed subquery.  **
e140: 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74      *  The right
e150: 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e  -hand side is an
e160: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
e170: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69   containing vari
e180: 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20  ables.  **    * 
e190: 20 57 65 20 61 72 65 20 69 6e 73 69 64 65 20 61   We are inside a
e1a0: 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20   trigger.  **.  
e1b0: 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65  ** If all of the
e1c0: 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65   above are false
e1d0: 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75  , then we can ru
e1e0: 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74  n this code just
e1f0: 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20   once.  ** save 
e200: 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64  the results, and
e210: 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20   reuse the same 
e220: 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71  result on subseq
e230: 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73  uent invocations
e240: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78  ..  */.  if( !Ex
e250: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
e260: 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63  xpr, EP_VarSelec
e270: 74 29 20 29 7b 0a 20 20 20 20 74 65 73 74 41 64  t) ){.    testAd
e280: 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  dr = sqlite3Code
e290: 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Once(pParse);.  
e2a0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
e2b0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
e2c0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
e2d0: 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63  lain==2 ){.    c
e2e0: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69  har *zMsg = sqli
e2f0: 74 65 33 4d 50 72 69 6e 74 66 28 0a 20 20 20 20  te3MPrintf(.    
e300: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20      pParse->db, 
e310: 22 45 58 45 43 55 54 45 20 25 73 25 73 20 53 55  "EXECUTE %s%s SU
e320: 42 51 55 45 52 59 20 25 64 22 2c 20 74 65 73 74  BQUERY %d", test
e330: 41 64 64 72 3e 3d 30 3f 22 22 3a 22 43 4f 52 52  Addr>=0?"":"CORR
e340: 45 4c 41 54 45 44 20 22 2c 0a 20 20 20 20 20 20  ELATED ",.      
e350: 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f    pExpr->op==TK_
e360: 49 4e 3f 22 4c 49 53 54 22 3a 22 53 43 41 4c 41  IN?"LIST":"SCALA
e370: 52 22 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  R", pParse->iNex
e380: 74 53 65 6c 65 63 74 49 64 0a 20 20 20 20 29 3b  tSelectId.    );
e390: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e3a0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
e3b0: 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53  lain, pParse->iS
e3c0: 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a  electId, 0, 0, z
e3d0: 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
e3e0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
e3f0: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
e400: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
e410: 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68 61  _IN: {.      cha
e420: 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20  r affinity;     
e430: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69           /* Affi
e440: 6e 69 74 79 20 6f 66 20 74 68 65 20 4c 48 53 20  nity of the LHS 
e450: 6f 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20  of the IN */.   
e460: 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20     int addr;    
e470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e480: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f  * Address of OP_
e490: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
e4a0: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  struction */.   
e4b0: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
e4c0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 20 2f   pExpr->pLeft; /
e4d0: 2a 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  * the LHS of the
e4e0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
e4f0: 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
e500: 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20  KeyInfo = 0;    
e510: 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61    /* Key informa
e520: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 69  tion */..      i
e530: 66 28 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  f( rMayHaveNull 
e540: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
e550: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e560: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 4d 61 79  OP_Null, 0, rMay
e570: 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  HaveNull);.     
e580: 20 7d 0a 0a 20 20 20 20 20 20 61 66 66 69 6e 69   }..      affini
e590: 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
e5a0: 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b  Affinity(pLeft);
e5b0: 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68  ..      /* Wheth
e5c0: 65 72 20 74 68 69 73 20 69 73 20 61 6e 20 27 78  er this is an 'x
e5d0: 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20   IN(SELECT...)' 
e5e0: 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78 70  or an 'x IN(<exp
e5f0: 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20 2a  rlist>)'.      *
e600: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74 20  * expression it 
e610: 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20 73  is handled the s
e620: 61 6d 65 20 77 61 79 2e 20 20 41 6e 20 65 70 68  ame way.  An eph
e630: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20  emeral table is 
e640: 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64  .      ** filled
e650: 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65   with single-fie
e660: 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65  ld index keys re
e670: 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72  presenting the r
e680: 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20  esults.      ** 
e690: 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20  from the SELECT 
e6a0: 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74  or the <exprlist
e6b0: 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  >..      **.    
e6c0: 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20    ** If the 'x' 
e6d0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
e6e0: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72  column value, or
e6f0: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20   the SELECT.... 
e700: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
e710: 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75  t returns a colu
e720: 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  mn value, then t
e730: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  he affinity of t
e740: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  hat.      ** col
e750: 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62  umn is used to b
e760: 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b  uild the index k
e770: 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27  eys. If both 'x'
e780: 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a   and the.      *
e790: 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  * SELECT... stat
e7a0: 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
e7b0: 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
e7c0: 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64  affinity is used
e7d0: 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74  .      ** if eit
e7e0: 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e  her column has N
e7f0: 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45  UMERIC or INTEGE
e800: 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e  R affinity. If n
e810: 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20  either.      ** 
e820: 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45  'x' nor the SELE
e830: 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
e840: 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
e850: 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
e860: 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75  ty.      ** is u
e870: 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sed..      */.  
e880: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
e890: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
e8a0: 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  ++;.      addr =
e8b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e8c0: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
e8d0: 65 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69  emeral, pExpr->i
e8e0: 54 61 62 6c 65 2c 20 21 69 73 52 6f 77 69 64 29  Table, !isRowid)
e8f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 4d 61 79  ;.      if( rMay
e900: 48 61 76 65 4e 75 6c 6c 3d 3d 30 20 29 20 73 71  HaveNull==0 ) sq
e910: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
e920: 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44  5(v, BTREE_UNORD
e930: 45 52 45 44 29 3b 0a 20 20 20 20 20 20 70 4b 65  ERED);.      pKe
e940: 79 49 6e 66 6f 20 3d 20 69 73 52 6f 77 69 64 20  yInfo = isRowid 
e950: 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 4b 65 79  ? 0 : sqlite3Key
e960: 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65  InfoAlloc(pParse
e970: 2d 3e 64 62 2c 20 31 2c 20 31 29 3b 0a 0a 20 20  ->db, 1, 1);..  
e980: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
e990: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
e9a0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
e9b0: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20          /* Case 
e9c0: 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28  1:     expr IN (
e9d0: 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20  SELECT ...).    
e9e0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
e9f0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
ea00: 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 65 73  to write the res
ea10: 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ults of the sele
ea20: 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70  ct into the temp
ea30: 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a  orary.        **
ea40: 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64   table allocated
ea50: 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76   and opened abov
ea60: 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
ea70: 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
ea80: 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 45   dest;.        E
ea90: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
eaa0: 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ..        assert
eab0: 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a 20 20  ( !isRowid );.  
eac0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
ead0: 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
eae0: 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78 70  t, SRT_Set, pExp
eaf0: 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  r->iTable);.    
eb00: 20 20 20 20 64 65 73 74 2e 61 66 66 53 64 73 74      dest.affSdst
eb10: 20 3d 20 28 75 38 29 61 66 66 69 6e 69 74 79 3b   = (u8)affinity;
eb20: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
eb30: 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 26   (pExpr->iTable&
eb40: 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45 78  0x0000FFFF)==pEx
eb50: 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20  pr->iTable );.  
eb60: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70        pExpr->x.p
eb70: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d  Select->iLimit =
eb80: 20 30 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   0;.        test
eb90: 63 61 73 65 28 20 70 4b 65 79 49 6e 66 6f 3d 3d  case( pKeyInfo==
eba0: 30 20 29 3b 20 2f 2a 20 43 61 75 73 65 64 20 62  0 ); /* Caused b
ebb0: 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74 65 33  y OOM in sqlite3
ebc0: 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a  KeyInfoAlloc() *
ebd0: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  /.        if( sq
ebe0: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
ebf0: 73 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  se, pExpr->x.pSe
ec00: 6c 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a  lect, &dest) ){.
ec10: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ec20: 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b  3KeyInfoUnref(pK
ec30: 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  eyInfo);.       
ec40: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
ec50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
ec60: 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  EList = pExpr->x
ec70: 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
ec80: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
ec90: 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29 3b  ( pKeyInfo!=0 );
eca0: 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75   /* OOM will cau
ecb0: 73 65 20 65 78 69 74 20 61 66 74 65 72 20 73 71  se exit after sq
ecc0: 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 2a 2f  lite3Select() */
ecd0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
ece0: 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20   pEList!=0 );.  
ecf0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
ed00: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
ed10: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
ed20: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
ed30: 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49  sWriteable(pKeyI
ed40: 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20  nfo) );.        
ed50: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
ed60: 30 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  0] = sqlite3Bina
ed70: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
ed80: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
ed90: 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20 20  pLeft,.         
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edd0: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
ede0: 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  pr);.      }else
edf0: 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70   if( ALWAYS(pExp
ee00: 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29  r->x.pList!=0) )
ee10: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
ee20: 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 2:     expr IN
ee30: 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20   (exprlist).    
ee40: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
ee50: 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65  * For each expre
ee60: 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20  ssion, build an 
ee70: 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74  index key from t
ee80: 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e  he evaluation an
ee90: 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f  d.        ** sto
eea0: 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d  re it in the tem
eeb0: 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66  porary table. If
eec0: 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c   <expr> is a col
eed0: 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20  umn, then use.  
eee0: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f        ** that co
eef0: 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77  lumns affinity w
ef00: 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64  hen building ind
ef10: 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70  ex keys. If <exp
ef20: 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20  r> is not.      
ef30: 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75    ** a column, u
ef40: 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  se numeric affin
ef50: 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ity..        */.
ef60: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
ef70: 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
ef80: 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
ef90: 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  x.pList;.       
efa0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
efb0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
efc0: 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32        int r1, r2
efd0: 2c 20 72 33 3b 0a 0a 20 20 20 20 20 20 20 20 69  , r3;..        i
efe0: 66 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a  f( !affinity ){.
eff0: 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69            affini
f000: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
f010: 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
f020: 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79          if( pKey
f030: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
f040: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
f050: 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
f060: 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b  ble(pKeyInfo) );
f070: 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49  .          pKeyI
f080: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20  nfo->aColl[0] = 
f090: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
f0a0: 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
f0b0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
f0c0: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
f0d0: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
f0e0: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  h expression in 
f0f0: 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20  <exprlist>. */. 
f100: 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
f110: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
f120: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  arse);.        r
f130: 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
f140: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
f150: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
f160: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
f170: 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20  ull, 0, r2);.   
f180: 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74       for(i=pList
f190: 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
f1a0: 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  List->a; i>0; i-
f1b0: 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
f1c0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32         Expr *pE2
f1d0: 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
f1e0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
f1f0: 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20  ValToIns;..     
f200: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65       /* If the e
f210: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
f220: 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77   constant then w
f230: 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20  e will need to. 
f240: 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73 61           ** disa
f250: 62 6c 65 20 74 68 65 20 74 65 73 74 20 74 68 61  ble the test tha
f260: 74 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  t was generated 
f270: 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65 73  above that makes
f280: 20 73 75 72 65 0a 20 20 20 20 20 20 20 20 20 20   sure.          
f290: 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c  ** this code onl
f2a0: 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65 2e  y executes once.
f2b0: 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61 20    Because for a 
f2c0: 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20  non-constant.   
f2d0: 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73         ** expres
f2e0: 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  sion we need to 
f2f0: 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20  rerun this code 
f300: 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20  each time..     
f310: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
f320: 20 20 69 66 28 20 74 65 73 74 41 64 64 72 3e 3d    if( testAddr>=
f330: 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70  0 && !sqlite3Exp
f340: 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29  rIsConstant(pE2)
f350: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
f360: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
f370: 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73 74 41  eToNoop(v, testA
f380: 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ddr);.          
f390: 20 20 74 65 73 74 41 64 64 72 20 3d 20 2d 31 3b    testAddr = -1;
f3a0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
f3b0: 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75          /* Evalu
f3c0: 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ate the expressi
f3d0: 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  on and insert it
f3e0: 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74   into the temp t
f3f0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
f400: 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 26 26    if( isRowid &&
f410: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
f420: 74 65 67 65 72 28 70 45 32 2c 20 26 69 56 61 6c  teger(pE2, &iVal
f430: 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20 20  ToIns) ){.      
f440: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f450: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
f460: 73 65 72 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e  sertInt, pExpr->
f470: 69 54 61 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c  iTable, r2, iVal
f480: 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 20 20  ToIns);.        
f490: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f4a0: 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65       r3 = sqlite
f4b0: 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
f4c0: 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29  pParse, pE2, r1)
f4d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
f4e0: 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20  ( isRowid ){.   
f4f0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
f500: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f510: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33  OP_MustBeInt, r3
f520: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f540: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72    sqlite3VdbeCur
f550: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a  rentAddr(v)+2);.
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
f570: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
f580: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45  v, OP_Insert, pE
f590: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c  xpr->iTable, r2,
f5a0: 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r3);.          
f5b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f5c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
f5d0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
f5e0: 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31  akeRecord, r3, 1
f5f0: 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c  , r2, &affinity,
f600: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
f610: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
f620: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
f630: 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29  e(pParse, r3, 1)
f640: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
f650: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f660: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
f670: 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
f680: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20  , r2);.         
f690: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
f6a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f6b0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
f6c0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
f6d0: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
f6e0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
f6f0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
f700: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
f710: 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
f720: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
f730: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
f740: 64 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65 79  dr, (void *)pKey
f750: 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
f760: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
f770: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
f780: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
f790: 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
f7a0: 45 4c 45 43 54 3a 0a 20 20 20 20 64 65 66 61 75  ELECT:.    defau
f7b0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49  lt: {.      /* I
f7c0: 66 20 74 68 69 73 20 68 61 73 20 74 6f 20 62 65  f this has to be
f7d0: 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54   a scalar SELECT
f7e0: 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  .  Generate code
f7f0: 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20   to put the.    
f800: 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68    ** value of th
f810: 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d  is select in a m
f820: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72  emory cell and r
f830: 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
f840: 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
f850: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20   memory cell in 
f860: 69 43 6f 6c 75 6d 6e 2e 20 20 49 66 20 74 68 69  iColumn.  If thi
f870: 73 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20  s is an EXISTS, 
f880: 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 61  write.      ** a
f890: 6e 20 69 6e 74 65 67 65 72 20 30 20 28 6e 6f 74  n integer 0 (not
f8a0: 20 65 78 69 73 74 73 29 20 6f 72 20 31 20 28 65   exists) or 1 (e
f8b0: 78 69 73 74 73 29 20 69 6e 74 6f 20 61 20 6d 65  xists) into a me
f8c0: 6d 6f 72 79 20 63 65 6c 6c 0a 20 20 20 20 20 20  mory cell.      
f8d0: 2a 2a 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68  ** and record th
f8e0: 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  at memory cell i
f8f0: 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  n iColumn..     
f900: 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
f910: 20 2a 70 53 65 6c 3b 20 20 20 20 20 20 20 20 20   *pSel;         
f920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f930: 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
f940: 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f  ent to encode */
f950: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
f960: 74 20 64 65 73 74 3b 20 20 20 20 20 20 20 20 20  t dest;         
f970: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f980: 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68  How to deal with
f990: 20 53 45 4c 45 43 74 20 72 65 73 75 6c 74 20 2a   SELECt result *
f9a0: 2f 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  /..      testcas
f9b0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
f9c0: 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20  _EXISTS );.     
f9d0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
f9e0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
f9f0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
fa00: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
fa10: 58 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e  XISTS || pExpr->
fa20: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
fa30: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
fa40: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
fa50: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
fa60: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 70 53  ect) );.      pS
fa70: 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53  el = pExpr->x.pS
fa80: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 73 71 6c  elect;.      sql
fa90: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
faa0: 69 74 28 26 64 65 73 74 2c 20 30 2c 20 2b 2b 70  it(&dest, 0, ++p
fab0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  Parse->nMem);.  
fac0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
fad0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
fae0: 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65          dest.eDe
faf0: 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20  st = SRT_Mem;.  
fb00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fb10: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
fb20: 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50  ll, 0, dest.iSDP
fb30: 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64  arm);.        Vd
fb40: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49  beComment((v, "I
fb50: 6e 69 74 20 73 75 62 71 75 65 72 79 20 72 65 73  nit subquery res
fb60: 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65  ult"));.      }e
fb70: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73  lse{.        des
fb80: 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78  t.eDest = SRT_Ex
fb90: 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71  ists;.        sq
fba0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
fbb0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
fbc0: 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b  , dest.iSDParm);
fbd0: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
fbe0: 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 45  ment((v, "Init E
fbf0: 58 49 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b  XISTS result"));
fc00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
fc10: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
fc20: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65  (pParse->db, pSe
fc30: 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  l->pLimit);.    
fc40: 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d    pSel->pLimit =
fc50: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
fc60: 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52  arse, TK_INTEGER
fc70: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc90: 20 20 20 20 20 20 20 20 20 20 26 73 71 6c 69 74            &sqlit
fca0: 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 29 3b  e3IntTokens[1]);
fcb0: 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c 69  .      pSel->iLi
fcc0: 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  mit = 0;.      i
fcd0: 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
fce0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26  (pParse, pSel, &
fcf0: 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  dest) ){.       
fd00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
fd10: 20 7d 0a 20 20 20 20 20 20 72 52 65 67 20 3d 20   }.      rReg = 
fd20: 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20  dest.iSDParm;.  
fd30: 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72      ExprSetVVAPr
fd40: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
fd50: 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20  _NoReduce);.    
fd60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
fd70: 20 7d 0a 0a 20 20 69 66 28 20 74 65 73 74 41 64   }..  if( testAd
fd80: 64 72 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  dr>=0 ){.    sql
fd90: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
fda0: 28 76 2c 20 74 65 73 74 41 64 64 72 29 3b 0a 20  (v, testAddr);. 
fdb0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
fdc0: 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c  CachePop(pParse,
fdd0: 20 31 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72   1);..  return r
fde0: 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Reg;.}.#endif /*
fdf0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
fe00: 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65  QUERY */..#ifnde
fe10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
fe20: 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e  BQUERY./*.** Gen
fe30: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
fe40: 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e  n IN expression.
fe50: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e  .**.**      x IN
fe60: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a   (SELECT ...).**
fe70: 20 20 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75        x IN (valu
fe80: 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a  e, value, ...).*
fe90: 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61  *.** The left-ha
fea0: 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20 69 73  nd side (LHS) is
feb0: 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73   a scalar expres
fec0: 73 69 6f 6e 2e 20 20 54 68 65 20 72 69 67 68 74  sion.  The right
fed0: 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48 53 29  -hand side (RHS)
fee0: 0a 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20  .** is an array 
fef0: 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  of zero or more 
ff00: 76 61 6c 75 65 73 2e 20 20 54 68 65 20 65 78 70  values.  The exp
ff10: 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20  ression is true 
ff20: 69 66 20 74 68 65 20 4c 48 53 20 69 73 0a 2a 2a  if the LHS is.**
ff30: 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
ff40: 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68 65 20  n the RHS.  The 
ff50: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 65 78 70  value of the exp
ff60: 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 6b 6e 6f  ression is unkno
ff70: 77 6e 20 28 4e 55 4c 4c 29 0a 2a 2a 20 69 66 20  wn (NULL).** if 
ff80: 74 68 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c 20  the LHS is NULL 
ff90: 6f 72 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  or if the LHS is
ffa0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 77   not contained w
ffb0: 69 74 68 69 6e 20 74 68 65 20 52 48 53 20 61 6e  ithin the RHS an
ffc0: 64 20 74 68 65 0a 2a 2a 20 52 48 53 20 63 6f 6e  d the.** RHS con
ffd0: 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
ffe0: 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a  e NULL values..*
fff0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
10000 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
10010 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 64 65   will jump to de
10020 73 74 49 66 46 61 6c 73 65 20 69 66 20 74 68 65  stIfFalse if the
10030 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20   LHS is not .** 
10040 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
10050 20 74 68 65 20 52 48 53 2e 20 20 49 66 20 64 75   the RHS.  If du
10060 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61  e to NULLs we ca
10070 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 69  nnot determine i
10080 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20  f the LHS.** is 
10090 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
100a0 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70 20 74   RHS then jump t
100b0 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49  o destIfNull.  I
100c0 66 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e  f the LHS is con
100d0 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e  tained.** within
100e0 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 66 61   the RHS then fa
100f0 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 73  ll through..*/.s
10100 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
10110 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20  e3ExprCodeIN(.  
10120 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
10130 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
10140 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
10150 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
10160 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
10170 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49          /* The I
10180 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  N expression */.
10190 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73    int destIfFals
101a0 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  e,      /* Jump 
101b0 68 65 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e  here if LHS is n
101c0 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
101d0 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74  the RHS */.  int
101e0 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20   destIfNull     
101f0 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
10200 69 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61  if the results a
10210 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74  re unknown due t
10220 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20  o NULLs */.){.  
10230 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20  int rRhsHasNull 
10240 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65  = 0;  /* Registe
10250 72 20 74 68 61 74 20 69 73 20 74 72 75 65 20 69  r that is true i
10260 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e  f RHS contains N
10270 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ULL values */.  
10280 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20  char affinity;  
10290 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69        /* Compari
102a0 73 6f 6e 20 61 66 66 69 6e 69 74 79 20 74 6f 20  son affinity to 
102b0 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  use */.  int eTy
102c0 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pe;            /
102d0 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20 52 48  * Type of the RH
102e0 53 20 2a 2f 0a 20 20 69 6e 74 20 72 31 3b 20 20  S */.  int r1;  
102f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10300 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65  Temporary use re
10310 67 69 73 74 65 72 20 2a 2f 0a 20 20 56 64 62 65  gister */.  Vdbe
10320 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
10330 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75    /* Statement u
10340 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
10350 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  n */..  /* Compu
10360 74 65 20 74 68 65 20 52 48 53 2e 20 20 20 41 66  te the RHS.   Af
10370 74 65 72 20 74 68 69 73 20 73 74 65 70 2c 20 74  ter this step, t
10380 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 63 75  he table with cu
10390 72 73 6f 72 0a 20 20 2a 2a 20 70 45 78 70 72 2d  rsor.  ** pExpr-
103a0 3e 69 54 61 62 6c 65 20 77 69 6c 6c 20 63 6f 6e  >iTable will con
103b0 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73  tains the values
103c0 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68   that make up th
103d0 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 76 20  e RHS..  */.  v 
103e0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
103f0 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
10400 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20  );       /* OOM 
10410 64 65 74 65 63 74 65 64 20 70 72 69 6f 72 20 74  detected prior t
10420 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a  o this routine *
10430 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
10440 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49  ent((v, "begin I
10450 4e 20 65 78 70 72 22 29 29 3b 0a 20 20 65 54 79  N expr"));.  eTy
10460 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  pe = sqlite3Find
10470 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  InIndex(pParse, 
10480 70 45 78 70 72 2c 20 26 72 52 68 73 48 61 73 4e  pExpr, &rRhsHasN
10490 75 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  ull);..  /* Figu
104a0 72 65 20 6f 75 74 20 74 68 65 20 61 66 66 69 6e  re out the affin
104b0 69 74 79 20 74 6f 20 75 73 65 20 74 6f 20 63 72  ity to use to cr
104c0 65 61 74 65 20 61 20 6b 65 79 20 66 72 6f 6d 20  eate a key from 
104d0 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  the results.  **
104e0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
104f0 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20  on. affinityStr 
10500 73 74 6f 72 65 73 20 61 20 73 74 61 74 69 63 20  stores a static 
10510 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20  string suitable 
10520 66 6f 72 0a 20 20 2a 2a 20 50 34 20 6f 66 20 4f  for.  ** P4 of O
10530 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20  P_MakeRecord..  
10540 2a 2f 0a 20 20 61 66 66 69 6e 69 74 79 20 3d 20  */.  affinity = 
10550 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
10560 74 79 28 70 45 78 70 72 29 3b 0a 0a 20 20 2f 2a  ty(pExpr);..  /*
10570 20 43 6f 64 65 20 74 68 65 20 4c 48 53 2c 20 74   Code the LHS, t
10580 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22  he <expr> from "
10590 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22  <expr> IN (...)"
105a0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
105b0 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
105c0 61 72 73 65 29 3b 0a 20 20 72 31 20 3d 20 73 71  arse);.  r1 = sq
105d0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
105e0 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
105f0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
10600 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
10610 20 72 31 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74   r1);..  /* If t
10620 68 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c 2c 20  he LHS is NULL, 
10630 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
10640 69 73 20 65 69 74 68 65 72 20 66 61 6c 73 65 20  is either false 
10650 6f 72 20 4e 55 4c 4c 20 64 65 70 65 6e 64 69 6e  or NULL dependin
10660 67 0a 20 20 2a 2a 20 6f 6e 20 77 68 65 74 68 65  g.  ** on whethe
10670 72 20 74 68 65 20 52 48 53 20 69 73 20 65 6d 70  r the RHS is emp
10680 74 79 20 6f 72 20 6e 6f 74 2c 20 72 65 73 70 65  ty or not, respe
10690 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  ctively..  */.  
106a0 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d  if( destIfNull==
106b0 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20  destIfFalse ){. 
106c0 20 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66     /* Shortcut f
106d0 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
106e0 73 65 20 77 68 65 72 65 20 74 68 65 20 66 61 6c  se where the fal
106f0 73 65 20 61 6e 64 20 4e 55 4c 4c 20 6f 75 74 63  se and NULL outc
10700 6f 6d 65 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  omes are.    ** 
10710 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a 20 20 20  the same. */.   
10720 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10730 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
10740 20 72 31 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29   r1, destIfNull)
10750 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
10760 6e 74 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  nt addr1 = sqlit
10770 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
10780 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 31 29 3b  OP_NotNull, r1);
10790 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
107a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
107b0 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ind, pExpr->iTab
107c0 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  le, destIfFalse)
107d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
107e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
107f0 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 4e 75 6c  to, 0, destIfNul
10800 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  l);.    sqlite3V
10810 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
10820 64 64 72 31 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ddr1);.  }..  if
10830 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
10840 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f  X_ROWID ){.    /
10850 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
10860 74 68 65 20 52 48 53 20 69 73 20 74 68 65 20 52  the RHS is the R
10870 4f 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62 2d  OWID of table b-
10880 74 72 65 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tree.    */.    
10890 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
108a0 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  2(v, OP_MustBeIn
108b0 74 2c 20 72 31 2c 20 64 65 73 74 49 66 46 61 6c  t, r1, destIfFal
108c0 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  se);.    sqlite3
108d0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
108e0 5f 4e 6f 74 45 78 69 73 74 73 2c 20 70 45 78 70  _NotExists, pExp
108f0 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49  r->iTable, destI
10900 66 46 61 6c 73 65 2c 20 72 31 29 3b 0a 20 20 7d  fFalse, r1);.  }
10910 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  else{.    /* In 
10920 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52  this case, the R
10930 48 53 20 69 73 20 61 6e 20 69 6e 64 65 78 20 62  HS is an index b
10940 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  -tree..    */.  
10950 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10960 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69  Op4(v, OP_Affini
10970 74 79 2c 20 72 31 2c 20 31 2c 20 30 2c 20 26 61  ty, r1, 1, 0, &a
10980 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 0a 20 20  ffinity, 1);..  
10990 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 74 20    /* If the set 
109a0 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 20  membership test 
109b0 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20  fails, then the 
109c0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 0a 20  result of the . 
109d0 20 20 20 2a 2a 20 22 78 20 49 4e 20 28 2e 2e 2e     ** "x IN (...
109e0 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75  )" expression mu
109f0 73 74 20 62 65 20 65 69 74 68 65 72 20 30 20 6f  st be either 0 o
10a00 72 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 73  r NULL. If the s
10a10 65 74 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69  et.    ** contai
10a20 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65  ns no NULL value
10a30 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  s, then the resu
10a40 6c 74 20 69 73 20 30 2e 20 49 66 20 74 68 65 20  lt is 0. If the 
10a50 73 65 74 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74  set .    ** cont
10a60 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
10a70 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68   NULL values, th
10a80 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  en the result of
10a90 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 78 70 72   the.    ** expr
10aa0 65 73 73 69 6f 6e 20 69 73 20 61 6c 73 6f 20 4e  ession is also N
10ab0 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ULL..    */.    
10ac0 69 66 28 20 72 52 68 73 48 61 73 4e 75 6c 6c 3d  if( rRhsHasNull=
10ad0 3d 30 20 7c 7c 20 64 65 73 74 49 66 46 61 6c 73  =0 || destIfFals
10ae0 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 7b  e==destIfNull ){
10af0 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
10b00 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 69 74  ranch runs if it
10b10 20 69 73 20 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d   is known at com
10b20 70 69 6c 65 20 74 69 6d 65 20 74 68 61 74 20 74  pile time that t
10b30 68 65 20 52 48 53 0a 20 20 20 20 20 20 2a 2a 20  he RHS.      ** 
10b40 63 61 6e 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4e  cannot contain N
10b50 55 4c 4c 20 76 61 6c 75 65 73 2e 20 54 68 69 73  ULL values. This
10b60 20 68 61 70 70 65 6e 73 20 61 73 20 74 68 65 20   happens as the 
10b70 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20  result.      ** 
10b80 6f 66 20 61 20 22 4e 4f 54 20 4e 55 4c 4c 22 20  of a "NOT NULL" 
10b90 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 74 68  constraint in th
10ba0 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
10bb0 61 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  a..      **.    
10bc0 20 20 2a 2a 20 41 6c 73 6f 20 72 75 6e 20 74 68    ** Also run th
10bd0 69 73 20 62 72 61 6e 63 68 20 69 66 20 4e 55 4c  is branch if NUL
10be0 4c 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  L is equivalent 
10bf0 74 6f 20 46 41 4c 53 45 0a 20 20 20 20 20 20 2a  to FALSE.      *
10c00 2a 20 66 6f 72 20 74 68 69 73 20 70 61 72 74 69  * for this parti
10c10 63 75 6c 61 72 20 49 4e 20 6f 70 65 72 61 74 6f  cular IN operato
10c20 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  r..      */.    
10c30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10c40 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74  Op4Int(v, OP_Not
10c50 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  Found, pExpr->iT
10c60 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73  able, destIfFals
10c70 65 2c 20 72 31 2c 20 31 29 3b 0a 0a 20 20 20 20  e, r1, 1);..    
10c80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
10c90 49 6e 20 74 68 69 73 20 62 72 61 6e 63 68 2c 20  In this branch, 
10ca0 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
10cb0 4e 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  N might contain 
10cc0 61 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 20 20 20  a NULL and.     
10cd0 20 2a 2a 20 74 68 65 20 70 72 65 73 65 6e 63 65   ** the presence
10ce0 20 6f 66 20 61 20 4e 55 4c 4c 20 6f 6e 20 74 68   of a NULL on th
10cf0 65 20 52 48 53 20 6d 61 6b 65 73 20 61 20 64 69  e RHS makes a di
10d00 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65 0a  fference in the.
10d10 20 20 20 20 20 20 2a 2a 20 6f 75 74 63 6f 6d 65        ** outcome
10d20 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10d30 20 69 6e 74 20 6a 31 2c 20 6a 32 2c 20 6a 33 3b   int j1, j2, j3;
10d40 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74  ..      /* First
10d50 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
10d60 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74   the LHS is cont
10d70 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53  ained in the RHS
10d80 2e 20 20 49 66 20 73 6f 2c 0a 20 20 20 20 20 20  .  If so,.      
10d90 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 72 65 73  ** then the pres
10da0 65 6e 63 65 20 6f 66 20 4e 55 4c 4c 73 20 69 6e  ence of NULLs in
10db0 20 74 68 65 20 52 48 53 20 64 6f 65 73 20 6e 6f   the RHS does no
10dc0 74 20 6d 61 74 74 65 72 2c 20 73 6f 20 6a 75 6d  t matter, so jum
10dd0 70 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20  p.      ** over 
10de0 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20  all of the code 
10df0 74 68 61 74 20 66 6f 6c 6c 6f 77 73 2e 0a 20 20  that follows..  
10e00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6a 31 20      */.      j1 
10e10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
10e20 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
10e30 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
10e40 65 2c 20 30 2c 20 72 31 2c 20 31 29 3b 0a 0a 20  e, 0, r1, 1);.. 
10e50 20 20 20 20 20 2f 2a 20 48 65 72 65 20 77 65 20       /* Here we 
10e60 62 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  begin generating
10e70 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20   code that runs 
10e80 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f  if the LHS is no
10e90 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61  t.      ** conta
10ea0 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ined within the 
10eb0 52 48 53 2e 20 20 47 65 6e 65 72 61 74 65 20 61  RHS.  Generate a
10ec0 64 64 69 74 69 6f 6e 61 6c 20 63 6f 64 65 20 74  dditional code t
10ed0 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 65 73  hat.      ** tes
10ee0 74 73 20 74 68 65 20 52 48 53 20 66 6f 72 20 4e  ts the RHS for N
10ef0 55 4c 4c 73 2e 20 20 49 66 20 74 68 65 20 52 48  ULLs.  If the RH
10f00 53 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c  S contains a NUL
10f10 4c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  L then.      ** 
10f20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75  jump to destIfNu
10f30 6c 6c 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  ll.  If there ar
10f40 65 20 6e 6f 20 4e 55 4c 4c 73 20 69 6e 20 74 68  e no NULLs in th
10f50 65 20 52 48 53 20 74 68 65 6e 0a 20 20 20 20 20  e RHS then.     
10f60 20 2a 2a 20 6a 75 6d 70 20 74 6f 20 64 65 73 74   ** jump to dest
10f70 49 66 46 61 6c 73 65 2e 0a 20 20 20 20 20 20 2a  IfFalse..      *
10f80 2f 0a 20 20 20 20 20 20 6a 32 20 3d 20 73 71 6c  /.      j2 = sql
10f90 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
10fa0 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 52  , OP_NotNull, rR
10fb0 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20  hsHasNull);.    
10fc0 20 20 6a 33 20 3d 20 73 71 6c 69 74 65 33 56 64    j3 = sqlite3Vd
10fd0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
10fe0 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  P_Found, pExpr->
10ff0 69 54 61 62 6c 65 2c 20 30 2c 20 72 52 68 73 48  iTable, 0, rRhsH
11000 61 73 4e 75 6c 6c 2c 20 31 29 3b 0a 20 20 20 20  asNull, 1);.    
11010 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11020 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
11030 72 2c 20 2d 31 2c 20 72 52 68 73 48 61 73 4e 75  r, -1, rRhsHasNu
11040 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
11050 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
11060 2c 20 6a 33 29 3b 0a 20 20 20 20 20 20 73 71 6c  , j3);.      sql
11070 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11080 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 72 52 68  , OP_AddImm, rRh
11090 73 48 61 73 4e 75 6c 6c 2c 20 31 29 3b 0a 20 20  sHasNull, 1);.  
110a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
110b0 75 6d 70 48 65 72 65 28 76 2c 20 6a 32 29 3b 0a  umpHere(v, j2);.
110c0 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74  .      /* Jump t
110d0 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  o the appropriat
110e0 65 20 74 61 72 67 65 74 20 64 65 70 65 6e 64 69  e target dependi
110f0 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
11100 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 74 68   not.      ** th
11110 65 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 61  e RHS contains a
11120 20 4e 55 4c 4c 0a 20 20 20 20 20 20 2a 2f 0a 20   NULL.      */. 
11130 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11140 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
11150 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 64 65   rRhsHasNull, de
11160 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
11170 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11180 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
11190 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
111a0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 50  .      /* The OP
111b0 5f 46 6f 75 6e 64 20 61 74 20 74 68 65 20 74 6f  _Found at the to
111c0 70 20 6f 66 20 74 68 69 73 20 62 72 61 6e 63 68  p of this branch
111d0 20 6a 75 6d 70 73 20 68 65 72 65 20 77 68 65 6e   jumps here when
111e0 20 74 72 75 65 2c 20 0a 20 20 20 20 20 20 2a 2a   true, .      **
111f0 20 63 61 75 73 69 6e 67 20 74 68 65 20 6f 76 65   causing the ove
11200 72 61 6c 6c 20 49 4e 20 65 78 70 72 65 73 73 69  rall IN expressi
11210 6f 6e 20 65 76 61 6c 75 61 74 69 6f 6e 20 74 6f  on evaluation to
11220 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 20   fall through.. 
11230 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
11240 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
11250 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 7d 0a  e(v, j1);.    }.
11260 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
11270 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
11280 73 65 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74  se, r1);.  sqlit
11290 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
112a0 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 56 64 62  Parse, 1);.  Vdb
112b0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e  eComment((v, "en
112c0 64 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 7d 0a  d IN expr"));.}.
112d0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
112e0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
112f0 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75 70 6c 69 63 61  /../*.** Duplica
11300 74 65 20 61 6e 20 38 2d 62 79 74 65 20 76 61 6c  te an 8-byte val
11310 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  ue.*/.static cha
11320 72 20 2a 64 75 70 38 62 79 74 65 73 28 56 64 62  r *dup8bytes(Vdb
11330 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *v, const char
11340 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 6f   *in){.  char *o
11350 75 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ut = sqlite3DbMa
11360 6c 6c 6f 63 52 61 77 28 73 71 6c 69 74 65 33 56  llocRaw(sqlite3V
11370 64 62 65 44 62 28 76 29 2c 20 38 29 3b 0a 20 20  dbeDb(v), 8);.  
11380 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 6d  if( out ){.    m
11390 65 6d 63 70 79 28 6f 75 74 2c 20 69 6e 2c 20 38  emcpy(out, in, 8
113a0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
113b0 6f 75 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  out;.}..#ifndef 
113c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
113d0 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a  TING_POINT./*.**
113e0 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73   Generate an ins
113f0 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69  truction that wi
11400 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74  ll put the float
11410 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c  ing point.** val
11420 75 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20  ue described by 
11430 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72  z[0..n-1] into r
11440 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a  egister iMem..**
11450 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69  .** The z[] stri
11460 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79  ng will probably
11470 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72   not be zero-ter
11480 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68  minated.  But th
11490 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61  e .** z[n] chara
114a0 63 74 65 72 20 69 73 20 67 75 61 72 61 6e 74 65  cter is guarante
114b0 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69  ed to be somethi
114c0 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ng that does not
114d0 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68   look.** like th
114e0 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f  e continuation o
114f0 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f  f the number..*/
11500 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
11510 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63  eReal(Vdbe *v, c
11520 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
11530 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20 69 6e  t negateFlag, in
11540 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41  t iMem){.  if( A
11550 4c 57 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20  LWAYS(z!=0) ){. 
11560 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b     double value;
11570 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20  .    char *zV;. 
11580 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a     sqlite3AtoF(z
11590 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65  , &value, sqlite
115a0 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51  3Strlen30(z), SQ
115b0 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
115c0 61 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33  assert( !sqlite3
115d0 49 73 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b 20  IsNaN(value) ); 
115e0 2f 2a 20 54 68 65 20 6e 65 77 20 41 74 6f 46 20  /* The new AtoF 
115f0 6e 65 76 65 72 20 72 65 74 75 72 6e 73 20 4e 61  never returns Na
11600 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 67  N */.    if( neg
11610 61 74 65 46 6c 61 67 20 29 20 76 61 6c 75 65 20  ateFlag ) value 
11620 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 7a 56  = -value;.    zV
11630 20 3d 20 64 75 70 38 62 79 74 65 73 28 76 2c 20   = dup8bytes(v, 
11640 28 63 68 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a  (char*)&value);.
11650 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11660 64 64 4f 70 34 28 76 2c 20 4f 50 5f 52 65 61 6c  ddOp4(v, OP_Real
11670 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56  , 0, iMem, 0, zV
11680 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a  , P4_REAL);.  }.
11690 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
116a0 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73   Generate an ins
116b0 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69  truction that wi
116c0 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65 67  ll put the integ
116d0 65 72 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a  er describe by.*
116e0 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d  * text z[0..n-1]
116f0 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69   into register i
11700 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e  Mem..**.** Expr.
11710 75 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61  u.zToken is alwa
11720 79 73 20 55 54 46 38 20 61 6e 64 20 7a 65 72 6f  ys UTF8 and zero
11730 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a  -terminated..*/.
11740 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
11750 49 6e 74 65 67 65 72 28 50 61 72 73 65 20 2a 70  Integer(Parse *p
11760 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
11770 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c  pr, int negFlag,
11780 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64   int iMem){.  Vd
11790 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
117a0 70 56 64 62 65 3b 0a 20 20 69 66 28 20 70 45 78  pVdbe;.  if( pEx
117b0 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49  pr->flags & EP_I
117c0 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69  ntValue ){.    i
117d0 6e 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e  nt i = pExpr->u.
117e0 69 56 61 6c 75 65 3b 0a 20 20 20 20 61 73 73 65  iValue;.    asse
117f0 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20  rt( i>=0 );.    
11800 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20  if( negFlag ) i 
11810 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -i;.    sqlite
11820 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11830 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d  P_Integer, i, iM
11840 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  em);.  }else{.  
11850 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 36 34    int c;.    i64
11860 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73   value;.    cons
11870 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70  t char *z = pExp
11880 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
11890 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b   assert( z!=0 );
118a0 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33  .    c = sqlite3
118b0 41 74 6f 69 36 34 28 7a 2c 20 26 76 61 6c 75 65  Atoi64(z, &value
118c0 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
118d0 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46  0(z), SQLITE_UTF
118e0 38 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 30  8);.    if( c==0
118f0 20 7c 7c 20 28 63 3d 3d 32 20 26 26 20 6e 65 67   || (c==2 && neg
11900 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 20 20 63  Flag) ){.      c
11910 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20 20 20 69  har *zV;.      i
11920 66 28 20 6e 65 67 46 6c 61 67 20 29 7b 20 76 61  f( negFlag ){ va
11930 6c 75 65 20 3d 20 63 3d 3d 32 20 3f 20 53 4d 41  lue = c==2 ? SMA
11940 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20 2d 76  LLEST_INT64 : -v
11950 61 6c 75 65 3b 20 7d 0a 20 20 20 20 20 20 7a 56  alue; }.      zV
11960 20 3d 20 64 75 70 38 62 79 74 65 73 28 76 2c 20   = dup8bytes(v, 
11970 28 63 68 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a  (char*)&value);.
11980 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11990 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49 6e  eAddOp4(v, OP_In
119a0 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c  t64, 0, iMem, 0,
119b0 20 7a 56 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a   zV, P4_INT64);.
119c0 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65      }else{.#ifde
119d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
119e0 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
119f0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
11a00 73 67 28 70 50 61 72 73 65 2c 20 22 6f 76 65 72  sg(pParse, "over
11a10 73 69 7a 65 64 20 69 6e 74 65 67 65 72 3a 20 25  sized integer: %
11a20 73 25 73 22 2c 20 6e 65 67 46 6c 61 67 20 3f 20  s%s", negFlag ? 
11a30 22 2d 22 20 3a 20 22 22 2c 20 7a 29 3b 0a 23 65  "-" : "", z);.#e
11a40 6c 73 65 0a 20 20 20 20 20 20 63 6f 64 65 52 65  lse.      codeRe
11a50 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67  al(v, z, negFlag
11a60 2c 20 69 4d 65 6d 29 3b 0a 23 65 6e 64 69 66 0a  , iMem);.#endif.
11a70 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
11a80 2a 2a 20 43 6c 65 61 72 20 61 20 63 61 63 68 65  ** Clear a cache
11a90 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69   entry..*/.stati
11aa0 63 20 76 6f 69 64 20 63 61 63 68 65 45 6e 74 72  c void cacheEntr
11ab0 79 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50  yClear(Parse *pP
11ac0 61 72 73 65 2c 20 73 74 72 75 63 74 20 79 43 6f  arse, struct yCo
11ad0 6c 43 61 63 68 65 20 2a 70 29 7b 0a 20 20 69 66  lCache *p){.  if
11ae0 28 20 70 2d 3e 74 65 6d 70 52 65 67 20 29 7b 0a  ( p->tempReg ){.
11af0 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
11b00 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69  nTempReg<ArraySi
11b10 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  ze(pParse->aTemp
11b20 52 65 67 29 20 29 7b 0a 20 20 20 20 20 20 70 50  Reg) ){.      pP
11b30 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70  arse->aTempReg[p
11b40 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b  Parse->nTempReg+
11b50 2b 5d 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20  +] = p->iReg;.  
11b60 20 20 7d 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52    }.    p->tempR
11b70 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a  eg = 0;.  }.}...
11b80 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 69 6e 20  /*.** Record in 
11b90 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
11ba0 20 74 68 61 74 20 61 20 70 61 72 74 69 63 75 6c   that a particul
11bb0 61 72 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61  ar column from a
11bc0 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 20 74  .** particular t
11bd0 61 62 6c 65 20 69 73 20 73 74 6f 72 65 64 20 69  able is stored i
11be0 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 72  n a particular r
11bf0 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64  egister..*/.void
11c00 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
11c10 65 53 74 6f 72 65 28 50 61 72 73 65 20 2a 70 50  eStore(Parse *pP
11c20 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 2c 20  arse, int iTab, 
11c30 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20 69 52  int iCol, int iR
11c40 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  eg){.  int i;.  
11c50 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e  int minLru;.  in
11c60 74 20 69 64 78 4c 72 75 3b 0a 20 20 73 74 72 75  t idxLru;.  stru
11c70 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
11c80 0a 0a 20 20 61 73 73 65 72 74 28 20 69 52 65 67  ..  assert( iReg
11c90 3e 30 20 29 3b 20 20 2f 2a 20 52 65 67 69 73 74  >0 );  /* Regist
11ca0 65 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  er numbers are a
11cb0 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65 20 2a  lways positive *
11cc0 2f 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c  /.  assert( iCol
11cd0 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33 32 37  >=-1 && iCol<327
11ce0 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69 74 65  68 );  /* Finite
11cf0 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20   column numbers 
11d00 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c  */..  /* The SQL
11d10 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20  ITE_ColumnCache 
11d20 66 6c 61 67 20 64 69 73 61 62 6c 65 73 20 74 68  flag disables th
11d30 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 20  e column cache. 
11d40 20 54 68 69 73 20 69 73 20 75 73 65 64 0a 20 20   This is used.  
11d50 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 6f  ** for testing o
11d60 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69 66 79 20  nly - to verify 
11d70 74 68 61 74 20 53 51 4c 69 74 65 20 61 6c 77 61  that SQLite alwa
11d80 79 73 20 67 65 74 73 20 74 68 65 20 73 61 6d 65  ys gets the same
11d90 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20 77 69 74   answer.  ** wit
11da0 68 20 61 6e 64 20 77 69 74 68 6f 75 74 20 74 68  h and without th
11db0 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
11dc0 20 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d    */.  if( Optim
11dd0 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
11de0 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49  pParse->db, SQLI
11df0 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 29 20  TE_ColumnCache) 
11e00 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
11e10 46 69 72 73 74 20 72 65 70 6c 61 63 65 20 61 6e  First replace an
11e20 79 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  y existing entry
11e30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75  ..  **.  ** Actu
11e40 61 6c 6c 79 2c 20 74 68 65 20 77 61 79 20 74 68  ally, the way th
11e50 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 69  e column cache i
11e60 73 20 63 75 72 72 65 6e 74 6c 79 20 75 73 65 64  s currently used
11e70 2c 20 77 65 20 61 72 65 20 67 75 61 72 61 6e 74  , we are guarant
11e80 65 65 64 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  eed.  ** that th
11e90 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 6e 65  e object will ne
11ea0 76 65 72 20 61 6c 72 65 61 64 79 20 62 65 20 69  ver already be i
11eb0 6e 20 63 61 63 68 65 2e 20 20 56 65 72 69 66 79  n cache.  Verify
11ec0 20 74 68 69 73 20 67 75 61 72 61 6e 74 65 65 2e   this guarantee.
11ed0 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  .  */.#ifndef ND
11ee0 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 2c 20  EBUG.  for(i=0, 
11ef0 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
11f00 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
11f10 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
11f20 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
11f30 20 70 2d 3e 69 52 65 67 3d 3d 30 20 7c 7c 20 70   p->iReg==0 || p
11f40 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c  ->iTable!=iTab |
11f50 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43  | p->iColumn!=iC
11f60 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ol );.  }.#endif
11f70 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 6e 20 65  ..  /* Find an e
11f80 6d 70 74 79 20 73 6c 6f 74 20 61 6e 64 20 72 65  mpty slot and re
11f90 70 6c 61 63 65 20 69 74 20 2a 2f 0a 20 20 66 6f  place it */.  fo
11fa0 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
11fb0 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
11fc0 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
11fd0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
11fe0 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20 29  if( p->iReg==0 )
11ff0 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 65 76 65  {.      p->iLeve
12000 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
12010 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20 70  heLevel;.      p
12020 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b  ->iTable = iTab;
12030 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d  .      p->iColum
12040 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  n = iCol;.      
12050 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a  p->iReg = iReg;.
12060 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67        p->tempReg
12070 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6c   = 0;.      p->l
12080 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  ru = pParse->iCa
12090 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  cheCnt++;.      
120a0 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
120b0 7d 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20  }..  /* Replace 
120c0 74 68 65 20 6c 61 73 74 20 72 65 63 65 6e 74 6c  the last recentl
120d0 79 20 75 73 65 64 20 2a 2f 0a 20 20 6d 69 6e 4c  y used */.  minL
120e0 72 75 20 3d 20 30 78 37 66 66 66 66 66 66 66 3b  ru = 0x7fffffff;
120f0 0a 20 20 69 64 78 4c 72 75 20 3d 20 2d 31 3b 0a  .  idxLru = -1;.
12100 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
12110 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
12120 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
12130 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
12140 20 20 20 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d      if( p->lru<m
12150 69 6e 4c 72 75 20 29 7b 0a 20 20 20 20 20 20 69  inLru ){.      i
12160 64 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20 20  dxLru = i;.     
12170 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75   minLru = p->lru
12180 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
12190 28 20 41 4c 57 41 59 53 28 69 64 78 4c 72 75 3e  ( ALWAYS(idxLru>
121a0 3d 30 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 26  =0) ){.    p = &
121b0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
121c0 65 5b 69 64 78 4c 72 75 5d 3b 0a 20 20 20 20 70  e[idxLru];.    p
121d0 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73  ->iLevel = pPars
121e0 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a  e->iCacheLevel;.
121f0 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20      p->iTable = 
12200 69 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69 43 6f  iTab;.    p->iCo
12210 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  lumn = iCol;.   
12220 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b   p->iReg = iReg;
12230 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20  .    p->tempReg 
12240 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 72 75 20  = 0;.    p->lru 
12250 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
12260 43 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Cnt++;.    retur
12270 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n;.  }.}../*.** 
12280 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 72 65  Indicate that re
12290 67 69 73 74 65 72 73 20 62 65 74 77 65 65 6e 20  gisters between 
122a0 69 52 65 67 2e 2e 69 52 65 67 2b 6e 52 65 67 2d  iReg..iReg+nReg-
122b0 31 20 61 72 65 20 62 65 69 6e 67 20 6f 76 65 72  1 are being over
122c0 77 72 69 74 74 65 6e 2e 0a 2a 2a 20 50 75 72 67  written..** Purg
122d0 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 72  e the range of r
122e0 65 67 69 73 74 65 72 73 20 66 72 6f 6d 20 74 68  egisters from th
122f0 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
12300 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
12310 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 50  xprCacheRemove(P
12320 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
12330 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67  t iReg, int nReg
12340 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
12350 74 20 69 4c 61 73 74 20 3d 20 69 52 65 67 20 2b  t iLast = iReg +
12360 20 6e 52 65 67 20 2d 20 31 3b 0a 20 20 73 74 72   nReg - 1;.  str
12370 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
12380 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ;.  for(i=0, p=p
12390 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
123a0 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
123b0 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
123c0 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d  {.    int r = p-
123d0 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72  >iReg;.    if( r
123e0 3e 3d 69 52 65 67 20 26 26 20 72 3c 3d 69 4c 61  >=iReg && r<=iLa
123f0 73 74 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68  st ){.      cach
12400 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72  eEntryClear(pPar
12410 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d  se, p);.      p-
12420 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  >iReg = 0;.    }
12430 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
12440 6d 65 6d 62 65 72 20 74 68 65 20 63 75 72 72 65  member the curre
12450 6e 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  nt column cache 
12460 63 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20 6e 65  context.  Any ne
12470 77 20 65 6e 74 72 69 65 73 20 61 64 64 65 64 0a  w entries added.
12480 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ** added to the 
12490 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 66 74  column cache aft
124a0 65 72 20 74 68 69 73 20 63 61 6c 6c 20 61 72 65  er this call are
124b0 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 20 74 68   removed when th
124c0 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
124d0 6e 67 20 70 6f 70 20 6f 63 63 75 72 73 2e 0a 2a  ng pop occurs..*
124e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
124f0 70 72 43 61 63 68 65 50 75 73 68 28 50 61 72 73  prCachePush(Pars
12500 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50  e *pParse){.  pP
12510 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
12520 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  l++;.}../*.** Re
12530 6d 6f 76 65 20 66 72 6f 6d 20 74 68 65 20 63 6f  move from the co
12540 6c 75 6d 6e 20 63 61 63 68 65 20 61 6e 79 20 65  lumn cache any e
12550 6e 74 72 69 65 73 20 74 68 61 74 20 77 65 72 65  ntries that were
12560 20 61 64 64 65 64 20 73 69 6e 63 65 20 74 68 65   added since the
12570 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73  .** the previous
12580 20 4e 20 50 75 73 68 20 6f 70 65 72 61 74 69 6f   N Push operatio
12590 6e 73 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ns.  In other wo
125a0 72 64 73 2c 20 72 65 73 74 6f 72 65 20 74 68 65  rds, restore the
125b0 20 63 61 63 68 65 0a 2a 2a 20 74 6f 20 74 68 65   cache.** to the
125c0 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
125d0 20 4e 20 50 75 73 68 65 73 20 61 67 6f 2e 0a 2a   N Pushes ago..*
125e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
125f0 70 72 43 61 63 68 65 50 6f 70 28 50 61 72 73 65  prCachePop(Parse
12600 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 4e 29   *pParse, int N)
12610 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
12620 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
12630 3b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 30 20  ;.  assert( N>0 
12640 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
12650 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
12660 3e 3d 4e 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  >=N );.  pParse-
12670 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 2d 3d 20  >iCacheLevel -= 
12680 4e 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  N;.  for(i=0, p=
12690 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
126a0 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
126b0 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
126c0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
126d0 65 67 20 26 26 20 70 2d 3e 69 4c 65 76 65 6c 3e  eg && p->iLevel>
126e0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
126f0 76 65 6c 20 29 7b 0a 20 20 20 20 20 20 63 61 63  vel ){.      cac
12700 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61  heEntryClear(pPa
12710 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70  rse, p);.      p
12720 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  ->iReg = 0;.    
12730 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  }.  }.}../*.** W
12740 68 65 6e 20 61 20 63 61 63 68 65 64 20 63 6f 6c  hen a cached col
12750 75 6d 6e 20 69 73 20 72 65 75 73 65 64 2c 20 6d  umn is reused, m
12760 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 69 74  ake sure that it
12770 73 20 72 65 67 69 73 74 65 72 20 69 73 0a 2a 2a  s register is.**
12780 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c   no longer avail
12790 61 62 6c 65 20 61 73 20 61 20 74 65 6d 70 20 72  able as a temp r
127a0 65 67 69 73 74 65 72 2e 20 20 74 69 63 6b 65 74  egister.  ticket
127b0 20 23 33 38 37 39 3a 20 20 74 68 61 74 20 73 61   #3879:  that sa
127c0 6d 65 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 6d  me.** register m
127d0 69 67 68 74 20 62 65 20 69 6e 20 74 68 65 20 63  ight be in the c
127e0 61 63 68 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65  ache in multiple
127f0 20 70 6c 61 63 65 73 2c 20 73 6f 20 62 65 20 73   places, so be s
12800 75 72 65 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68  ure to.** get th
12810 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  em all..*/.stati
12820 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  c void sqlite3Ex
12830 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74  prCachePinRegist
12840 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  er(Parse *pParse
12850 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69  , int iReg){.  i
12860 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
12870 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66  ColCache *p;.  f
12880 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
12890 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
128a0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
128b0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
128c0 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52   if( p->iReg==iR
128d0 65 67 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74  eg ){.      p->t
128e0 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  empReg = 0;.    
128f0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
12900 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
12910 65 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  extract the valu
12920 65 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68  e of the iCol-th
12930 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62   column of a tab
12940 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
12950 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
12960 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56  lumnOfTable(.  V
12970 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 2f  dbe *v,        /
12980 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64 65 72  * The VDBE under
12990 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
129a0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
129b0 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
129c0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76  containing the v
129d0 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  alue */.  int iT
129e0 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 54 68 65  abCur,    /* The
129f0 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 20   table cursor.  
12a00 4f 72 20 74 68 65 20 50 4b 20 63 75 72 73 6f 72  Or the PK cursor
12a10 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57   for WITHOUT ROW
12a20 49 44 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  ID */.  int iCol
12a30 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  ,       /* Index
12a40 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74   of the column t
12a50 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a 20 20 69  o extract */.  i
12a60 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f  nt regOut      /
12a70 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61  * Extract the va
12a80 6c 75 65 20 69 6e 74 6f 20 74 68 69 73 20 72 65  lue into this re
12a90 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  gister */.){.  i
12aa0 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f  f( iCol<0 || iCo
12ab0 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  l==pTab->iPKey )
12ac0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
12ad0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
12ae0 77 69 64 2c 20 69 54 61 62 43 75 72 2c 20 72 65  wid, iTabCur, re
12af0 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gOut);.  }else{.
12b00 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56      int op = IsV
12b10 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f  irtual(pTab) ? O
12b20 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43  P_VColumn : OP_C
12b30 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78  olumn;.    int x
12b40 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28   = iCol;.    if(
12b50 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
12b60 20 29 7b 0a 20 20 20 20 20 20 78 20 3d 20 73 71   ){.      x = sq
12b70 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64  lite3ColumnOfInd
12b80 65 78 28 73 71 6c 69 74 65 33 50 72 69 6d 61 72  ex(sqlite3Primar
12b90 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 2c  yKeyIndex(pTab),
12ba0 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   iCol);.    }.  
12bb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12bc0 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 43  Op3(v, op, iTabC
12bd0 75 72 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a  ur, x, regOut);.
12be0 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d    }.  if( iCol>=
12bf0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
12c00 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c  ColumnDefault(v,
12c10 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67   pTab, iCol, reg
12c20 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Out);.  }.}../*.
12c30 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
12c40 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61   that will extra
12c50 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  ct the iColumn-t
12c60 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a  h column from.**
12c70 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20   table pTab and 
12c80 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e  store the column
12c90 20 76 61 6c 75 65 20 69 6e 20 61 20 72 65 67 69   value in a regi
12ca0 73 74 65 72 2e 20 20 41 6e 20 65 66 66 6f 72 74  ster.  An effort
12cb0 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 73  .** is made to s
12cc0 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  tore the column 
12cd0 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
12ce0 72 20 69 52 65 67 2c 20 62 75 74 20 74 68 69 73  r iReg, but this
12cf0 20 69 73 0a 2a 2a 20 6e 6f 74 20 67 75 61 72 61   is.** not guara
12d00 6e 74 65 65 64 2e 20 20 54 68 65 20 6c 6f 63 61  nteed.  The loca
12d10 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c 75  tion of the colu
12d20 6d 6e 20 76 61 6c 75 65 20 69 73 20 72 65 74 75  mn value is retu
12d30 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  rned..**.** Ther
12d40 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65  e must be an ope
12d50 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62  n cursor to pTab
12d60 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20   in iTable when 
12d70 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
12d80 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69  is called.  If i
12d90 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f  Column<0 then co
12da0 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
12db0 74 68 61 74 20 65 78 74 72 61 63 74 73 20 74 68  that extracts th
12dc0 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20  e rowid..*/.int 
12dd0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
12de0 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73  etColumn(.  Pars
12df0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
12e00 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
12e10 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
12e20 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
12e30 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73  pTab,     /* Des
12e40 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
12e50 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61  table we are rea
12e60 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  ding from */.  i
12e70 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
12e80 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
12e90 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  table column */.
12ea0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
12eb0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
12ec0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
12ed0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
12ee0 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  iReg,        /* 
12ef0 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65  Store results he
12f00 72 65 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20  re */.  u8 p5   
12f10 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20 76           /* P5 v
12f20 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75  alue for OP_Colu
12f30 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  mn */.){.  Vdbe 
12f40 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
12f50 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
12f60 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
12f70 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20  *p;..  for(i=0, 
12f80 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
12f90 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
12fa0 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
12fb0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
12fc0 69 52 65 67 3e 30 20 26 26 20 70 2d 3e 69 54 61  iReg>0 && p->iTa
12fd0 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
12fe0 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  ->iColumn==iColu
12ff0 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c  mn ){.      p->l
13000 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  ru = pParse->iCa
13010 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  cheCnt++;.      
13020 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
13030 50 69 6e 52 65 67 69 73 74 65 72 28 70 50 61 72  PinRegister(pPar
13040 73 65 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20  se, p->iReg);.  
13050 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 52      return p->iR
13060 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a  eg;.    }.  }  .
13070 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
13080 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
13090 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61  odeGetColumnOfTa
130a0 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61  ble(v, pTab, iTa
130b0 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52  ble, iColumn, iR
130c0 65 67 29 3b 0a 20 20 69 66 28 20 70 35 20 29 7b  eg);.  if( p5 ){
130d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
130e0 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35 29 3b  ChangeP5(v, p5);
130f0 0a 20 20 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20  .  }else{   .   
13100 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
13110 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
13120 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20  Table, iColumn, 
13130 69 52 65 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  iReg);.  }.  ret
13140 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a  urn iReg;.}../*.
13150 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c  ** Clear all col
13160 75 6d 6e 20 63 61 63 68 65 20 65 6e 74 72 69 65  umn cache entrie
13170 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
13180 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
13190 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
131a0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
131b0 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
131c0 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ..  for(i=0, p=p
131d0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
131e0 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
131f0 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
13200 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
13210 67 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65  g ){.      cache
13220 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73  EntryClear(pPars
13230 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e  e, p);.      p->
13240 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  iReg = 0;.    }.
13250 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63    }.}../*.** Rec
13260 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
13270 74 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68  t an affinity ch
13280 61 6e 67 65 20 68 61 73 20 6f 63 63 75 72 72 65  ange has occurre
13290 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72  d on iCount.** r
132a0 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
132b0 67 20 77 69 74 68 20 69 53 74 61 72 74 2e 0a 2a  g with iStart..*
132c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
132d0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
132e0 68 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  hange(Parse *pPa
132f0 72 73 65 2c 20 69 6e 74 20 69 53 74 61 72 74 2c  rse, int iStart,
13300 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20   int iCount){.  
13310 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
13320 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69  Remove(pParse, i
13330 53 74 61 72 74 2c 20 69 43 6f 75 6e 74 29 3b 0a  Start, iCount);.
13340 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
13350 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63  e code to move c
13360 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69  ontent from regi
13370 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46  sters iFrom...iF
13380 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76  rom+nReg-1.** ov
13390 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e  er to iTo..iTo+n
133a0 52 65 67 2d 31 2e 20 4b 65 65 70 20 74 68 65 20  Reg-1. Keep the 
133b0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 75 70 2d  column cache up-
133c0 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64  to-date..*/.void
133d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
133e0 4d 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72  Move(Parse *pPar
133f0 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  se, int iFrom, i
13400 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67  nt iTo, int nReg
13410 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
13420 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
13430 70 3b 0a 20 20 61 73 73 65 72 74 28 20 69 46 72  p;.  assert( iFr
13440 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20  om>=iTo+nReg || 
13450 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20  iFrom+nReg<=iTo 
13460 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
13470 41 64 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70  AddOp3(pParse->p
13480 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69  Vdbe, OP_Move, i
13490 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 2d  From, iTo, nReg-
134a0 31 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  1);.  for(i=0, p
134b0 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
134c0 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
134d0 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
134e0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20  +){.    int x = 
134f0 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28  p->iReg;.    if(
13500 20 78 3e 3d 69 46 72 6f 6d 20 26 26 20 78 3c 69   x>=iFrom && x<i
13510 46 72 6f 6d 2b 6e 52 65 67 20 29 7b 0a 20 20 20  From+nReg ){.   
13520 20 20 20 70 2d 3e 69 52 65 67 20 2b 3d 20 69 54     p->iReg += iT
13530 6f 2d 69 46 72 6f 6d 3b 0a 20 20 20 20 7d 0a 20  o-iFrom;.    }. 
13540 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65   }.}..#if define
13550 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
13560 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
13570 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 29  E_COVERAGE_TEST)
13580 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
13590 75 65 20 69 66 20 61 6e 79 20 72 65 67 69 73 74  ue if any regist
135a0 65 72 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20  er in the range 
135b0 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c  iFrom..iTo (incl
135c0 75 73 69 76 65 29 0a 2a 2a 20 69 73 20 75 73 65  usive).** is use
135d0 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
135e0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a   column cache..*
135f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13600 65 20 69 73 20 75 73 65 64 20 77 69 74 68 69 6e  e is used within
13610 20 61 73 73 65 72 74 28 29 20 61 6e 64 20 74 65   assert() and te
13620 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 73 20  stcase() macros 
13630 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f 65 73  only.** and does
13640 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20 61   not appear in a
13650 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e 0a 2a   normal build..*
13660 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73 65  /.static int use
13670 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50  dAsColumnCache(P
13680 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
13690 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
136a0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
136b0 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
136c0 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  p;.  for(i=0, p=
136d0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
136e0 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
136f0 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
13700 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70  ){.    int r = p
13710 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20  ->iReg;.    if( 
13720 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69  r>=iFrom && r<=i
13730 54 6f 20 29 20 72 65 74 75 72 6e 20 31 3b 20 20  To ) return 1;  
13740 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20    /*NO_TEST*/.  
13750 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
13760 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
13770 5f 44 45 42 55 47 20 7c 7c 20 53 51 4c 49 54 45  _DEBUG || SQLITE
13780 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 20 2a  _COVERAGE_TEST *
13790 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  /../*.** Convert
137a0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6e   an expression n
137b0 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52 45 47 49  ode to a TK_REGI
137c0 53 54 45 52 0a 2a 2f 0a 73 74 61 74 69 63 20 76  STER.*/.static v
137d0 6f 69 64 20 65 78 70 72 54 6f 52 65 67 69 73 74  oid exprToRegist
137e0 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  er(Expr *p, int 
137f0 69 52 65 67 29 7b 0a 20 20 70 2d 3e 6f 70 32 20  iReg){.  p->op2 
13800 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f 70  = p->op;.  p->op
13810 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a   = TK_REGISTER;.
13820 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 52    p->iTable = iR
13830 65 67 3b 0a 20 20 45 78 70 72 43 6c 65 61 72 50  eg;.  ExprClearP
13840 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53 6b  roperty(p, EP_Sk
13850 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ip);.}../*.** Ge
13860 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
13870 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62   the current Vdb
13880 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
13890 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65  e given.** expre
138a0 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20  ssion.  Attempt 
138b0 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  to store the res
138c0 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72  ults in register
138d0 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65   "target"..** Re
138e0 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65  turn the registe
138f0 72 20 77 68 65 72 65 20 72 65 73 75 6c 74 73 20  r where results 
13900 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a  are stored..**.*
13910 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f 75 74  * With this rout
13920 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ine, there is no
13930 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
13940 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20  results will.** 
13950 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72  be stored in tar
13960 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74  get.  The result
13970 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65 64   might be stored
13980 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a   in some other.*
13990 2a 20 72 65 67 69 73 74 65 72 20 69 66 20 69 74  * register if it
139a0 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74   is convenient t
139b0 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61  o do so.  The ca
139c0 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
139d0 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65  * must check the
139e0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64   return code and
139f0 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74   move the result
13a00 73 20 74 6f 20 74 68 65 20 64 65 73 69 72 65 64  s to the desired
13a10 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f  .** register..*/
13a20 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
13a30 43 6f 64 65 54 61 72 67 65 74 28 50 61 72 73 65  CodeTarget(Parse
13a40 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
13a50 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
13a60 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  t){.  Vdbe *v = 
13a70 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
13a80 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20  /* The VM under 
13a90 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
13aa0 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
13ab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13ac0 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20  he opcode being 
13ad0 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  coded */.  int i
13ae0 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20  nReg = target;  
13af0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20       /* Results 
13b00 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74  stored in regist
13b10 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e  er inReg */.  in
13b20 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20  t regFree1 = 0; 
13b30 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
13b40 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73  n-zero free this
13b50 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
13b60 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
13b70 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20  Free2 = 0;      
13b80 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
13b90 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70  o free this temp
13ba0 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a  orary register *
13bb0 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20  /.  int r1, r2, 
13bc0 72 33 2c 20 72 34 3b 20 20 20 20 20 20 20 2f 2a  r3, r4;       /*
13bd0 20 56 61 72 69 6f 75 73 20 72 65 67 69 73 74 65   Various registe
13be0 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 73  r numbers */.  s
13bf0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
13c00 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20  rse->db; /* The 
13c10 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
13c20 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 74 65  ion */.  Expr te
13c30 6d 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  mpX;            
13c40 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
13c50 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
13c60 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  */..  assert( ta
13c70 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74  rget>0 && target
13c80 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  <=pParse->nMem )
13c90 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
13ca0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
13cb0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
13cc0 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75  iled );.    retu
13cd0 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  rn 0;.  }..  if(
13ce0 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20   pExpr==0 ){.   
13cf0 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20   op = TK_NULL;. 
13d00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d   }else{.    op =
13d10 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a   pExpr->op;.  }.
13d20 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
13d30 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
13d40 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
13d50 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
13d60 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49  o = pExpr->pAggI
13d70 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63  nfo;.      struc
13d80 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
13d90 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  Col = &pAggInfo-
13da0 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67  >aCol[pExpr->iAg
13db0 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  g];.      if( !p
13dc0 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
13dd0 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ode ){.        a
13de0 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65  ssert( pCol->iMe
13df0 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  m>0 );.        i
13e00 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65  nReg = pCol->iMe
13e10 6d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  m;.        break
13e20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
13e30 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53  ( pAggInfo->useS
13e40 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20  ortingIdx ){.   
13e50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13e60 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
13e70 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73  umn, pAggInfo->s
13e80 6f 72 74 69 6e 67 49 64 78 50 54 61 62 2c 0a 20  ortingIdxPTab,. 
13e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
13eb0 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
13ec0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
13ed0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
13ee0 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72  }.      /* Other
13ef0 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20  wise, fall thru 
13f00 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55  into the TK_COLU
13f10 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  MN case */.    }
13f20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
13f30 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  UMN: {.      int
13f40 20 69 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 69   iTab = pExpr->i
13f50 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 69 66 28  Table;.      if(
13f60 20 69 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20   iTab<0 ){.     
13f70 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63     if( pParse->c
13f80 6b 42 61 73 65 3e 30 20 29 7b 0a 20 20 20 20 20  kBase>0 ){.     
13f90 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 69       /* Generati
13fa0 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ng CHECK constra
13fb0 69 6e 74 73 20 6f 72 20 69 6e 73 65 72 74 69 6e  ints or insertin
13fc0 67 20 69 6e 74 6f 20 70 61 72 74 69 61 6c 20 69  g into partial i
13fd0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
13fe0 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d    inReg = pExpr-
13ff0 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72 73  >iColumn + pPars
14000 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20 20  e->ckBase;.     
14010 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14020 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14030 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 69 6e 67       /* Deleting
14040 20 66 72 6f 6d 20 61 20 70 61 72 74 69 61 6c 20   from a partial 
14050 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20  index */.       
14060 20 20 20 69 54 61 62 20 3d 20 70 50 61 72 73 65     iTab = pParse
14070 2d 3e 69 50 61 72 74 49 64 78 54 61 62 3b 0a 20  ->iPartIdxTab;. 
14080 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14090 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
140a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
140b0 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
140c0 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20  pExpr->pTab,.   
140d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140e0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
140f0 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62  r->iColumn, iTab
14100 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20  , target,.      
14110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14120 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
14130 6f 70 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61  op2);.      brea
14140 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
14150 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  e TK_INTEGER: {.
14160 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65        codeIntege
14170 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  r(pParse, pExpr,
14180 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
14190 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
141a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
141b0 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
141c0 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  NT.    case TK_F
141d0 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  LOAT: {.      as
141e0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
141f0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
14200 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
14210 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
14220 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
14230 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
14240 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14250 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
14260 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
14270 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
14280 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
14290 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
142a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
142b0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
142c0 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 74 61 72  _String8, 0, tar
142d0 67 65 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75  get, 0, pExpr->u
142e0 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20  .zToken, 0);.   
142f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14300 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c      case TK_NULL
14310 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
14320 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14330 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
14340 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
14350 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
14360 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f  QLITE_OMIT_BLOB_
14370 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65  LITERAL.    case
14380 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20   TK_BLOB: {.    
14390 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63    int n;.      c
143a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
143b0 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b      char *zBlob;
143c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
143d0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
143e0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
143f0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ue) );.      ass
14400 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
14410 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20  oken[0]=='x' || 
14420 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
14430 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20  0]=='X' );.     
14440 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
14450 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27  u.zToken[1]=='\'
14460 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26  ' );.      z = &
14470 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
14480 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71  2];.      n = sq
14490 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
144a0 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65   - 1;.      asse
144b0 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29  rt( z[n]=='\'' )
144c0 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20  ;.      zBlob = 
144d0 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f 62  sqlite3HexToBlob
144e0 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76  (sqlite3VdbeDb(v
144f0 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  ), z, n);.      
14500 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14510 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f  4(v, OP_Blob, n/
14520 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a 42  2, target, 0, zB
14530 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  lob, P4_DYNAMIC)
14540 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14550 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
14560 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  case TK_VARIABLE
14570 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
14580 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
14590 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
145a0 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
145b0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
145c0 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20  .zToken!=0 );.  
145d0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
145e0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d  r->u.zToken[0]!=
145f0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
14600 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14610 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78  OP_Variable, pEx
14620 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72  pr->iColumn, tar
14630 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  get);.      if( 
14640 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
14650 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1]!=0 ){.       
14660 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
14670 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27  u.zToken[0]=='?'
14680 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c   .             |
14690 7c 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d 3e  | strcmp(pExpr->
146a0 75 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61 72 73 65  u.zToken, pParse
146b0 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69  ->azVar[pExpr->i
146c0 43 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30 20 29 3b  Column-1])==0 );
146d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
146e0 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
146f0 2d 31 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61  -1, pParse->azVa
14700 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  r[pExpr->iColumn
14710 2d 31 5d 2c 20 50 34 5f 53 54 41 54 49 43 29 3b  -1], P4_STATIC);
14720 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
14730 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
14740 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52  case TK_REGISTER
14750 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20  : {.      inReg 
14760 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
14770 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14780 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
14790 41 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65  AS: {.      inRe
147a0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
147b0 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
147c0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
147d0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
147e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
147f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14800 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b  CAST.    case TK
14810 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f  _CAST: {.      /
14820 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  * Expressions of
14830 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53   the form:   CAS
14840 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e  T(pLeft AS token
14850 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  ) */.      int a
14860 66 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20 20 20  ff, to_op;.     
14870 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
14880 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
14890 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
148a0 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  eft, target);.  
148b0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
148c0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
148d0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
148e0 20 29 3b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   );.      aff = 
148f0 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
14900 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  ype(pExpr->u.zTo
14910 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 74  ken, 0);.      t
14920 6f 5f 6f 70 20 3d 20 61 66 66 20 2d 20 53 51 4c  o_op = aff - SQL
14930 49 54 45 5f 41 46 46 5f 54 45 58 54 20 2b 20 4f  ITE_AFF_TEXT + O
14940 50 5f 54 6f 54 65 78 74 3b 0a 20 20 20 20 20 20  P_ToText;.      
14950 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
14960 50 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c 20 61  P_ToText    || a
14970 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ff!=SQLITE_AFF_T
14980 45 58 54 20 20 20 20 29 3b 0a 20 20 20 20 20 20  EXT    );.      
14990 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
149a0 50 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20 61  P_ToBlob    || a
149b0 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff!=SQLITE_AFF_N
149c0 4f 4e 45 20 20 20 20 29 3b 0a 20 20 20 20 20 20  ONE    );.      
149d0 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
149e0 50 5f 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20 61  P_ToNumeric || a
149f0 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff!=SQLITE_AFF_N
14a00 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 20 20  UMERIC );.      
14a10 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
14a20 50 5f 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20 61  P_ToInt     || a
14a30 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff!=SQLITE_AFF_I
14a40 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20  NTEGER );.      
14a50 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
14a60 50 5f 54 6f 52 65 61 6c 20 20 20 20 7c 7c 20 61  P_ToReal    || a
14a70 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ff!=SQLITE_AFF_R
14a80 45 41 4c 20 20 20 20 29 3b 0a 20 20 20 20 20 20  EAL    );.      
14a90 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d  testcase( to_op=
14aa0 3d 4f 50 5f 54 6f 54 65 78 74 20 29 3b 0a 20 20  =OP_ToText );.  
14ab0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f      testcase( to
14ac0 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 29  _op==OP_ToBlob )
14ad0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14ae0 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75  ( to_op==OP_ToNu
14af0 6d 65 72 69 63 20 29 3b 0a 20 20 20 20 20 20 74  meric );.      t
14b00 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d  estcase( to_op==
14b10 4f 50 5f 54 6f 49 6e 74 20 29 3b 0a 20 20 20 20  OP_ToInt );.    
14b20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f    testcase( to_o
14b30 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 29 3b 0a  p==OP_ToReal );.
14b40 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21        if( inReg!
14b50 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20  =target ){.     
14b60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14b70 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
14b80 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29  , inReg, target)
14b90 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  ;.        inReg 
14ba0 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  = target;.      
14bb0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
14bc0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 74 6f 5f  dbeAddOp1(v, to_
14bd0 6f 70 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20  op, inReg);.    
14be0 20 20 74 65 73 74 63 61 73 65 28 20 75 73 65 64    testcase( used
14bf0 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50  AsColumnCache(pP
14c00 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52  arse, inReg, inR
14c10 65 67 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  eg) );.      sql
14c20 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
14c30 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
14c40 73 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20  se, inReg, 1);. 
14c50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14c60 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
14c70 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a  TE_OMIT_CAST */.
14c80 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
14c90 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
14ca0 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
14cb0 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
14cc0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
14cd0 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
14ce0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
14cf0 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a  TK_LT==OP_Lt );.
14d00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14d10 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20  _LE==OP_Le );.  
14d20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
14d30 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20  T==OP_Gt );.    
14d40 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d    assert( TK_GE=
14d50 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Ge );.      
14d60 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f  assert( TK_EQ==O
14d70 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Eq );.      as
14d80 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f  sert( TK_NE==OP_
14d90 4e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Ne );.      test
14da0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20  case( op==TK_LT 
14db0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14dc0 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a  e( op==TK_LE );.
14dd0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14de0 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20  op==TK_GT );.   
14df0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14e00 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20  =TK_GE );.      
14e10 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
14e20 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _EQ );.      tes
14e30 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45  tcase( op==TK_NE
14e40 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
14e50 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
14e60 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
14e70 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
14e80 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
14e90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
14ea0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
14eb0 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
14ec0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
14ed0 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
14ee0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
14ef0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
14f00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14f10 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65      r1, r2, inRe
14f20 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50  g, SQLITE_STOREP
14f30 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  2);.      testca
14f40 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
14f50 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14f60 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
14f70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14f80 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
14f90 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
14fa0 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  _ISNOT: {.      
14fb0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
14fc0 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IS );.      tes
14fd0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
14fe0 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  NOT );.      r1 
14ff0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
15000 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
15010 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
15020 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
15030 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
15040 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
15050 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
15060 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
15070 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29  op = (op==TK_IS)
15080 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45   ? TK_EQ : TK_NE
15090 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
150a0 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
150b0 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
150c0 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
150d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
150e0 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51  1, r2, inReg, SQ
150f0 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 53  LITE_STOREP2 | S
15100 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
15110 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
15120 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
15130 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
15140 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
15150 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
15160 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
15170 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
15180 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55  .    case TK_PLU
15190 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
151a0 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TAR:.    case TK
151b0 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65  _MINUS:.    case
151c0 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73   TK_REM:.    cas
151d0 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20  e TK_BITAND:.   
151e0 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a   case TK_BITOR:.
151f0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53      case TK_SLAS
15200 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  H:.    case TK_L
15210 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20  SHIFT:.    case 
15220 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20  TK_RSHIFT: .    
15230 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20  case TK_CONCAT: 
15240 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
15250 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29  TK_AND==OP_And )
15260 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15270 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a  TK_OR==OP_Or );.
15280 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
15290 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b  _PLUS==OP_Add );
152a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
152b0 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74  K_MINUS==OP_Subt
152c0 72 61 63 74 20 29 3b 0a 20 20 20 20 20 20 61 73  ract );.      as
152d0 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50  sert( TK_REM==OP
152e0 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20  _Remainder );.  
152f0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
15300 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64  ITAND==OP_BitAnd
15310 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
15320 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42  ( TK_BITOR==OP_B
15330 69 74 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73  itOr );.      as
15340 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d  sert( TK_SLASH==
15350 4f 50 5f 44 69 76 69 64 65 20 29 3b 0a 20 20 20  OP_Divide );.   
15360 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53     assert( TK_LS
15370 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65  HIFT==OP_ShiftLe
15380 66 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ft );.      asse
15390 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f  rt( TK_RSHIFT==O
153a0 50 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b 0a  P_ShiftRight );.
153b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
153c0 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63  _CONCAT==OP_Conc
153d0 61 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  at );.      test
153e0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44  case( op==TK_AND
153f0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
15400 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b  se( op==TK_OR );
15410 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15420 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a   op==TK_PLUS );.
15430 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15440 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a  op==TK_MINUS );.
15450 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15460 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20  op==TK_REM );.  
15470 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
15480 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20  ==TK_BITAND );. 
15490 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
154a0 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20  p==TK_BITOR );. 
154b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
154c0 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20  p==TK_SLASH );. 
154d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
154e0 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a  p==TK_LSHIFT );.
154f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15500 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b  op==TK_RSHIFT );
15510 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15520 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29   op==TK_CONCAT )
15530 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
15540 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
15550 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
15560 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
15570 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
15580 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
15590 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
155a0 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
155b0 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e2);.      sqlit
155c0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
155d0 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67  op, r2, r1, targ
155e0 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  et);.      testc
155f0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
15600 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
15610 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
15620 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15630 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
15640 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20  K_UMINUS: {.    
15650 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
15660 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
15670 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66      assert( pLef
15680 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
15690 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  Left->op==TK_INT
156a0 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
156b0 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72  codeInteger(pPar
156c0 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61  se, pLeft, 1, ta
156d0 72 67 65 74 29 3b 0a 23 69 66 6e 64 65 66 20 53  rget);.#ifndef S
156e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
156f0 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20  ING_POINT.      
15700 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d  }else if( pLeft-
15710 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b  >op==TK_FLOAT ){
15720 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15730 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
15740 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
15750 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
15760 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c 65   codeReal(v, pLe
15770 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c  ft->u.zToken, 1,
15780 20 74 61 72 67 65 74 29 3b 0a 23 65 6e 64 69 66   target);.#endif
15790 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
157a0 20 20 20 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d        tempX.op =
157b0 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20   TK_INTEGER;.   
157c0 20 20 20 20 20 74 65 6d 70 58 2e 66 6c 61 67 73       tempX.flags
157d0 20 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45   = EP_IntValue|E
157e0 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20  P_TokenOnly;.   
157f0 20 20 20 20 20 74 65 6d 70 58 2e 75 2e 69 56 61       tempX.u.iVa
15800 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  lue = 0;.       
15810 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
15820 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
15830 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46 72  , &tempX, &regFr
15840 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32  ee1);.        r2
15850 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
15860 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
15870 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
15880 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20  gFree2);.       
15890 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
158a0 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63  p3(v, OP_Subtrac
158b0 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65  t, r2, r1, targe
158c0 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  t);.        test
158d0 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
158e0 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
158f0 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65     inReg = targe
15900 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;.      break;.
15910 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
15920 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61  K_BITNOT:.    ca
15930 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
15940 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
15950 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20  TNOT==OP_BitNot 
15960 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15970 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20   TK_NOT==OP_Not 
15980 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
15990 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54  e( op==TK_BITNOT
159a0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
159b0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29  se( op==TK_NOT )
159c0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
159d0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
159e0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
159f0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
15a00 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
15a10 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
15a20 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  ;.      inReg = 
15a30 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 73 71  target;.      sq
15a40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15a50 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65 67  v, op, r1, inReg
15a60 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15a70 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
15a80 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
15a90 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
15aa0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
15ab0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
15ac0 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e  K_ISNULL==OP_IsN
15ad0 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ull );.      ass
15ae0 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d  ert( TK_NOTNULL=
15af0 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
15b00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
15b10 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a  p==TK_ISNULL );.
15b20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15b30 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
15b40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
15b50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15b60 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67  Integer, 1, targ
15b70 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  et);.      r1 = 
15b80 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
15b90 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
15ba0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
15bb0 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee1);.      test
15bc0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
15bd0 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  0 );.      addr 
15be0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
15bf0 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a  Op1(v, op, r1);.
15c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15c10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
15c20 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 2d 31  dImm, target, -1
15c30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15c40 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
15c50 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72 65  addr);.      bre
15c60 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
15c70 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
15c80 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49  ON: {.      AggI
15c90 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78  nfo *pInfo = pEx
15ca0 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20  pr->pAggInfo;.  
15cb0 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30      if( pInfo==0
15cc0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
15cd0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
15ce0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
15cf0 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
15d00 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
15d10 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73  Msg(pParse, "mis
15d20 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65  use of aggregate
15d30 3a 20 25 73 28 29 22 2c 20 70 45 78 70 72 2d 3e  : %s()", pExpr->
15d40 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
15d50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15d60 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d 3e 61  inReg = pInfo->a
15d70 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67  Func[pExpr->iAgg
15d80 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a  ].iMem;.      }.
15d90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15da0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46   }.    case TK_F
15db0 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
15dc0 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67   ExprList *pFarg
15dd0 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ;       /* List 
15de0 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
15df0 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ments */.      i
15e00 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20 20 20  nt nFarg;       
15e10 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
15e20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
15e30 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46  ments */.      F
15e40 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20  uncDef *pDef;   
15e50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e        /* The fun
15e60 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e  ction definition
15e70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20   object */.     
15e80 20 69 6e 74 20 6e 49 64 3b 20 20 20 20 20 20 20   int nId;       
15e90 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
15ea0 68 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  h of the functio
15eb0 6e 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20  n name in bytes 
15ec0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  */.      const c
15ed0 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20  har *zId;       
15ee0 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
15ef0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  name */.      in
15f00 74 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b  t constMask = 0;
15f10 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
15f20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
15f30 74 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73  ts that are cons
15f40 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tant */.      in
15f50 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
15f60 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
15f70 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 38  nter */.      u8
15f80 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20   enc = ENC(db); 
15f90 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74       /* The text
15fa0 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62   encoding used b
15fb0 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  y this database 
15fc0 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  */.      CollSeq
15fd0 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20   *pColl = 0;    
15fe0 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73  /* A collating s
15ff0 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20  equence */..    
16000 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
16010 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
16020 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
16030 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  );.      if( Exp
16040 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
16050 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
16060 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61  ) ){.        pFa
16070 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  rg = 0;.      }e
16080 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61  lse{.        pFa
16090 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  rg = pExpr->x.pL
160a0 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ist;.      }.   
160b0 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72 67     nFarg = pFarg
160c0 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72 20   ? pFarg->nExpr 
160d0 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  : 0;.      asser
160e0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
160f0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
16100 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
16110 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e   zId = pExpr->u.
16120 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 49  zToken;.      nI
16130 64 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  d = sqlite3Strle
16140 6e 33 30 28 7a 49 64 29 3b 0a 20 20 20 20 20 20  n30(zId);.      
16150 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
16160 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
16170 49 64 2c 20 6e 49 64 2c 20 6e 46 61 72 67 2c 20  Id, nId, nFarg, 
16180 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  enc, 0);.      i
16190 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20  f( pDef==0 ){.  
161a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
161b0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
161c0 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a  nknown function:
161d0 20 25 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 20 7a   %.*s()", nId, z
161e0 49 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  Id);.        bre
161f0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
16200 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 61 20     /* Attempt a 
16210 64 69 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74  direct implement
16220 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69  ation of the bui
16230 6c 74 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28 29  lt-in COALESCE()
16240 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49 46   and.      ** IF
16250 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73  NULL() functions
16260 2e 20 20 54 68 69 73 20 61 76 6f 69 64 73 20 75  .  This avoids u
16270 6e 6e 65 63 65 73 73 61 72 79 20 65 76 61 6c 61  nnecessary evala
16280 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a  tion of.      **
16290 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 74 20   arguments past 
162a0 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55  the first non-NU
162b0 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20  LL argument..   
162c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
162d0 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
162e0 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f  & SQLITE_FUNC_CO
162f0 41 4c 45 53 43 45 20 29 7b 0a 20 20 20 20 20 20  ALESCE ){.      
16300 20 20 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63    int endCoalesc
16310 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
16320 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
16330 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61       assert( nFa
16340 72 67 3e 3d 32 20 29 3b 0a 20 20 20 20 20 20 20  rg>=2 );.       
16350 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16360 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
16370 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  a[0].pExpr, targ
16380 65 74 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  et);.        for
16390 28 69 3d 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69  (i=1; i<nFarg; i
163a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
163b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
163c0 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
163d0 74 61 72 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65  target, endCoale
163e0 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sce);.          
163f0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
16400 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 74  Remove(pParse, t
16410 61 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 20  arget, 1);.     
16420 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
16430 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
16440 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
16450 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
16460 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d  rse, pFarg->a[i]
16470 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
16480 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
16490 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
164a0 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20  Parse, 1);.     
164b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
164c0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
164d0 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65  abel(v, endCoale
164e0 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  sce);.        br
164f0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
16500 20 20 20 20 2f 2a 20 54 68 65 20 55 4e 4c 49 4b      /* The UNLIK
16510 45 4c 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  ELY() function i
16520 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20  s a no-op.  The 
16530 72 65 73 75 6c 74 20 69 73 20 74 68 65 20 76 61  result is the va
16540 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  lue.      ** of 
16550 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
16560 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
16570 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e     if( pDef->fun
16580 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
16590 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b  FUNC_UNLIKELY ){
165a0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
165b0 20 6e 46 61 72 67 3e 3d 31 20 29 3b 0a 20 20 20   nFarg>=1 );.   
165c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
165d0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61  Code(pParse, pFa
165e0 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  rg->a[0].pExpr, 
165f0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
16600 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
16610 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
16620 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20  i<nFarg; i++){. 
16630 20 20 20 20 20 20 20 69 66 28 20 69 3c 33 32 20         if( i<32 
16640 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
16650 43 6f 6e 73 74 61 6e 74 28 70 46 61 72 67 2d 3e  Constant(pFarg->
16660 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[i].pExpr) ){. 
16670 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61           constMa
16680 73 6b 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20 20  sk |= (1<<i);.  
16690 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
166a0 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46  if( (pDef->funcF
166b0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
166c0 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20  NC_NEEDCOLL)!=0 
166d0 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  && !pColl ){.   
166e0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
166f0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
16700 71 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d  q(pParse, pFarg-
16710 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
16720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
16730 20 20 20 20 20 20 69 66 28 20 70 46 61 72 67 20        if( pFarg 
16740 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
16750 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20  onstMask ){.    
16760 20 20 20 20 20 20 72 31 20 3d 20 70 50 61 72 73        r1 = pPars
16770 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
16780 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
16790 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20  m += nFarg;.    
167a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
167b0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
167c0 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
167d0 61 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20  arse, nFarg);.  
167e0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
167f0 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29   /* For length()
16800 20 61 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75   and typeof() fu
16810 6e 63 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63  nctions with a c
16820 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a  olumn argument,.
16830 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74          ** set t
16840 68 65 20 50 35 20 70 61 72 61 6d 65 74 65 72 20  he P5 parameter 
16850 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e  to the OP_Column
16860 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41   opcode to OPFLA
16870 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20  G_LENGTHARG.    
16880 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47      ** or OPFLAG
16890 5f 54 59 50 45 4f 46 41 52 47 20 72 65 73 70 65  _TYPEOFARG respe
168a0 63 74 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69  ctively, to avoi
168b0 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61  d unnecessary da
168c0 74 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f  ta.        ** lo
168d0 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a  ading..        *
168e0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  /.        if( (p
168f0 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
16900 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45   (SQLITE_FUNC_LE
16910 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43  NGTH|SQLITE_FUNC
16920 5f 54 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a  _TYPEOF))!=0 ){.
16930 20 20 20 20 20 20 20 20 20 20 75 38 20 65 78 70            u8 exp
16940 72 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61  rOp;.          a
16950 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20  ssert( nFarg==1 
16960 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
16970 65 72 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d  ert( pFarg->a[0]
16980 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  .pExpr!=0 );.   
16990 20 20 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20         exprOp = 
169a0 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
169b0 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20  r->op;.         
169c0 20 69 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f   if( exprOp==TK_
169d0 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70  COLUMN || exprOp
169e0 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
169f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
16a00 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55  ssert( SQLITE_FU
16a10 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41  NC_LENGTH==OPFLA
16a20 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20  G_LENGTHARG );. 
16a30 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
16a40 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54  t( SQLITE_FUNC_T
16a50 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59  YPEOF==OPFLAG_TY
16a60 50 45 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20  PEOFARG );.     
16a70 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
16a80 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
16a90 20 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48   & OPFLAG_LENGTH
16aa0 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ARG );.         
16ab0 20 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70     pFarg->a[0].p
16ac0 45 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20  Expr->op2 = .   
16ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
16ae0 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
16af0 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41   (OPFLAG_LENGTHA
16b00 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  RG|OPFLAG_TYPEOF
16b10 41 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ARG);.          
16b20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  }.        }..   
16b30 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
16b40 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
16b50 29 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74  );     /* Ticket
16b60 20 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f   2ea2425d34be */
16b70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16b80 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
16b90 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20  (pParse, pFarg, 
16ba0 72 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  r1, .           
16bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bc0 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c       SQLITE_ECEL
16bd0 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c  _DUP|SQLITE_ECEL
16be0 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20 20 20 20  _FACTOR);.      
16bf0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
16c00 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
16c10 3b 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65  ;   /* Ticket 2e
16c20 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20  a2425d34be */.  
16c30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16c40 20 20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20     r1 = 0;.     
16c50 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
16c60 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
16c70 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73  BLE.      /* Pos
16c80 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74  sibly overload t
16c90 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74  he function if t
16ca0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
16cb0 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  t is.      ** a 
16cc0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f  virtual table co
16cd0 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  lumn..      **. 
16ce0 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69       ** For infi
16cf0 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b  x functions (LIK
16d00 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c  E, GLOB, REGEXP,
16d10 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20   and MATCH) use 
16d20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63  the.      ** sec
16d30 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f  ond argument, no
16d40 74 20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20  t the first, as 
16d50 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
16d60 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a  test to.      **
16d70 20 73 65 65 20 69 66 20 69 74 20 69 73 20 61 20   see if it is a 
16d80 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74  column in a virt
16d90 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ual table.  This
16da0 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65   is done because
16db0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65  .      ** the le
16dc0 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e  ft operand of in
16dd0 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74  fix functions (t
16de0 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61  he operand we wa
16df0 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63  nt to.      ** c
16e00 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69  ontrol overloadi
16e10 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73 20 74  ng) ends up as t
16e20 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
16e30 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  nt to the.      
16e40 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  ** function.  Th
16e50 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20  e expression "A 
16e60 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69 76  glob B" is equiv
16e70 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20  alent to .      
16e80 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20  ** "glob(B,A).  
16e90 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74  We want to use t
16ea0 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20  he A in "A glob 
16eb0 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20  B" to test.     
16ec0 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e   ** for function
16ed0 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42   overloading.  B
16ee0 75 74 20 77 65 20 75 73 65 20 74 68 65 20 42 20  ut we use the B 
16ef0 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c  term in "glob(B,
16f00 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  A)"..      */.  
16f10 20 20 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32      if( nFarg>=2
16f20 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67   && (pExpr->flag
16f30 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63  s & EP_InfixFunc
16f40 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  ) ){.        pDe
16f50 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
16f60 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
16f70 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c  db, pDef, nFarg,
16f80 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78   pFarg->a[1].pEx
16f90 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  pr);.      }else
16fa0 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a   if( nFarg>0 ){.
16fb0 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
16fc0 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f  qlite3VtabOverlo
16fd0 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  adFunction(db, p
16fe0 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72  Def, nFarg, pFar
16ff0 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  g->a[0].pExpr);.
17000 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
17010 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
17020 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
17030 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
17040 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ){.        if( !
17050 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
17060 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a  db->pDfltColl; .
17070 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
17080 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
17090 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30  CollSeq, 0, 0, 0
170a0 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  , (char *)pColl,
170b0 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
170c0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
170d0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
170e0 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 63 6f   OP_Function, co
170f0 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72  nstMask, r1, tar
17100 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  get,.           
17110 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
17120 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e  ar*)pDef, P4_FUN
17130 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73 71 6c  CDEF);.      sql
17140 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
17150 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29 3b 0a  (v, (u8)nFarg);.
17160 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67 20        if( nFarg 
17170 26 26 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30 20  && constMask==0 
17180 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
17190 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
171a0 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e  ge(pParse, r1, n
171b0 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Farg);.      }. 
171c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
171d0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
171e0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
171f0 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
17200 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
17210 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 74  ELECT: {.      t
17220 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
17230 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20  EXISTS );.      
17240 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
17250 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20  _SELECT );.     
17260 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
17270 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
17280 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20  arse, pExpr, 0, 
17290 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
172a0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
172b0 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
172c0 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d  nt destIfFalse =
172d0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
172e0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
172f0 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d  int destIfNull =
17300 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
17310 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
17320 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17330 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
17340 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
17350 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
17360 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
17370 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65   destIfFalse, de
17380 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
17390 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
173a0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
173b0 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
173c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
173d0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
173e0 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
173f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17400 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
17410 6d 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20  m, target, 0);. 
17420 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17430 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
17440 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
17450 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17460 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
17470 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
17480 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  /...    /*.    *
17490 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79  *    x BETWEEN y
174a0 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20   AND z.    **.  
174b0 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75    ** This is equ
174c0 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a  ivalent to.    *
174d0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79  *.    **    x>=y
174e0 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a   AND x<=z.    **
174f0 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f  .    ** X is sto
17500 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
17510 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73  eft..    ** Y is
17520 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
17530 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
17540 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73  xpr..    ** Z is
17550 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
17560 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
17570 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xpr..    */.    
17580 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
17590 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
175a0 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
175b0 65 66 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63  eft;.      struc
175c0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
175d0 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78 70 72 2d  *pLItem = pExpr-
175e0 3e 78 2e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  >x.pList->a;.   
175f0 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
17600 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b  = pLItem->pExpr;
17610 0a 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ..      r1 = sql
17620 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
17630 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
17640 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
17650 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
17660 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
17670 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67 46  e, pRight, &regF
17680 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73  ree2);.      tes
17690 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
176a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
176b0 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
176c0 30 20 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20  0 );.      r3 = 
176d0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
176e0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
176f0 20 72 34 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r4 = sqlite3Get
17700 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
17710 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
17720 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
17730 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c  , pRight, OP_Ge,
17740 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17750 20 20 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 53     r1, r2, r3, S
17760 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a  QLITE_STOREP2);.
17770 20 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a        pLItem++;.
17780 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
17790 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  LItem->pExpr;.  
177a0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
177b0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
177c0 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20  , regFree2);.   
177d0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
177e0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
177f0 73 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67  se, pRight, &reg
17800 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65  Free2);.      te
17810 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
17820 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64  ==0 );.      cod
17830 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
17840 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
17850 4f 50 5f 4c 65 2c 20 72 31 2c 20 72 32 2c 20 72  OP_Le, r1, r2, r
17860 34 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50  4, SQLITE_STOREP
17870 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
17880 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
17890 50 5f 41 6e 64 2c 20 72 33 2c 20 72 34 2c 20 74  P_And, r3, r4, t
178a0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
178b0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
178c0 52 65 67 28 70 50 61 72 73 65 2c 20 72 33 29 3b  Reg(pParse, r3);
178d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
178e0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
178f0 72 73 65 2c 20 72 34 29 3b 0a 20 20 20 20 20 20  rse, r4);.      
17900 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
17910 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45   case TK_COLLATE
17920 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  : .    case TK_U
17930 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e  PLUS: {.      in
17940 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
17950 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
17960 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
17970 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
17980 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
17990 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47     case TK_TRIGG
179a0 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ER: {.      /* I
179b0 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20  f the opcode is 
179c0 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e  TK_TRIGGER, then
179d0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
179e0 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20  is a reference. 
179f0 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c       ** to a col
17a00 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a  umn in the new.*
17a10 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f   or old.* pseudo
17a20 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c  -tables availabl
17a30 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72  e to.      ** tr
17a40 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20  igger programs. 
17a50 49 6e 20 74 68 69 73 20 63 61 73 65 20 45 78 70  In this case Exp
17a60 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20  r.iTable is set 
17a70 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20  to 1 for the.   
17a80 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75     ** new.* pseu
17a90 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66  do-table, or 0 f
17aa0 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65  or the old.* pse
17ab0 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e  udo-table. Expr.
17ac0 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a  iColumn.      **
17ad0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63   is set to the c
17ae0 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65  olumn of the pse
17af0 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61  udo-table to rea
17b00 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20  d, or to -1 to. 
17b10 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65       ** read the
17b20 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20   rowid field..  
17b30 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
17b40 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
17b50 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73  s implemented us
17b60 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20  ing an OP_Param 
17b70 6f 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20  opcode. The p1. 
17b80 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65       ** paramete
17b90 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f  r is set to 0 fo
17ba0 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72  r an old.rowid r
17bb0 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20  eference, or to 
17bc0 28 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74  (i+1).      ** t
17bd0 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74  o reference anot
17be0 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  her column of th
17bf0 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  e old.* pseudo-t
17c00 61 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20  able, where .   
17c10 20 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69     ** i is the i
17c20 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
17c30 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f  mn. For a new.ro
17c40 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70  wid reference, p
17c50 31 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65  1 is.      ** se
17c60 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72  t to (n+1), wher
17c70 65 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e n is the numbe
17c80 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
17c90 65 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c  each pseudo-tabl
17ca0 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  e..      ** For 
17cb0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
17cc0 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20  ny other column 
17cd0 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65  in the new.* pse
17ce0 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20  udo-table, p1.  
17cf0 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f      ** is set to
17d00 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20   (n+2+i), where 
17d10 6e 20 61 6e 64 20 69 20 61 72 65 20 61 73 20 64  n and i are as d
17d20 65 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c  efined previousl
17d30 79 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20  y. For.      ** 
17d40 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
17d50 74 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74  table on which t
17d60 72 69 67 67 65 72 73 20 61 72 65 20 62 65 69 6e  riggers are bein
17d70 67 20 66 69 72 65 64 20 69 73 0a 20 20 20 20 20  g fired is.     
17d80 20 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a   ** declared as:
17d90 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
17da0 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
17db0 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
17dc0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
17dd0 65 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70 72  en p1 is interpr
17de0 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  eted as follows:
17df0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
17e00 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20  **   p1==0   -> 
17e10 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20     old.rowid    
17e20 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e   p1==3   ->    n
17e30 65 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a  ew.rowid.      *
17e40 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20  *   p1==1   ->  
17e50 20 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20    old.a         
17e60 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65  p1==4   ->    ne
17e70 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70  w.a.      **   p
17e80 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64  1==2   ->    old
17e90 2e 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35  .b         p1==5
17ea0 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20     ->    new.b  
17eb0 20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20       .      */. 
17ec0 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
17ed0 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a   = pExpr->pTab;.
17ee0 20 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70        int p1 = p
17ef0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28  Expr->iTable * (
17f00 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20  pTab->nCol+1) + 
17f10 31 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  1 + pExpr->iColu
17f20 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  mn;..      asser
17f30 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t( pExpr->iTable
17f40 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54  ==0 || pExpr->iT
17f50 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20  able==1 );.     
17f60 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
17f70 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70  iColumn>=-1 && p
17f80 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54  Expr->iColumn<pT
17f90 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  ab->nCol );.    
17fa0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
17fb0 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72  iPKey<0 || pExpr
17fc0 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d  ->iColumn!=pTab-
17fd0 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  >iPKey );.      
17fe0 61 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26  assert( p1>=0 &&
17ff0 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a   p1<(pTab->nCol*
18000 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73  2+2) );..      s
18010 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18020 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31  (v, OP_Param, p1
18030 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
18040 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
18050 20 22 25 73 2e 25 73 20 2d 3e 20 24 25 64 22 2c   "%s.%s -> $%d",
18060 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d  .        (pExpr-
18070 3e 69 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20  >iTable ? "new" 
18080 3a 20 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20  : "old"),.      
18090 20 20 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d    (pExpr->iColum
180a0 6e 3c 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20  n<0 ? "rowid" : 
180b0 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f  pExpr->pTab->aCo
180c0 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  l[pExpr->iColumn
180d0 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20  ].zName),.      
180e0 20 20 74 61 72 67 65 74 0a 20 20 20 20 20 20 29    target.      )
180f0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
18100 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
18110 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20  _POINT.      /* 
18120 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61  If the column ha
18130 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c  s REAL affinity,
18140 20 69 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c   it may currentl
18150 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61  y be stored as a
18160 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67  n.      ** integ
18170 65 72 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41  er. Use OP_RealA
18180 66 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20  ffinity to make 
18190 73 75 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c  sure it is reall
181a0 79 20 72 65 61 6c 2e 20 20 2a 2f 0a 20 20 20 20  y real.  */.    
181b0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
181c0 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20  lumn>=0 .       
181d0 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45  && pTab->aCol[pE
181e0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66  xpr->iColumn].af
181f0 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
18200 46 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 29 7b  FF_REAL.      ){
18210 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18220 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
18230 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74  _RealAffinity, t
18240 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
18250 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65  #endif.      bre
18260 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20  ak;.    }...    
18270 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41  /*.    ** Form A
18280 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20  :.    **   CASE 
18290 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72  x WHEN e1 THEN r
182a0 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72  1 WHEN e2 THEN r
182b0 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48  2 ... WHEN eN TH
182c0 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
182d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
182e0 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20  orm B:.    **   
182f0 43 41 53 45 20 57 48 45 4e 20 65 31 20 54 48 45  CASE WHEN e1 THE
18300 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45  N r1 WHEN e2 THE
18310 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e  N r2 ... WHEN eN
18320 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
18330 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
18340 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20  * Form A is can 
18350 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69  be transformed i
18360 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65  nto the equivale
18370 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c  nt form B as fol
18380 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43  lows:.    **   C
18390 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48  ASE WHEN x=e1 TH
183a0 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20  EN r1 WHEN x=e2 
183b0 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20  THEN r2 ....    
183c0 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20 78  **        WHEN x
183d0 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45  =eN THEN rN ELSE
183e0 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
183f0 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78    ** X (if it ex
18400 69 73 74 73 29 20 69 73 20 69 6e 20 70 45 78 70  ists) is in pExp
18410 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a  r->pLeft..    **
18420 20 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73   Y is in the las
18430 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78  t element of pEx
18440 70 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70  pr->x.pList if p
18450 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
18460 45 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f  Expr is.    ** o
18470 64 64 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c  dd.  The Y is al
18480 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66  so optional.  If
18490 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
184a0 6c 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69  lements in x.pLi
184b0 73 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65  st.    ** is eve
184c0 6e 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69  n, then Y is omi
184d0 74 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74  tted and the "ot
184e0 68 65 72 77 69 73 65 22 20 72 65 73 75 6c 74 20  herwise" result 
184f0 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20  is NULL..    ** 
18500 45 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e  Ei is in pExpr->
18510 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e  pList->a[i*2] an
18520 64 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70  d Ri is pExpr->p
18530 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a  List->a[i*2+1]..
18540 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
18550 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
18560 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68  expression is th
18570 65 20 52 69 20 66 6f 72 20 74 68 65 20 66 69 72  e Ri for the fir
18580 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a  st matching Ei,.
18590 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65      ** or if the
185a0 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e  re is no matchin
185b0 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74  g Ei, the ELSE t
185c0 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65  erm Y, or if the
185d0 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20  re is.    ** no 
185e0 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e  ELSE term, NULL.
185f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
18600 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d  ult: assert( op=
18610 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20  =TK_CASE ); {.  
18620 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c      int endLabel
18630 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18640 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61        /* GOTO la
18650 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43  bel for end of C
18660 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20  ASE stmt */.    
18670 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20    int nextCase; 
18680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18690 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65      /* GOTO labe
186a0 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20  l for next WHEN 
186b0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
186c0 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20  int nExpr;      
186d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186e0 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f    /* 2x number o
186f0 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a  f WHEN terms */.
18700 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
18710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18720 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
18730 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
18740 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
18750 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
18760 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48     /* List of WH
18770 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
18780 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
18790 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65  t_item *aListele
187a0 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20  m;  /* Array of 
187b0 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
187c0 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61      Expr opCompa
187d0 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
187e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d        /* The X==
187f0 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  Ei expression */
18800 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
18810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18820 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18830 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  X expression */.
18840 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 73        Expr *pTes
18850 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
18860 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69          /* X==Ei
18870 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73   (form A) or jus
18880 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f  t Ei (form B) */
18890 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28  .      VVA_ONLY(
188a0 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c   int iCacheLevel
188b0 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
188c0 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20  eLevel; )..     
188d0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
188e0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
188f0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26   EP_xIsSelect) &
18900 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  & pExpr->x.pList
18910 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
18920 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d  (pExpr->x.pList-
18930 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20  >nExpr > 0);.   
18940 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70     pEList = pExp
18950 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
18960 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45    aListelem = pE
18970 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e  List->a;.      n
18980 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  Expr = pEList->n
18990 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c  Expr;.      endL
189a0 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  abel = sqlite3Vd
189b0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
189c0 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d 20        if( (pX = 
189d0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30  pExpr->pLeft)!=0
189e0 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70   ){.        temp
189f0 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20  X = *pX;.       
18a00 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f   testcase( pX->o
18a10 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
18a20 20 20 20 20 20 20 20 20 65 78 70 72 54 6f 52 65          exprToRe
18a30 67 69 73 74 65 72 28 26 74 65 6d 70 58 2c 20 73  gister(&tempX, s
18a40 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
18a50 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2c 20 26  mp(pParse, pX, &
18a60 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20  regFree1));.    
18a70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
18a80 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
18a90 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f       opCompare.o
18aa0 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20  p = TK_EQ;.     
18ab0 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65     opCompare.pLe
18ac0 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20 20  ft = &tempX;.   
18ad0 20 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70       pTest = &op
18ae0 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20  Compare;.       
18af0 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64   /* Ticket b351d
18b00 39 35 66 39 63 64 35 65 66 31 37 65 39 64 39 64  95f9cd5ef17e9d9d
18b10 62 61 65 31 38 66 35 63 61 38 36 31 31 31 39 30  bae18f5ca8611190
18b20 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20  001:.        ** 
18b30 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  The value in reg
18b40 46 72 65 65 31 20 6d 69 67 68 74 20 67 65 74 20  Free1 might get 
18b50 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68  SCopy-ed into th
18b60 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20  e file result.. 
18b70 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b         ** So mak
18b80 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
18b90 72 65 67 46 72 65 65 31 20 72 65 67 69 73 74 65  regFree1 registe
18ba0 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20  r is not reused 
18bb0 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20  for other.      
18bc0 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e    ** purposes an
18bd0 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77  d possibly overw
18be0 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20  ritten.  */.    
18bf0 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20 30      regFree1 = 0
18c00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18c10 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
18c20 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20  -1; i=i+2){.    
18c30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
18c40 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
18c50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 58  ;.        if( pX
18c60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
18c70 73 65 72 74 28 20 70 54 65 73 74 21 3d 30 20 29  sert( pTest!=0 )
18c80 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f  ;.          opCo
18c90 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61  mpare.pRight = a
18ca0 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
18cb0 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  r;.        }else
18cc0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 73  {.          pTes
18cd0 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d  t = aListelem[i]
18ce0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
18cf0 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74 43 61  }.        nextCa
18d00 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
18d10 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
18d20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18d30 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pTest->op==TK_CO
18d40 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
18d50 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
18d60 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 73 74  se(pParse, pTest
18d70 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49  , nextCase, SQLI
18d80 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
18d90 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
18da0 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d  ( aListelem[i+1]
18db0 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43  .pExpr->op==TK_C
18dc0 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20  OLUMN );.       
18dd0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
18de0 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c  (pParse, aListel
18df0 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74  em[i+1].pExpr, t
18e00 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
18e10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18e20 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
18e30 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20   endLabel);.    
18e40 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
18e50 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20  achePop(pParse, 
18e60 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
18e70 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
18e80 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29  bel(v, nextCase)
18e90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18ea0 69 66 28 20 28 6e 45 78 70 72 26 31 29 21 3d 30  if( (nExpr&1)!=0
18eb0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
18ec0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
18ed0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
18ee0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
18ef0 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  e(pParse, pEList
18f00 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45 78  ->a[nExpr-1].pEx
18f10 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
18f20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
18f30 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c  CachePop(pParse,
18f40 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   1);.      }else
18f50 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
18f60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18f70 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
18f80 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
18f90 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
18fa0 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
18fb0 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20  arse->nErr>0 .  
18fc0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
18fd0 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d  se->iCacheLevel=
18fe0 3d 69 43 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a  =iCacheLevel );.
18ff0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19000 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
19010 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20   endLabel);.    
19020 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
19030 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19040 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63  IT_TRIGGER.    c
19050 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a  ase TK_RAISE: {.
19060 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
19070 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
19080 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20  E_Rollback .    
19090 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
190a0 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62  >affinity==OE_Ab
190b0 6f 72 74 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ort.           |
190c0 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  | pExpr->affinit
190d0 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20  y==OE_Fail.     
190e0 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
190f0 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e  affinity==OE_Ign
19100 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ore.      );.   
19110 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e     if( !pParse->
19120 70 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20  pTriggerTab ){. 
19130 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
19140 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
19150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19160 20 20 20 20 20 20 22 52 41 49 53 45 28 29 20 6d        "RAISE() m
19170 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  ay only be used 
19180 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72  within a trigger
19190 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20  -program");.    
191a0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
191b0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
191c0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
191d0 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
191e0 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41       sqlite3MayA
191f0 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20  bort(pParse);.  
19200 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
19210 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
19220 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
19230 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
19240 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66    if( pExpr->aff
19250 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65  inity==OE_Ignore
19260 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
19270 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20  te3VdbeAddOp4(. 
19280 20 20 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50             v, OP
19290 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b  _Halt, SQLITE_OK
192a0 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20  , OE_Ignore, 0, 
192b0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
192c0 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0);.      }else{
192d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
192e0 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70  HaltConstraint(p
192f0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f  Parse, SQLITE_CO
19300 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52  NSTRAINT_TRIGGER
19310 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19330 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c  pExpr->affinity,
19340 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
19350 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
19360 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ..      break;. 
19370 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
19380 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
19390 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
193a0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
193b0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
193c0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
193d0 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  ee2);.  return i
193e0 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  nReg;.}../*.** F
193f0 61 63 74 6f 72 20 6f 75 74 20 74 68 65 20 63 6f  actor out the co
19400 64 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  de of the given 
19410 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e  expression to in
19420 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d  itialization tim
19430 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
19440 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
19450 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
19460 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
19470 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
19480 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
19490 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
194a0 6e 20 74 6f 20 63 6f 64 65 20 77 68 65 6e 20 74  n to code when t
194b0 68 65 20 56 44 42 45 20 69 6e 69 74 69 61 6c 69  he VDBE initiali
194c0 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  zes */.  int reg
194d0 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 53 74  Dest,      /* St
194e0 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ore the value in
194f0 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
19500 2f 0a 20 20 75 38 20 72 65 75 73 61 62 6c 65 20  /.  u8 reusable 
19510 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
19520 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   this expression
19530 20 69 73 20 72 65 75 73 61 62 6c 65 20 2a 2f 0a   is reusable */.
19540 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
19550 3b 0a 20 20 61 73 73 65 72 74 28 20 43 6f 6e 73  ;.  assert( Cons
19560 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
19570 29 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  ) );.  p = pPars
19580 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20  e->pConstExpr;. 
19590 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
195a0 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e  ExprDup(pParse->
195b0 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  db, pExpr, 0);. 
195c0 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   p = sqlite3Expr
195d0 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
195e0 65 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a 20 20  e, p, pExpr);.  
195f0 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 73 74  if( p ){.     st
19600 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
19610 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
19620 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  a[p->nExpr-1];. 
19630 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f      pItem->u.iCo
19640 6e 73 74 45 78 70 72 52 65 67 20 3d 20 72 65 67  nstExprReg = reg
19650 44 65 73 74 3b 0a 20 20 20 20 20 70 49 74 65 6d  Dest;.     pItem
19660 2d 3e 72 65 75 73 61 62 6c 65 20 3d 20 72 65 75  ->reusable = reu
19670 73 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 70 50 61  sable;.  }.  pPa
19680 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20  rse->pConstExpr 
19690 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = p;.}../*.** Ge
196a0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
196b0 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65  valuate an expre
196c0 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20  ssion and store 
196d0 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69  the results.** i
196e0 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20  nto a register. 
196f0 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   Return the regi
19700 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72  ster number wher
19710 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
19720 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a   are stored..**.
19730 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69 73 74  ** If the regist
19740 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  er is a temporar
19750 79 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20  y register that 
19760 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74  can be deallocat
19770 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74  ed,.** then writ
19780 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74  e its number int
19790 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65  o *pReg.  If the
197a0 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72   result register
197b0 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d   is not.** a tem
197c0 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74  porary, then set
197d0 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a   *pReg to zero..
197e0 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69  **.** If pExpr i
197f0 73 20 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68  s a constant, th
19800 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
19810 6d 69 67 68 74 20 67 65 6e 65 72 61 74 65 20 74  might generate t
19820 68 69 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 66  his.** code to f
19830 69 6c 6c 20 74 68 65 20 72 65 67 69 73 74 65 72  ill the register
19840 20 69 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 69   in the initiali
19850 7a 61 74 69 6f 6e 20 73 65 63 74 69 6f 6e 20 6f  zation section o
19860 66 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72  f the.** VDBE pr
19870 6f 67 72 61 6d 2c 20 69 6e 20 6f 72 64 65 72 20  ogram, in order 
19880 74 6f 20 66 61 63 74 6f 72 20 69 74 20 6f 75 74  to factor it out
19890 20 6f 66 20 74 68 65 20 65 76 61 6c 75 61 74 69   of the evaluati
198a0 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  on loop..*/.int 
198b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
198c0 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  emp(Parse *pPars
198d0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
198e0 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e  int *pReg){.  in
198f0 74 20 72 32 3b 0a 20 20 70 45 78 70 72 20 3d 20  t r2;.  pExpr = 
19900 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
19910 6f 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20  ollate(pExpr);. 
19920 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72   if( ConstFactor
19930 4f 6b 28 70 50 61 72 73 65 29 0a 20 20 20 26 26  Ok(pParse).   &&
19940 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52   pExpr->op!=TK_R
19950 45 47 49 53 54 45 52 0a 20 20 20 26 26 20 73 71  EGISTER.   && sq
19960 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
19970 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72  antNotJoin(pExpr
19980 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72 4c  ).  ){.    ExprL
19990 69 73 74 20 2a 70 20 3d 20 70 50 61 72 73 65 2d  ist *p = pParse-
199a0 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 20  >pConstExpr;.   
199b0 20 69 6e 74 20 69 3b 0a 20 20 20 20 2a 70 52 65   int i;.    *pRe
199c0 67 20 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  g  = 0;.    if( 
199d0 70 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  p ){.      struc
199e0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
199f0 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f  *pItem;.      fo
19a00 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d  r(pItem=p->a, i=
19a10 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70  p->nExpr; i>0; p
19a20 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20  Item++, i--){.  
19a30 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
19a40 3e 72 65 75 73 61 62 6c 65 20 26 26 20 73 71 6c  >reusable && sql
19a50 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
19a60 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78  pItem->pExpr,pEx
19a70 70 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  pr,-1)==0 ){.   
19a80 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 49         return pI
19a90 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70  tem->u.iConstExp
19aa0 72 52 65 67 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rReg;.        }.
19ab0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19ac0 20 20 72 32 20 3d 20 2b 2b 70 50 61 72 73 65 2d    r2 = ++pParse-
19ad0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
19ae0 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
19af0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
19b00 72 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  r2, 1);.  }else{
19b10 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71  .    int r1 = sq
19b20 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
19b30 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 32 20  pParse);.    r2 
19b40 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
19b50 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
19b60 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20  pExpr, r1);.    
19b70 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20  if( r2==r1 ){.  
19b80 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a      *pReg = r1;.
19b90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19ba0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
19bb0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
19bc0 31 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 67 20  1);.      *pReg 
19bd0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
19be0 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f   return r2;.}../
19bf0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
19c00 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
19c10 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  luate expression
19c20 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65   pExpr and store
19c30 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20   the.** results 
19c40 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
19c50 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73  et.  The results
19c60 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
19c70 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20  to appear.** in 
19c80 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
19c90 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
19ca0 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70  xprCode(Parse *p
19cb0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
19cc0 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
19cd0 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20  .  int inReg;.. 
19ce0 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
19cf0 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61  0 && target<=pPa
19d00 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69  rse->nMem );.  i
19d10 66 28 20 70 45 78 70 72 20 26 26 20 70 45 78 70  f( pExpr && pExp
19d20 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  r->op==TK_REGIST
19d30 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ER ){.    sqlite
19d40 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72  3VdbeAddOp2(pPar
19d50 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f  se->pVdbe, OP_Co
19d60 70 79 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  py, pExpr->iTabl
19d70 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65  e, target);.  }e
19d80 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d  lse{.    inReg =
19d90 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
19da0 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
19db0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
19dc0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
19dd0 65 2d 3e 70 56 64 62 65 20 7c 7c 20 70 50 61 72  e->pVdbe || pPar
19de0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
19df0 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20  iled );.    if( 
19e00 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26 26  inReg!=target &&
19e10 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29   pParse->pVdbe )
19e20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
19e30 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65  dbeAddOp2(pParse
19e40 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70  ->pVdbe, OP_SCop
19e50 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74  y, inReg, target
19e60 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
19e70 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 7d 0a  eturn target;.}.
19e80 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
19e90 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 74  code that evalut
19ea0 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  es the given exp
19eb0 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73  ression and puts
19ec0 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69   the result.** i
19ed0 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
19ee0 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61  t..**.** Also ma
19ef0 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
19f00 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75   expression resu
19f10 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72  lts into another
19f20 20 22 63 61 63 68 65 22 20 72 65 67 69 73 74 65   "cache" registe
19f30 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20  r.** and modify 
19f40 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73  the expression s
19f50 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  o that the next 
19f60 74 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75  time it is evalu
19f70 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73  ated,.** the res
19f80 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ult is a copy of
19f90 20 74 68 65 20 63 61 63 68 65 20 72 65 67 69 73   the cache regis
19fa0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
19fb0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
19fc0 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20  for expressions 
19fd0 74 68 61 74 20 61 72 65 20 75 73 65 64 20 6d 75  that are used mu
19fe0 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73  ltiple .** times
19ff0 2e 20 20 54 68 65 79 20 61 72 65 20 65 76 61 6c  .  They are eval
1a000 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74  uated once and t
1a010 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
1a020 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
1a030 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 69  are reused..*/.i
1a040 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
1a050 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73 65  deAndCache(Parse
1a060 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1a070 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
1a080 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  t){.  Vdbe *v = 
1a090 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1a0a0 20 69 6e 74 20 69 6e 52 65 67 3b 0a 20 20 69 6e   int inReg;.  in
1a0b0 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
1a0c0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
1a0d0 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
1a0e0 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
1a0f0 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6f 6e 6c   );.  /* The onl
1a100 79 20 70 6c 61 63 65 2c 20 6f 74 68 65 72 20 74  y place, other t
1a110 68 61 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  han this routine
1a120 2c 20 77 68 65 72 65 20 65 78 70 72 65 73 73 69  , where expressi
1a130 6f 6e 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20  ons can be.  ** 
1a140 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 54 4b 5f  converted to TK_
1a150 52 45 47 49 53 54 45 52 20 69 73 20 69 6e 74 65  REGISTER is inte
1a160 72 6e 61 6c 20 73 75 62 65 78 70 72 65 73 73 69  rnal subexpressi
1a170 6f 6e 73 20 69 6e 20 42 45 54 57 45 45 4e 20 61  ons in BETWEEN a
1a180 6e 64 0a 20 20 2a 2a 20 43 41 53 45 20 6f 70 65  nd.  ** CASE ope
1a190 72 61 74 6f 72 73 2e 20 20 4e 65 69 74 68 65 72  rators.  Neither
1a1a0 20 65 76 65 72 20 63 61 6c 6c 73 20 74 68 69 73   ever calls this
1a1b0 20 72 6f 75 74 69 6e 65 2e 20 20 41 6e 64 20 74   routine.  And t
1a1c0 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a  his routine.  **
1a1d0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
1a1e0 20 74 77 69 63 65 20 6f 6e 20 74 68 65 20 73 61   twice on the sa
1a1f0 6d 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  me expression.  
1a200 48 65 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f  Hence it is impo
1a210 73 73 69 62 6c 65 0a 20 20 2a 2a 20 66 6f 72 20  ssible.  ** for 
1a220 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 69  the input to thi
1a230 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 61 6c 72  s routine to alr
1a240 65 61 64 79 20 62 65 20 61 20 72 65 67 69 73 74  eady be a regist
1a250 65 72 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  er.  Nevertheles
1a260 73 2c 0a 20 20 2a 2a 20 69 74 20 73 65 65 6d 73  s,.  ** it seems
1a270 20 70 72 75 64 65 6e 74 20 74 6f 20 6b 65 65 70   prudent to keep
1a280 20 74 68 65 20 41 4c 57 41 59 53 28 29 20 69 6e   the ALWAYS() in
1a290 20 63 61 73 65 20 74 68 65 20 63 6f 6e 64 69 74   case the condit
1a2a0 69 6f 6e 73 20 61 62 6f 76 65 0a 20 20 2a 2a 20  ions above.  ** 
1a2b0 63 68 61 6e 67 65 20 77 69 74 68 20 66 75 74 75  change with futu
1a2c0 72 65 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73  re modifications
1a2d0 20 6f 72 20 65 6e 68 61 6e 63 65 6d 65 6e 74 73   or enhancements
1a2e0 2e 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59  . */.  if( ALWAY
1a2f0 53 28 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  S(pExpr->op!=TK_
1a300 52 45 47 49 53 54 45 52 29 20 29 7b 20 20 0a 20  REGISTER) ){  . 
1a310 20 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 20     int iMem;.   
1a320 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65   iMem = ++pParse
1a330 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
1a340 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a350 20 4f 50 5f 43 6f 70 79 2c 20 69 6e 52 65 67 2c   OP_Copy, inReg,
1a360 20 69 4d 65 6d 29 3b 0a 20 20 20 20 65 78 70 72   iMem);.    expr
1a370 54 6f 52 65 67 69 73 74 65 72 28 70 45 78 70 72  ToRegister(pExpr
1a380 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 72  , iMem);.  }.  r
1a390 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a  eturn inReg;.}..
1a3a0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1a3b0 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
1a3c0 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65  XPLAIN)./*.** Ge
1a3d0 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d 72  nerate a human-r
1a3e0 65 61 64 61 62 6c 65 20 65 78 70 6c 61 6e 61 74  eadable explanat
1a3f0 69 6f 6e 20 6f 66 20 61 6e 20 65 78 70 72 65 73  ion of an expres
1a400 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f  sion tree..*/.vo
1a410 69 64 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69  id sqlite3Explai
1a420 6e 45 78 70 72 28 56 64 62 65 20 2a 70 4f 75 74  nExpr(Vdbe *pOut
1a430 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
1a440 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
1a450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1a460 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20  he opcode being 
1a470 63 6f 64 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  coded */.  const
1a480 20 63 68 61 72 20 2a 7a 42 69 6e 4f 70 20 3d 20   char *zBinOp = 
1a490 30 3b 20 20 20 2f 2a 20 42 69 6e 61 72 79 20 6f  0;   /* Binary o
1a4a0 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 63 6f 6e  perator */.  con
1a4b0 73 74 20 63 68 61 72 20 2a 7a 55 6e 69 4f 70 20  st char *zUniOp 
1a4c0 3d 20 30 3b 20 20 20 2f 2a 20 55 6e 61 72 79 20  = 0;   /* Unary 
1a4d0 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 66  operator */.  if
1a4e0 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ( pExpr==0 ){.  
1a4f0 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a    op = TK_NULL;.
1a500 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20    }else{.    op 
1a510 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d  = pExpr->op;.  }
1a520 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
1a530 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
1a540 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
1a550 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1a560 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 41 47 47  rintf(pOut, "AGG
1a570 7b 25 64 3a 25 64 7d 22 2c 0a 20 20 20 20 20 20  {%d:%d}",.      
1a580 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
1a590 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ble, pExpr->iCol
1a5a0 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  umn);.      brea
1a5b0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1a5c0 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
1a5d0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
1a5e0 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20  iTable<0 ){.    
1a5f0 20 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79      /* This only
1a600 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f   happens when co
1a610 64 69 6e 67 20 63 68 65 63 6b 20 63 6f 6e 73 74  ding check const
1a620 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  raints */.      
1a630 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1a640 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 43 4f  Printf(pOut, "CO
1a650 4c 55 4d 4e 28 25 64 29 22 2c 20 70 45 78 70 72  LUMN(%d)", pExpr
1a660 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
1a670 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a680 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1a690 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 7b 25 64  rintf(pOut, "{%d
1a6a0 3a 25 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 20  :%d}",.         
1a6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6c0 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
1a6d0 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  e, pExpr->iColum
1a6e0 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
1a6f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1a700 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
1a710 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ER: {.      if( 
1a720 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
1a730 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20  P_IntValue ){.  
1a740 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a750 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1a760 20 22 25 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e   "%d", pExpr->u.
1a770 69 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d  iValue);.      }
1a780 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
1a790 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1a7a0 74 66 28 70 4f 75 74 2c 20 22 25 73 22 2c 20 70  tf(pOut, "%s", p
1a7b0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
1a7c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1a7d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
1a7e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a7f0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
1a800 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
1a810 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1a820 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1a830 4f 75 74 2c 22 25 73 22 2c 20 70 45 78 70 72 2d  Out,"%s", pExpr-
1a840 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
1a850 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1a860 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
1a870 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
1a880 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1a890 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25 51 22  Printf(pOut,"%Q"
1a8a0 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1a8b0 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
1a8c0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1a8d0 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  TK_NULL: {.     
1a8e0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1a8f0 72 69 6e 74 66 28 70 4f 75 74 2c 22 4e 55 4c 4c  rintf(pOut,"NULL
1a900 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
1a910 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1a920 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f  QLITE_OMIT_BLOB_
1a930 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65  LITERAL.    case
1a940 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20   TK_BLOB: {.    
1a950 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1a960 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25 73 22  Printf(pOut,"%s"
1a970 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1a980 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
1a990 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1a9a0 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
1a9b0 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LE: {.      sqli
1a9c0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1a9d0 28 70 4f 75 74 2c 22 56 41 52 49 41 42 4c 45 28  (pOut,"VARIABLE(
1a9e0 25 73 2c 25 64 29 22 2c 0a 20 20 20 20 20 20 20  %s,%d)",.       
1a9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa00 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f      pExpr->u.zTo
1aa10 6b 65 6e 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ken, pExpr->iCol
1aa20 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  umn);.      brea
1aa30 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1aa40 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b  e TK_REGISTER: {
1aa50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1aa60 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1aa70 2c 22 52 45 47 49 53 54 45 52 28 25 64 29 22 2c  ,"REGISTER(%d)",
1aa80 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b   pExpr->iTable);
1aa90 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1aaa0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1aab0 41 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AS: {.      sqli
1aac0 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
1aad0 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  Out, pExpr->pLef
1aae0 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
1aaf0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1ab00 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a  QLITE_OMIT_CAST.
1ab10 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54      case TK_CAST
1ab20 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70  : {.      /* Exp
1ab30 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
1ab40 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65  form:   CAST(pLe
1ab50 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a  ft AS token) */.
1ab60 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1ab70 20 2a 7a 41 66 66 20 3d 20 22 75 6e 6b 22 3b 0a   *zAff = "unk";.
1ab80 20 20 20 20 20 20 73 77 69 74 63 68 28 20 73 71        switch( sq
1ab90 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
1aba0 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  e(pExpr->u.zToke
1abb0 6e 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  n, 0) ){.       
1abc0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
1abd0 5f 54 45 58 54 3a 20 20 20 20 7a 41 66 66 20 3d  _TEXT:    zAff =
1abe0 20 22 54 45 58 54 22 3b 20 20 20 20 20 62 72 65   "TEXT";     bre
1abf0 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
1ac00 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
1ac10 3a 20 20 20 20 7a 41 66 66 20 3d 20 22 4e 4f 4e  :    zAff = "NON
1ac20 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  E";     break;. 
1ac30 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
1ac40 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3a 20  TE_AFF_NUMERIC: 
1ac50 7a 41 66 66 20 3d 20 22 4e 55 4d 45 52 49 43 22  zAff = "NUMERIC"
1ac60 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
1ac70 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
1ac80 46 5f 49 4e 54 45 47 45 52 3a 20 7a 41 66 66 20  F_INTEGER: zAff 
1ac90 3d 20 22 49 4e 54 45 47 45 52 22 3b 20 20 62 72  = "INTEGER";  br
1aca0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
1acb0 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  e SQLITE_AFF_REA
1acc0 4c 3a 20 20 20 20 7a 41 66 66 20 3d 20 22 52 45  L:    zAff = "RE
1acd0 41 4c 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  AL";     break;.
1ace0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1acf0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1ad00 74 66 28 70 4f 75 74 2c 20 22 43 41 53 54 2d 25  tf(pOut, "CAST-%
1ad10 73 28 22 2c 20 7a 41 66 66 29 3b 0a 20 20 20 20  s(", zAff);.    
1ad20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1ad30 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72  Expr(pOut, pExpr
1ad40 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
1ad50 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1ad60 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b  intf(pOut, ")");
1ad70 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ad80 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
1ad90 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a  LITE_OMIT_CAST *
1ada0 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  /.    case TK_LT
1adb0 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  :      zBinOp = 
1adc0 22 4c 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  "LT";     break;
1add0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
1ade0 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22        zBinOp = "
1adf0 4c 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  LE";     break;.
1ae00 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20      case TK_GT: 
1ae10 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 47       zBinOp = "G
1ae20 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  T";     break;. 
1ae30 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 20     case TK_GE:  
1ae40 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 47 45      zBinOp = "GE
1ae50 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
1ae60 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20    case TK_NE:   
1ae70 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4e 45 22     zBinOp = "NE"
1ae80 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
1ae90 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20   case TK_EQ:    
1aea0 20 20 7a 42 69 6e 4f 70 20 3d 20 22 45 51 22 3b    zBinOp = "EQ";
1aeb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1aec0 63 61 73 65 20 54 4b 5f 49 53 3a 20 20 20 20 20  case TK_IS:     
1aed0 20 7a 42 69 6e 4f 70 20 3d 20 22 49 53 22 3b 20   zBinOp = "IS"; 
1aee0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1aef0 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 20 20  ase TK_ISNOT:   
1af00 7a 42 69 6e 4f 70 20 3d 20 22 49 53 4e 4f 54 22  zBinOp = "ISNOT"
1af10 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
1af20 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20 7a  se TK_AND:     z
1af30 42 69 6e 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20  BinOp = "AND";  
1af40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1af50 65 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 42  e TK_OR:      zB
1af60 69 6e 4f 70 20 3d 20 22 4f 52 22 3b 20 20 20 20  inOp = "OR";    
1af70 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1af80 20 54 4b 5f 50 4c 55 53 3a 20 20 20 20 7a 42 69   TK_PLUS:    zBi
1af90 6e 4f 70 20 3d 20 22 41 44 44 22 3b 20 20 20 20  nOp = "ADD";    
1afa0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1afb0 54 4b 5f 53 54 41 52 3a 20 20 20 20 7a 42 69 6e  TK_STAR:    zBin
1afc0 4f 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20 62  Op = "MUL";    b
1afd0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1afe0 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a 42 69 6e 4f  K_MINUS:   zBinO
1aff0 70 20 3d 20 22 53 55 42 22 3b 20 20 20 20 62 72  p = "SUB";    br
1b000 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1b010 5f 52 45 4d 3a 20 20 20 20 20 7a 42 69 6e 4f 70  _REM:     zBinOp
1b020 20 3d 20 22 52 45 4d 22 3b 20 20 20 20 62 72 65   = "REM";    bre
1b030 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1b040 42 49 54 41 4e 44 3a 20 20 7a 42 69 6e 4f 70 20  BITAND:  zBinOp 
1b050 3d 20 22 42 49 54 41 4e 44 22 3b 20 62 72 65 61  = "BITAND"; brea
1b060 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
1b070 49 54 4f 52 3a 20 20 20 7a 42 69 6e 4f 70 20 3d  ITOR:   zBinOp =
1b080 20 22 42 49 54 4f 52 22 3b 20 20 62 72 65 61 6b   "BITOR";  break
1b090 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c  ;.    case TK_SL
1b0a0 41 53 48 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20  ASH:   zBinOp = 
1b0b0 22 44 49 56 22 3b 20 20 20 20 62 72 65 61 6b 3b  "DIV";    break;
1b0c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48  .    case TK_LSH
1b0d0 49 46 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22  IFT:  zBinOp = "
1b0e0 4c 53 48 49 46 54 22 3b 20 62 72 65 61 6b 3b 0a  LSHIFT"; break;.
1b0f0 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49      case TK_RSHI
1b100 46 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 52  FT:  zBinOp = "R
1b110 53 48 49 46 54 22 3b 20 62 72 65 61 6b 3b 0a 20  SHIFT"; break;. 
1b120 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41     case TK_CONCA
1b130 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 43 4f  T:  zBinOp = "CO
1b140 4e 43 41 54 22 3b 20 62 72 65 61 6b 3b 0a 0a 20  NCAT"; break;.. 
1b150 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
1b160 53 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22 55 4d  S:  zUniOp = "UM
1b170 49 4e 55 53 22 3b 20 62 72 65 61 6b 3b 0a 20 20  INUS"; break;.  
1b180 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
1b190 20 20 20 7a 55 6e 69 4f 70 20 3d 20 22 55 50 4c     zUniOp = "UPL
1b1a0 55 53 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  US";  break;.   
1b1b0 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a   case TK_BITNOT:
1b1c0 20 20 7a 55 6e 69 4f 70 20 3d 20 22 42 49 54 4e    zUniOp = "BITN
1b1d0 4f 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  OT"; break;.    
1b1e0 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20 20  case TK_NOT:    
1b1f0 20 7a 55 6e 69 4f 70 20 3d 20 22 4e 4f 54 22 3b   zUniOp = "NOT";
1b200 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1b210 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20  ase TK_ISNULL:  
1b220 7a 55 6e 69 4f 70 20 3d 20 22 49 53 4e 55 4c 4c  zUniOp = "ISNULL
1b230 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
1b240 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a  se TK_NOTNULL: z
1b250 55 6e 69 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c  UniOp = "NOTNULL
1b260 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63  "; break;..    c
1b270 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20  ase TK_COLLATE: 
1b280 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1b290 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c  xplainExpr(pOut,
1b2a0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
1b2b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b2c0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1b2d0 22 2e 43 4f 4c 4c 41 54 45 28 25 73 29 22 2c 70  ".COLLATE(%s)",p
1b2e0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
1b2f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1b300 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
1b310 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  _AGG_FUNCTION:. 
1b320 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
1b330 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  ION: {.      Exp
1b340 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20  rList *pFarg;   
1b350 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
1b360 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
1b370 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45  s */.      if( E
1b380 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1b390 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
1b3a0 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ly) ){.        p
1b3b0 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  Farg = 0;.      
1b3c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
1b3d0 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Farg = pExpr->x.
1b3e0 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pList;.      }. 
1b3f0 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f       if( op==TK_
1b400 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a  AGG_FUNCTION ){.
1b410 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1b420 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1b430 74 2c 20 22 41 47 47 5f 46 55 4e 43 54 49 4f 4e  t, "AGG_FUNCTION
1b440 25 64 3a 25 73 28 22 2c 0a 20 20 20 20 20 20 20  %d:%s(",.       
1b450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b460 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32        pExpr->op2
1b470 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1b480 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
1b490 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b4a0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1b4b0 75 74 2c 20 22 46 55 4e 43 54 49 4f 4e 3a 25 73  ut, "FUNCTION:%s
1b4c0 28 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  (", pExpr->u.zTo
1b4d0 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ken);.      }.  
1b4e0 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b      if( pFarg ){
1b4f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b500 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28  ExplainExprList(
1b510 70 4f 75 74 2c 20 70 46 61 72 67 29 3b 0a 20 20  pOut, pFarg);.  
1b520 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1b530 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1b540 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20 20  (pOut, ")");.   
1b550 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1b560 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b570 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
1b580 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
1b590 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1b5a0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1b5b0 75 74 2c 20 22 45 58 49 53 54 53 28 22 29 3b 0a  ut, "EXISTS(");.
1b5c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b5d0 6c 61 69 6e 53 65 6c 65 63 74 28 70 4f 75 74 2c  lainSelect(pOut,
1b5e0 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
1b5f0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1b600 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1b610 4f 75 74 2c 22 29 22 29 3b 0a 20 20 20 20 20 20  Out,")");.      
1b620 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1b630 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
1b640 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1b650 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1b660 75 74 2c 20 22 28 22 29 3b 0a 20 20 20 20 20 20  ut, "(");.      
1b670 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65  sqlite3ExplainSe
1b680 6c 65 63 74 28 70 4f 75 74 2c 20 70 45 78 70 72  lect(pOut, pExpr
1b690 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
1b6a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1b6b0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1b6c0 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  )");.      break
1b6d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1b6e0 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
1b6f0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1b700 69 6e 74 66 28 70 4f 75 74 2c 20 22 49 4e 28 22  intf(pOut, "IN("
1b710 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b720 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74  ExplainExpr(pOut
1b730 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
1b740 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1b750 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1b760 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 69 66  , ",");.      if
1b770 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1b780 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
1b790 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
1b7a0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b7b0 53 65 6c 65 63 74 28 70 4f 75 74 2c 20 70 45 78  Select(pOut, pEx
1b7c0 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a  pr->x.pSelect);.
1b7d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b7e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1b7f0 61 69 6e 45 78 70 72 4c 69 73 74 28 70 4f 75 74  ainExprList(pOut
1b800 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
1b810 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1b820 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1b830 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29  rintf(pOut, ")")
1b840 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1b850 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
1b860 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1b870 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20  ERY */..    /*. 
1b880 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45     **    x BETWE
1b890 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a  EN y AND z.    *
1b8a0 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73  *.    ** This is
1b8b0 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20   equivalent to. 
1b8c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1b8d0 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20  x>=y AND x<=z.  
1b8e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73    **.    ** X is
1b8f0 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
1b900 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20  ->pLeft..    ** 
1b910 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  Y is stored in p
1b920 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30  Expr->pList->a[0
1b930 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20  ].pExpr..    ** 
1b940 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  Z is stored in p
1b950 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31  Expr->pList->a[1
1b960 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a  ].pExpr..    */.
1b970 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
1b980 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  EEN: {.      Exp
1b990 72 20 2a 70 58 20 3d 20 70 45 78 70 72 2d 3e 70  r *pX = pExpr->p
1b9a0 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72  Left;.      Expr
1b9b0 20 2a 70 59 20 3d 20 70 45 78 70 72 2d 3e 78 2e   *pY = pExpr->x.
1b9c0 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
1b9d0 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  r;.      Expr *p
1b9e0 5a 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  Z = pExpr->x.pLi
1b9f0 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
1ba00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1ba10 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1ba20 20 22 42 45 54 57 45 45 4e 28 22 29 3b 0a 20 20   "BETWEEN(");.  
1ba30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1ba40 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 58 29  inExpr(pOut, pX)
1ba50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1ba60 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1ba70 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 73  t, ",");.      s
1ba80 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1ba90 72 28 70 4f 75 74 2c 20 70 59 29 3b 0a 20 20 20  r(pOut, pY);.   
1baa0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1bab0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c  nPrintf(pOut, ",
1bac0 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
1bad0 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75  3ExplainExpr(pOu
1bae0 74 2c 20 70 5a 29 3b 0a 20 20 20 20 20 20 73 71  t, pZ);.      sq
1baf0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1bb00 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20  tf(pOut, ")");. 
1bb10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bb20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52  }.    case TK_TR
1bb30 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f  IGGER: {.      /
1bb40 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20  * If the opcode 
1bb50 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74  is TK_TRIGGER, t
1bb60 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
1bb70 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  on is a referenc
1bb80 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20  e.      ** to a 
1bb90 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65  column in the ne
1bba0 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65  w.* or old.* pse
1bbb0 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c  udo-tables avail
1bbc0 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  able to.      **
1bbd0 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
1bbe0 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
1bbf0 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73  Expr.iTable is s
1bc00 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a  et to 1 for the.
1bc10 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70        ** new.* p
1bc20 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20  seudo-table, or 
1bc30 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20  0 for the old.* 
1bc40 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78  pseudo-table. Ex
1bc50 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20  pr.iColumn.     
1bc60 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68   ** is set to th
1bc70 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
1bc80 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20  pseudo-table to 
1bc90 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74  read, or to -1 t
1bca0 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20  o.      ** read 
1bcb0 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e  the rowid field.
1bcc0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1bcd0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1bce0 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 73 28 25  intf(pOut, "%s(%
1bcf0 64 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  d)", .          
1bd00 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20  pExpr->iTable ? 
1bd10 22 4e 45 57 22 20 3a 20 22 4f 4c 44 22 2c 20 70  "NEW" : "OLD", p
1bd20 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
1bd30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1bd40 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
1bd50 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ASE: {.      sql
1bd60 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1bd70 66 28 70 4f 75 74 2c 20 22 43 41 53 45 28 22 29  f(pOut, "CASE(")
1bd80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1bd90 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c  xplainExpr(pOut,
1bda0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
1bdb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1bdc0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1bdd0 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 73 71 6c   ",");.      sql
1bde0 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c  ite3ExplainExprL
1bdf0 69 73 74 28 70 4f 75 74 2c 20 70 45 78 70 72 2d  ist(pOut, pExpr-
1be00 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  >x.pList);.     
1be10 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
1be20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1be30 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61  T_TRIGGER.    ca
1be40 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20  se TK_RAISE: {. 
1be50 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1be60 2a 7a 54 79 70 65 20 3d 20 22 75 6e 6b 22 3b 0a  *zType = "unk";.
1be70 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70 45        switch( pE
1be80 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 29 7b  xpr->affinity ){
1be90 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 45  .        case OE
1bea0 5f 52 6f 6c 6c 62 61 63 6b 3a 20 20 20 7a 54 79  _Rollback:   zTy
1beb0 70 65 20 3d 20 22 72 6f 6c 6c 62 61 63 6b 22 3b  pe = "rollback";
1bec0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1bed0 20 63 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a 20   case OE_Abort: 
1bee0 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 61 62       zType = "ab
1bef0 6f 72 74 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  ort";     break;
1bf00 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 45  .        case OE
1bf10 5f 46 61 69 6c 3a 20 20 20 20 20 20 20 7a 54 79  _Fail:       zTy
1bf20 70 65 20 3d 20 22 66 61 69 6c 22 3b 20 20 20 20  pe = "fail";    
1bf30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1bf40 20 63 61 73 65 20 4f 45 5f 49 67 6e 6f 72 65 3a   case OE_Ignore:
1bf50 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 69 67       zType = "ig
1bf60 6e 6f 72 65 22 3b 20 20 20 20 62 72 65 61 6b 3b  nore";    break;
1bf70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1bf80 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1bf90 6e 74 66 28 70 4f 75 74 2c 20 22 52 41 49 53 45  ntf(pOut, "RAISE
1bfa0 2d 25 73 28 25 73 29 22 2c 20 7a 54 79 70 65 2c  -%s(%s)", zType,
1bfb0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1bfc0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1bfd0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
1bfe0 0a 20 20 69 66 28 20 7a 42 69 6e 4f 70 20 29 7b  .  if( zBinOp ){
1bff0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
1c000 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22  ainPrintf(pOut,"
1c010 25 73 28 22 2c 20 7a 42 69 6e 4f 70 29 3b 0a 20  %s(", zBinOp);. 
1c020 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1c030 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70  nExpr(pOut, pExp
1c040 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  r->pLeft);.    s
1c050 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1c060 6e 74 66 28 70 4f 75 74 2c 22 2c 22 29 3b 0a 20  ntf(pOut,",");. 
1c070 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1c080 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70  nExpr(pOut, pExp
1c090 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
1c0a0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1c0b0 69 6e 74 66 28 70 4f 75 74 2c 22 29 22 29 3b 0a  intf(pOut,")");.
1c0c0 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 55 6e 69    }else if( zUni
1c0d0 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Op ){.    sqlite
1c0e0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1c0f0 4f 75 74 2c 22 25 73 28 22 2c 20 7a 55 6e 69 4f  Out,"%s(", zUniO
1c100 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  p);.    sqlite3E
1c110 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c  xplainExpr(pOut,
1c120 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
1c130 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1c140 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 29  inPrintf(pOut,")
1c150 22 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  ");.  }.}.#endif
1c160 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
1c170 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
1c180 58 50 4c 41 49 4e 29 20 2a 2f 0a 0a 23 69 66 20  XPLAIN) */..#if 
1c190 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1c1a0 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41  NABLE_TREE_EXPLA
1c1b0 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  IN)./*.** Genera
1c1c0 74 65 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61  te a human-reada
1c1d0 62 6c 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20  ble explanation 
1c1e0 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
1c1f0 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73   list..*/.void s
1c200 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1c210 72 4c 69 73 74 28 56 64 62 65 20 2a 70 4f 75 74  rList(Vdbe *pOut
1c220 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
1c230 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
1c240 66 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  f( pList==0 || p
1c250 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29  List->nExpr==0 )
1c260 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
1c270 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1c280 20 22 28 65 6d 70 74 79 2d 6c 69 73 74 29 22 29   "(empty-list)")
1c290 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1c2a0 7d 65 6c 73 65 20 69 66 28 20 70 4c 69 73 74 2d  }else if( pList-
1c2b0 3e 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20  >nExpr==1 ){.   
1c2c0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1c2d0 78 70 72 28 70 4f 75 74 2c 20 70 4c 69 73 74 2d  xpr(pOut, pList-
1c2e0 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
1c2f0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
1c300 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70 4f  e3ExplainPush(pO
1c310 75 74 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ut);.    for(i=0
1c320 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
1c330 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
1c340 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1c350 74 66 28 70 4f 75 74 2c 20 22 69 74 65 6d 5b 25  tf(pOut, "item[%
1c360 64 5d 20 3d 20 22 2c 20 69 29 3b 0a 20 20 20 20  d] = ", i);.    
1c370 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1c380 50 75 73 68 28 70 4f 75 74 29 3b 0a 20 20 20 20  Push(pOut);.    
1c390 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1c3a0 45 78 70 72 28 70 4f 75 74 2c 20 70 4c 69 73 74  Expr(pOut, pList
1c3b0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
1c3c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1c3d0 61 69 6e 50 6f 70 28 70 4f 75 74 29 3b 0a 20 20  ainPop(pOut);.  
1c3e0 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
1c3f0 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  [i].zName ){.   
1c400 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1c410 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1c420 22 20 41 53 20 25 73 22 2c 20 70 4c 69 73 74 2d  " AS %s", pList-
1c430 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
1c440 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1c450 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 62 53 70 61  pList->a[i].bSpa
1c460 6e 49 73 54 61 62 20 29 7b 0a 20 20 20 20 20 20  nIsTab ){.      
1c470 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1c480 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 20 28  Printf(pOut, " (
1c490 25 73 29 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  %s)", pList->a[i
1c4a0 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20  ].zSpan);.      
1c4b0 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c 70 4c  }.      if( i<pL
1c4c0 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a  ist->nExpr-1 ){.
1c4d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1c4e0 78 70 6c 61 69 6e 4e 4c 28 70 4f 75 74 29 3b 0a  xplainNL(pOut);.
1c4f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1c500 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1c510 50 6f 70 28 70 4f 75 74 29 3b 0a 20 20 7d 0a 7d  Pop(pOut);.  }.}
1c520 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1c530 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a  E_DEBUG */../*.*
1c540 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1c550 74 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20  that pushes the 
1c560 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65  value of every e
1c570 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69  lement of the gi
1c580 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
1c590 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65  n list into a se
1c5a0 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
1c5b0 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ers beginning at
1c5c0 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52   target..**.** R
1c5d0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1c5e0 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61   of elements eva
1c5f0 6c 75 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  luated..**.** Th
1c600 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  e SQLITE_ECEL_DU
1c610 50 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20  P flag prevents 
1c620 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72  the arguments fr
1c630 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c  om being.** fill
1c640 65 64 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70  ed using OP_SCop
1c650 79 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74  y.  OP_Copy must
1c660 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64   be used instead
1c670 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
1c680 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20 61  TE_ECEL_FACTOR a
1c690 72 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63  rgument allows c
1c6a0 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
1c6b0 73 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f  s to be.** facto
1c6c0 72 65 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69  red out into ini
1c6d0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65  tialization code
1c6e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1c6f0 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
1c700 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1c710 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
1c720 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
1c730 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
1c740 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
1c750 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63  ion list to be c
1c760 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61  oded */.  int ta
1c770 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  rget,        /* 
1c780 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 72  Where to write r
1c790 65 73 75 6c 74 73 20 2a 2f 0a 20 20 75 38 20 66  esults */.  u8 f
1c7a0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
1c7b0 2a 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20  * SQLITE_ECEL_* 
1c7c0 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74  flags */.){.  st
1c7d0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
1c7e0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
1c7f0 20 69 2c 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79   i, n;.  u8 copy
1c800 4f 70 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  Op = (flags & SQ
1c810 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f  LITE_ECEL_DUP) ?
1c820 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43   OP_Copy : OP_SC
1c830 6f 70 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70  opy;.  assert( p
1c840 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  List!=0 );.  ass
1c850 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b  ert( target>0 );
1c860 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1c870 65 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b 20 20  e->pVdbe!=0 );  
1c880 2f 2a 20 4e 65 76 65 72 20 67 65 74 73 20 74 68  /* Never gets th
1c890 69 73 20 66 61 72 20 6f 74 68 65 72 77 69 73 65  is far otherwise
1c8a0 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d   */.  n = pList-
1c8b0 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 21 43  >nExpr;.  if( !C
1c8c0 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61  onstFactorOk(pPa
1c8d0 72 73 65 29 20 29 20 66 6c 61 67 73 20 26 3d 20  rse) ) flags &= 
1c8e0 7e 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43  ~SQLITE_ECEL_FAC
1c8f0 54 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  TOR;.  for(pItem
1c900 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
1c910 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  i<n; i++, pItem+
1c920 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
1c930 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  xpr = pItem->pEx
1c940 70 72 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61  pr;.    if( (fla
1c950 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs & SQLITE_ECEL
1c960 5f 46 41 43 54 4f 52 29 21 3d 30 20 26 26 20 73  _FACTOR)!=0 && s
1c970 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
1c980 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20  tant(pExpr) ){. 
1c990 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1c9a0 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73  CodeAtInit(pPars
1c9b0 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
1c9c0 2b 69 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  +i, 0);.    }els
1c9d0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 52  e{.      int inR
1c9e0 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
1c9f0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
1ca00 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
1ca10 2b 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  +i);.      if( i
1ca20 6e 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29  nReg!=target+i )
1ca30 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1ca40 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72  3VdbeAddOp2(pPar
1ca50 73 65 2d 3e 70 56 64 62 65 2c 20 63 6f 70 79 4f  se->pVdbe, copyO
1ca60 70 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74  p, inReg, target
1ca70 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +i);.      }.   
1ca80 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1ca90 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  n;.}../*.** Gene
1caa0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
1cab0 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72  BETWEEN operator
1cac0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54  ..**.**    x BET
1cad0 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a  WEEN y AND z.**.
1cae0 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20  ** The above is 
1caf0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a  equivalent to .*
1cb00 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44  *.**    x>=y AND
1cb10 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65   x<=z.**.** Code
1cb20 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b   it as such, tak
1cb30 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74  ing care to do t
1cb40 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70  he common subexp
1cb50 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 65 6d 65  ression.** eleme
1cb60 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2f  ntation of x..*/
1cb70 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
1cb80 72 43 6f 64 65 42 65 74 77 65 65 6e 28 0a 20 20  rCodeBetween(.  
1cb90 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1cba0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
1cbb0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
1cbc0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
1cbd0 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
1cbe0 2f 2a 20 54 68 65 20 42 45 54 57 45 45 4e 20 65  /* The BETWEEN e
1cbf0 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
1cc00 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20  nt dest,        
1cc10 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
1cc20 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b   the jump is tak
1cc30 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  en */.  int jump
1cc40 49 66 54 72 75 65 2c 20 20 20 2f 2a 20 54 61 6b  IfTrue,   /* Tak
1cc50 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68  e the jump if th
1cc60 65 20 42 45 54 57 45 45 4e 20 69 73 20 74 72 75  e BETWEEN is tru
1cc70 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49  e */.  int jumpI
1cc80 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65  fNull    /* Take
1cc90 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65   the jump if the
1cca0 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c   BETWEEN is NULL
1ccb0 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 65 78   */.){.  Expr ex
1ccc0 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68  prAnd;     /* Th
1ccd0 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 69  e AND operator i
1cce0 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a  n  x>=y AND x<=z
1ccf0 20 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70    */.  Expr comp
1cd00 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  Left;    /* The 
1cd10 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20   x>=y  term */. 
1cd20 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b   Expr compRight;
1cd30 20 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20     /* The  x<=z 
1cd40 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20   term */.  Expr 
1cd50 65 78 70 72 58 3b 20 20 20 20 20 20 20 2f 2a 20  exprX;       /* 
1cd60 54 68 65 20 20 78 20 20 73 75 62 65 78 70 72 65  The  x  subexpre
1cd70 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ssion */.  int r
1cd80 65 67 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20  egFree1 = 0; /* 
1cd90 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65  Temporary use re
1cda0 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  gister */..  ass
1cdb0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1cdc0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1cdd0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
1cde0 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e  exprX = *pExpr->
1cdf0 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64  pLeft;.  exprAnd
1ce00 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20  .op = TK_AND;.  
1ce10 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20  exprAnd.pLeft = 
1ce20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78 70  &compLeft;.  exp
1ce30 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63  rAnd.pRight = &c
1ce40 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d 70  ompRight;.  comp
1ce50 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b  Left.op = TK_GE;
1ce60 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66  .  compLeft.pLef
1ce70 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f  t = &exprX;.  co
1ce80 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20  mpLeft.pRight = 
1ce90 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
1cea0 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63 6f  a[0].pExpr;.  co
1ceb0 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f  mpRight.op = TK_
1cec0 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  LE;.  compRight.
1ced0 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a  pLeft = &exprX;.
1cee0 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67    compRight.pRig
1cef0 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ht = pExpr->x.pL
1cf00 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
1cf10 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65  .  exprToRegiste
1cf20 72 28 26 65 78 70 72 58 2c 20 73 71 6c 69 74 65  r(&exprX, sqlite
1cf30 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1cf40 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72  arse, &exprX, &r
1cf50 65 67 46 72 65 65 31 29 29 3b 0a 20 20 69 66 28  egFree1));.  if(
1cf60 20 6a 75 6d 70 49 66 54 72 75 65 20 29 7b 0a 20   jumpIfTrue ){. 
1cf70 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1cf80 54 72 75 65 28 70 50 61 72 73 65 2c 20 26 65 78  True(pParse, &ex
1cf90 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d  prAnd, dest, jum
1cfa0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73  pIfNull);.  }els
1cfb0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
1cfc0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1cfd0 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74  , &exprAnd, dest
1cfe0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1cff0 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
1d000 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1d010 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 0a 20  e, regFree1);.. 
1d020 20 2f 2a 20 45 6e 73 75 72 65 20 61 64 65 71 75   /* Ensure adequ
1d030 61 74 65 20 74 65 73 74 20 63 6f 76 65 72 61 67  ate test coverag
1d040 65 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  e */.  testcase(
1d050 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26   jumpIfTrue==0 &
1d060 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
1d070 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
1d080 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
1d090 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a  mpIfTrue==0 && j
1d0a0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
1d0b0 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
1d0c0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1d0d0 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70  fTrue==0 && jump
1d0e0 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
1d0f0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
1d100 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
1d110 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue==0 && jumpIfN
1d120 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
1d130 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
1d140 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21  ase( jumpIfTrue!
1d150 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
1d160 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  ==0 && regFree1=
1d170 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
1d180 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20  ( jumpIfTrue!=0 
1d190 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
1d1a0 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
1d1b0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  );.  testcase( j
1d1c0 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20  umpIfTrue!=0 && 
1d1d0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
1d1e0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1d1f0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1d200 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d  IfTrue!=0 && jum
1d210 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
1d220 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 7d 0a 0a  gFree1!=0 );.}..
1d230 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1d240 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61  ode for a boolea
1d250 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63  n expression suc
1d260 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73  h that a jump is
1d270 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20   made.** to the 
1d280 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20  label "dest" if 
1d290 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
1d2a0 73 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75  s true but execu
1d2b0 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  tion.** continue
1d2c0 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20  s straight thru 
1d2d0 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
1d2e0 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a  n is false..**.*
1d2f0 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
1d300 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ion evaluates to
1d310 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74   NULL (neither t
1d320 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20  rue nor false), 
1d330 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65  then.** take the
1d340 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d   jump if the jum
1d350 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20  pIfNull flag is 
1d360 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1d370 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  L..**.** This co
1d380 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  de depends on th
1d390 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72 74  e fact that cert
1d3a0 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73  ain token values
1d3b0 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20   (ex: TK_EQ).** 
1d3c0 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  are the same as 
1d3d0 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65  opcode values (e
1d3e0 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69  x: OP_Eq) that i
1d3f0 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72  mplement the cor
1d400 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70  responding.** op
1d410 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61  eration.  Specia
1d420 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64  l comments in vd
1d430 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f  be.c and the mko
1d440 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70  pcodeh.awk scrip
1d450 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65  t in.** the make
1d460 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20 74   process cause t
1d470 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61  hese values to a
1d480 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73  lign.  Assert()s
1d490 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20   in the code.** 
1d4a0 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61  below verify tha
1d4b0 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72  t the numbers ar
1d4c0 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63  e aligned correc
1d4d0 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tly..*/.void sql
1d4e0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 50  ite3ExprIfTrue(P
1d4f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1d500 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
1d510 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
1d520 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
1d530 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1d540 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
1d550 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
1d560 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
1d570 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c  2 = 0;.  int r1,
1d580 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   r2;..  assert( 
1d590 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
1d5a0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c  TE_JUMPIFNULL ||
1d5b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1d5c0 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
1d5d0 3d 30 29 20 29 20 20 20 20 20 72 65 74 75 72 6e  =0) )     return
1d5e0 3b 20 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20  ;  /* Existence 
1d5f0 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20  of VDBE checked 
1d600 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69  by caller */.  i
1d610 66 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d  f( NEVER(pExpr==
1d620 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  0) ) return;  /*
1d630 20 4e 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e   No way this can
1d640 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20   happen */.  op 
1d650 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73  = pExpr->op;.  s
1d660 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
1d670 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
1d680 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
1d690 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1d6a0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65  bel(v);.      te
1d6b0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1d6c0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
1d6d0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1d6e0 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
1d6f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1d700 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
1d710 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a  xpr->pLeft, d2,j
1d720 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45  umpIfNull^SQLITE
1d730 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
1d740 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1d750 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
1d760 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
1d770 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1d780 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1d790 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1d7a0 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   d2);.      sqli
1d7b0 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
1d7c0 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20  pParse, 1);.    
1d7d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1d7e0 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
1d7f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d800 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1d810 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1d820 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
1d830 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1d840 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1d850 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1d860 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
1d870 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1d880 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1d890 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
1d8a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1d8b0 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
1d8c0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1d8d0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1d8e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
1d8f0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
1d900 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
1d910 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1d920 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d930 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
1d940 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
1d950 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
1d960 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
1d970 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
1d980 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
1d990 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1d9a0 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b   TK_LT==OP_Lt );
1d9b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1d9c0 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  K_LE==OP_Le );. 
1d9d0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1d9e0 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20  GT==OP_Gt );.   
1d9f0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
1da00 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ge );.     
1da10 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d   assert( TK_EQ==
1da20 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61  OP_Eq );.      a
1da30 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50  ssert( TK_NE==OP
1da40 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _Ne );.      tes
1da50 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54  tcase( op==TK_LT
1da60 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1da70 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b  se( op==TK_LE );
1da80 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1da90 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20   op==TK_GT );.  
1daa0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1dab0 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20  ==TK_GE );.     
1dac0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1dad0 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65  K_EQ );.      te
1dae0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
1daf0 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
1db00 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1db10 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  =0 );.      r1 =
1db20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1db30 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1db40 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1db50 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
1db60 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1db70 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1db80 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
1db90 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63  gFree2);.      c
1dba0 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
1dbb0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1dbc0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1dbd0 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
1dbe0 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65        r1, r2, de
1dbf0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1dc00 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1dc10 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1dc20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1dc30 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
1dc40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1dc50 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
1dc60 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  :.    case TK_IS
1dc70 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
1dc80 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
1dc90 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1dca0 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  se( op==TK_ISNOT
1dcb0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
1dcc0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1dcd0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1dce0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1dcf0 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
1dd00 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1dd10 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1dd20 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
1dd30 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20  ree2);.      op 
1dd40 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20  = (op==TK_IS) ? 
1dd50 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20  TK_EQ : TK_NE;. 
1dd60 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
1dd70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1dd80 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
1dd90 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
1dda0 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
1ddb0 72 32 2c 20 64 65 73 74 2c 20 53 51 4c 49 54 45  r2, dest, SQLITE
1ddc0 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
1ddd0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1dde0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1ddf0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1de00 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
1de10 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1de20 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
1de30 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
1de40 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  LL: {.      asse
1de50 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f  rt( TK_ISNULL==O
1de60 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20  P_IsNull );.    
1de70 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
1de80 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  NULL==OP_NotNull
1de90 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1dea0 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
1deb0 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  L );.      testc
1dec0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
1ded0 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ULL );.      r1 
1dee0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1def0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1df00 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1df10 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71  Free1);.      sq
1df20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1df30 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29  v, op, r1, dest)
1df40 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1df50 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1df60 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1df70 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1df80 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
1df90 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1dfa0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1dfb0 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65    exprCodeBetwee
1dfc0 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
1dfd0 20 64 65 73 74 2c 20 31 2c 20 6a 75 6d 70 49 66   dest, 1, jumpIf
1dfe0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
1dff0 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
1e000 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
1e010 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
1e020 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
1e030 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d  nt destIfFalse =
1e040 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1e050 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
1e060 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d  int destIfNull =
1e070 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65   jumpIfNull ? de
1e080 73 74 20 3a 20 64 65 73 74 49 66 46 61 6c 73 65  st : destIfFalse
1e090 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1e0a0 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
1e0b0 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46  , pExpr, destIfF
1e0c0 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c  alse, destIfNull
1e0d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e0e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e0f0 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b  _Goto, 0, dest);
1e100 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1e110 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1e120 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
1e130 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e140 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
1e150 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72  fault: {.      r
1e160 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1e170 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1e180 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31  pExpr, &regFree1
1e190 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e1a0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1e1b0 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a  _If, r1, dest, j
1e1c0 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20  umpIfNull!=0);. 
1e1d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1e1e0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1e1f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1e200 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1e210 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e220 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
1e230 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1e240 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
1e250 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
1e260 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1e270 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a   regFree2);  .}.
1e280 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1e290 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65  code for a boole
1e2a0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75  an expression su
1e2b0 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69  ch that a jump i
1e2c0 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65  s made.** to the
1e2d0 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66   label "dest" if
1e2e0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1e2f0 69 73 20 66 61 6c 73 65 20 62 75 74 20 65 78 65  is false but exe
1e300 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e  cution.** contin
1e310 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72  ues straight thr
1e320 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  u if the express
1e330 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  ion is true..**.
1e340 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
1e350 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  sion evaluates t
1e360 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20  o NULL (neither 
1e370 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20  true nor false) 
1e380 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20  then.** jump if 
1e390 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53 51  jumpIfNull is SQ
1e3a0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
1e3b0 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  or fall through 
1e3c0 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a  if jumpIfNull.**
1e3d0 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73   is 0..*/.void s
1e3e0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1e3f0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1e400 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
1e410 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70  t dest, int jump
1e420 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20  IfNull){.  Vdbe 
1e430 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1e440 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
1e450 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  ;.  int regFree1
1e460 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
1e470 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree2 = 0;.  int 
1e480 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72  r1, r2;..  asser
1e490 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  t( jumpIfNull==S
1e4a0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1e4b0 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   || jumpIfNull==
1e4c0 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  0 );.  if( NEVER
1e4d0 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  (v==0) ) return;
1e4e0 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66   /* Existence of
1e4f0 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79   VDBE checked by
1e500 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28   caller */.  if(
1e510 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20 20 72   pExpr==0 )    r
1e520 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65  eturn;..  /* The
1e530 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d   value of pExpr-
1e540 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72  >op and op are r
1e550 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  elated as follow
1e560 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
1e570 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20     pExpr->op    
1e580 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20          op.  ** 
1e590 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20        --------- 
1e5a0 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d           -------
1e5b0 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ---.  **       T
1e5c0 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20  K_ISNULL        
1e5d0 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a    OP_NotNull.  *
1e5e0 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55  *       TK_NOTNU
1e5f0 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73  LL         OP_Is
1e600 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20  Null.  **       
1e610 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20  TK_NE           
1e620 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20     OP_Eq.  **   
1e630 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20      TK_EQ       
1e640 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a         OP_Ne.  *
1e650 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20  *       TK_GT   
1e660 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65             OP_Le
1e670 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c  .  **       TK_L
1e680 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
1e690 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Gt.  **       
1e6a0 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20 20  TK_GE           
1e6b0 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20     OP_Lt.  **   
1e6c0 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20      TK_LT       
1e6d0 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a         OP_Ge.  *
1e6e0 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72  *.  ** For other
1e6f0 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72   values of pExpr
1e700 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65  ->op, op is unde
1e710 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64  fined and unused
1e720 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65  ..  ** The value
1e730 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20   of TK_ and OP_ 
1e740 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72  constants are ar
1e750 72 61 6e 67 65 64 20 73 75 63 68 20 74 68 61 74  ranged such that
1e760 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d   we.  ** can com
1e770 70 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67  pute the mapping
1e780 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65   above using the
1e790 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65   following expre
1e7a0 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65  ssion..  ** Asse
1e7b0 72 74 28 29 73 20 76 65 72 69 66 79 20 74 68 61  rt()s verify tha
1e7c0 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f  t the computatio
1e7d0 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20  n is correct..  
1e7e0 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70  */.  op = ((pExp
1e7f0 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c  r->op+(TK_ISNULL
1e800 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55  &1))^1)-(TK_ISNU
1e810 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72  LL&1);..  /* Ver
1e820 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67  ify correct alig
1e830 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64  nment of TK_ and
1e840 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20   OP_ constants. 
1e850 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45   */.  assert( pE
1e860 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55  xpr->op!=TK_ISNU
1e870 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74  LL || op==OP_Not
1e880 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Null );.  assert
1e890 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1e8a0 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f  NOTNULL || op==O
1e8b0 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73  P_IsNull );.  as
1e8c0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
1e8d0 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_NE || op==OP
1e8e0 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Eq );.  assert(
1e8f0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45   pExpr->op!=TK_E
1e900 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29  Q || op==OP_Ne )
1e910 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1e920 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20  r->op!=TK_LT || 
1e930 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61  op==OP_Ge );.  a
1e940 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1e950 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_LE || op==O
1e960 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Gt );.  assert
1e970 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1e980 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20  GT || op==OP_Le 
1e990 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
1e9a0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c  pr->op!=TK_GE ||
1e9b0 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20   op==OP_Lt );.. 
1e9c0 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
1e9d0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
1e9e0 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74  K_AND: {.      t
1e9f0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1ea00 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1ea10 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1ea20 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
1ea30 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
1ea40 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1ea50 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
1ea60 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
1ea70 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
1ea80 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1ea90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1eaa0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  }.    case TK_OR
1eab0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32  : {.      int d2
1eac0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1ead0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
1eae0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1eaf0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1eb00 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1eb10 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
1eb20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1eb30 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
1eb40 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
1eb50 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51  2, jumpIfNull^SQ
1eb60 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
1eb70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1eb80 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1eb90 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1eba0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1ebb0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
1ebc0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1ebd0 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20  el(v, d2);.     
1ebe0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1ebf0 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
1ec00 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ec10 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1ec20 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
1ec30 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1ec40 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
1ec50 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
1ec60 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1ec70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
1ec80 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
1ec90 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1eca0 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
1ecb0 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
1ecc0 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
1ecd0 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
1ece0 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
1ecf0 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
1ed00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1ed10 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20  ==TK_LT );.     
1ed20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1ed30 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_LE );.      te
1ed40 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47  stcase( op==TK_G
1ed50 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
1ed60 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29  ase( op==TK_GE )
1ed70 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ed80 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20  ( op==TK_EQ );. 
1ed90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1eda0 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20  p==TK_NE );.    
1edb0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1edc0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1edd0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1ede0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1edf0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1ee00 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1ee10 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1ee20 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1ee30 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1ee40 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
1ee50 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
1ee60 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1ee70 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
1ee80 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
1ee90 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
1eea0 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r2, dest, jumpI
1eeb0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 74 65  fNull);.      te
1eec0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1eed0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
1eee0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
1eef0 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1ef00 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1ef10 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73  e TK_IS:.    cas
1ef20 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20  e TK_ISNOT: {.  
1ef30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
1ef40 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29  xpr->op==TK_IS )
1ef50 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ef60 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1ef70 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72  ISNOT );.      r
1ef80 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1ef90 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1efa0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1efb0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1efc0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
1efd0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1efe0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1eff0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
1f000 20 20 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f    op = (pExpr->o
1f010 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e  p==TK_IS) ? TK_N
1f020 45 20 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20  E : TK_EQ;.     
1f030 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
1f040 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1f050 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
1f060 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
1f070 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
1f080 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e 55 4c  dest, SQLITE_NUL
1f090 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LEQ);.      test
1f0a0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1f0b0 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1f0c0 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1f0d0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1f0e0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1f0f0 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
1f100 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
1f110 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1f120 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
1f130 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f140 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
1f150 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  L );.      r1 = 
1f160 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1f170 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1f180 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1f190 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
1f1a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1f1b0 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a   op, r1, dest);.
1f1c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f1d0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1f1e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f1f0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  }.    case TK_BE
1f200 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74  TWEEN: {.      t
1f210 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1f220 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1f230 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
1f240 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
1f250 65 73 74 2c 20 30 2c 20 6a 75 6d 70 49 66 4e 75  est, 0, jumpIfNu
1f260 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
1f270 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1f280 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1f290 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
1f2a0 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  _IN: {.      if(
1f2b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20   jumpIfNull ){. 
1f2c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1f2d0 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
1f2e0 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65   pExpr, dest, de
1f2f0 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
1f300 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64 65  {.        int de
1f310 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  stIfNull = sqlit
1f320 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1f330 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
1f340 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
1f350 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
1f360 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  t, destIfNull);.
1f370 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1f380 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1f390 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  v, destIfNull);.
1f3a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1f3b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
1f3c0 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  f.    default: {
1f3d0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1f3e0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1f3f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
1f400 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1f410 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f420 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p3(v, OP_IfNot, 
1f430 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r1, dest, jumpIf
1f440 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20  Null!=0);.      
1f450 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1f460 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1f470 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1f480 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1f490 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1f4a0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
1f4b0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1f4c0 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
1f4d0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1f4e0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
1f4f0 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ree2);.}../*.** 
1f500 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72  Do a deep compar
1f510 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72  ison of two expr
1f520 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52  ession trees.  R
1f530 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74  eturn 0 if the t
1f540 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  wo.** expression
1f550 73 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79  s are completely
1f560 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 52 65 74   identical.  Ret
1f570 75 72 6e 20 31 20 69 66 20 74 68 65 79 20 64 69  urn 1 if they di
1f580 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20  ffer only.** by 
1f590 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  a COLLATE operat
1f5a0 6f 72 20 61 74 20 74 68 65 20 74 6f 70 20 6c 65  or at the top le
1f5b0 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 32 20 69  vel.  Return 2 i
1f5c0 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66  f there are diff
1f5d0 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72  erences.** other
1f5e0 20 74 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65   than the top-le
1f5f0 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  vel COLLATE oper
1f600 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ator..**.** If a
1f610 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66  ny subelement of
1f620 20 70 42 20 68 61 73 20 45 78 70 72 2e 69 54 61   pB has Expr.iTa
1f630 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69  ble==(-1) then i
1f640 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  t is allowed.** 
1f650 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c  to compare equal
1f660 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e   to an equivalen
1f670 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20  t element in pA 
1f680 77 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65  with Expr.iTable
1f690 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68  ==iTab..**.** Th
1f6a0 65 20 70 41 20 73 69 64 65 20 6d 69 67 68 74 20  e pA side might 
1f6b0 62 65 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49  be using TK_REGI
1f6c0 53 54 45 52 2e 20 20 49 66 20 74 68 61 74 20 69  STER.  If that i
1f6d0 73 20 74 68 65 20 63 61 73 65 20 61 6e 64 20 70  s the case and p
1f6e0 42 20 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e  B is.** not usin
1f6f0 67 20 54 4b 5f 52 45 47 49 53 54 45 52 20 62 75  g TK_REGISTER bu
1f700 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 65  t is otherwise e
1f710 71 75 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20  quivalent, then 
1f720 73 74 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a  still return 0..
1f730 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
1f740 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
1f750 6c 20 72 65 74 75 72 6e 20 32 20 65 76 65 6e 20  l return 2 even 
1f760 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65  if the two expre
1f770 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79  ssions.** really
1f780 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e   are equivalent.
1f790 20 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70    If we cannot p
1f7a0 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 65 78  rove that the ex
1f7b0 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a  pressions are.**
1f7c0 20 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72   identical, we r
1f7d0 65 74 75 72 6e 20 32 20 6a 75 73 74 20 74 6f 20  eturn 2 just to 
1f7e0 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20  be safe.  So if 
1f7f0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
1f800 72 65 74 75 72 6e 73 20 32 2c 20 74 68 65 6e 20  returns 2, then 
1f810 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c  you do not reall
1f820 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61  y know for certa
1f830 69 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a  in if the two.**
1f840 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
1f850 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20   the same.  But 
1f860 69 66 20 79 6f 75 20 67 65 74 20 61 20 30 20 6f  if you get a 0 o
1f870 72 20 31 20 72 65 74 75 72 6e 2c 20 74 68 65 6e  r 1 return, then
1f880 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73   you.** can be s
1f890 75 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ure the expressi
1f8a0 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ons are the same
1f8b0 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73  .  In the places
1f8c0 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72   where.** this r
1f8d0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20  outine is used, 
1f8e0 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74  it does not hurt
1f8f0 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61   to get an extra
1f900 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73   2 - that.** jus
1f910 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
1f920 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20  n some slightly 
1f930 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75  slower code.  Bu
1f940 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61  t returning.** a
1f950 6e 20 69 6e 63 6f 72 72 65 63 74 20 30 20 6f 72  n incorrect 0 or
1f960 20 31 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f   1 could lead to
1f970 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a   a malfunction..
1f980 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
1f990 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a  prCompare(Expr *
1f9a0 70 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e  pA, Expr *pB, in
1f9b0 74 20 69 54 61 62 29 7b 0a 20 20 75 33 32 20 63  t iTab){.  u32 c
1f9c0 6f 6d 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20  ombinedFlags;.  
1f9d0 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d  if( pA==0 || pB=
1f9e0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1f9f0 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b   pB==pA ? 0 : 2;
1fa00 0a 20 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46  .  }.  combinedF
1fa10 6c 61 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73  lags = pA->flags
1fa20 20 7c 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20   | pB->flags;.  
1fa30 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67  if( combinedFlag
1fa40 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  s & EP_IntValue 
1fa50 29 7b 0a 20 20 20 20 69 66 28 20 28 70 41 2d 3e  ){.    if( (pA->
1fa60 66 6c 61 67 73 26 70 42 2d 3e 66 6c 61 67 73 26  flags&pB->flags&
1fa70 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20  EP_IntValue)!=0 
1fa80 26 26 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d  && pA->u.iValue=
1fa90 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b  =pB->u.iValue ){
1faa0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1fab0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
1fac0 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 2;.  }.  if( p
1fad0 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 7b  A->op!=pB->op ){
1fae0 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d  .    if( pA->op=
1faf0 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73  =TK_COLLATE && s
1fb00 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
1fb10 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2c  e(pA->pLeft, pB,
1fb20 20 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20   iTab)<2 ){.    
1fb30 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1fb40 7d 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 6f 70  }.    if( pB->op
1fb50 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20  ==TK_COLLATE && 
1fb60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
1fb70 72 65 28 70 41 2c 20 70 42 2d 3e 70 4c 65 66 74  re(pA, pB->pLeft
1fb80 2c 20 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20  , iTab)<2 ){.   
1fb90 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1fba0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b   }.    return 2;
1fbb0 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f  .  }.  if( pA->o
1fbc0 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p!=TK_COLUMN && 
1fbd0 41 4c 57 41 59 53 28 70 41 2d 3e 6f 70 21 3d 54  ALWAYS(pA->op!=T
1fbe0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26  K_AGG_COLUMN) &&
1fbf0 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b   pA->u.zToken ){
1fc00 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
1fc10 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d  pA->u.zToken,pB-
1fc20 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b  >u.zToken)!=0 ){
1fc30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41  .      return pA
1fc40 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
1fc50 20 3f 20 31 20 3a 20 32 3b 0a 20 20 20 20 7d 0a   ? 1 : 2;.    }.
1fc60 20 20 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66    }.  if( (pA->f
1fc70 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
1fc80 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20  ct)!=(pB->flags 
1fc90 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29  & EP_Distinct) )
1fca0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28   return 2;.  if(
1fcb0 20 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65   ALWAYS((combine
1fcc0 64 46 6c 61 67 73 20 26 20 45 50 5f 54 6f 6b 65  dFlags & EP_Toke
1fcd0 6e 4f 6e 6c 79 29 3d 3d 30 29 20 29 7b 0a 20 20  nOnly)==0) ){.  
1fce0 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c    if( combinedFl
1fcf0 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
1fd00 63 74 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  ct ) return 2;. 
1fd10 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
1fd20 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
1fd30 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20  eft, pB->pLeft, 
1fd40 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32  iTab) ) return 2
1fd50 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
1fd60 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
1fd70 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69  >pRight, pB->pRi
1fd80 67 68 74 2c 20 69 54 61 62 29 20 29 20 72 65 74  ght, iTab) ) ret
1fd90 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73  urn 2;.    if( s
1fda0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
1fdb0 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73  mpare(pA->x.pLis
1fdc0 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20  t, pB->x.pList, 
1fdd0 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32  iTab) ) return 2
1fde0 3b 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59 53  ;.    if( ALWAYS
1fdf0 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ((combinedFlags 
1fe00 26 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30  & EP_Reduced)==0
1fe10 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
1fe20 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e  A->iColumn!=pB->
1fe30 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e  iColumn ) return
1fe40 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41   2;.      if( pA
1fe50 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54  ->iTable!=pB->iT
1fe60 61 62 6c 65 20 0a 20 20 20 20 20 20 20 26 26 20  able .       && 
1fe70 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61  (pA->iTable!=iTa
1fe80 62 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69  b || NEVER(pB->i
1fe90 54 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74  Table>=0)) ) ret
1fea0 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 2;.    }.  }
1feb0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1fec0 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77  /*.** Compare tw
1fed0 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63  o ExprList objec
1fee0 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ts.  Return 0 if
1fef0 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69   they are identi
1ff00 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d  cal and .** non-
1ff10 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64 69 66  zero if they dif
1ff20 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a  fer in any way..
1ff30 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62  **.** If any sub
1ff40 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61  element of pB ha
1ff50 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28  s Expr.iTable==(
1ff60 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61  -1) then it is a
1ff70 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d  llowed.** to com
1ff80 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e  pare equal to an
1ff90 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d   equivalent elem
1ffa0 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45  ent in pA with E
1ffb0 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62  xpr.iTable==iTab
1ffc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1ffd0 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72  tine might retur
1ffe0 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65  n non-zero for e
1fff0 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69  quivalent ExprLi
20000 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c  sts.  The.** onl
20010 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69  y consequence wi
20020 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f  ll be disabled o
20030 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42  ptimizations.  B
20040 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ut this routine.
20050 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65  ** must never re
20060 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77  turn 0 if the tw
20070 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63  o ExprList objec
20080 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  ts are different
20090 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e  , or.** a malfun
200a0 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ction will resul
200b0 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c  t..**.** Two NUL
200c0 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63  L pointers are c
200d0 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
200e0 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61  the same.  But a
200f0 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a   NULL pointer.**
20100 20 61 6c 77 61 79 73 20 64 69 66 66 65 72 73 20   always differs 
20110 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  from a non-NULL 
20120 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
20130 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
20140 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74 20  ompare(ExprList 
20150 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *pA, ExprList *p
20160 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  B, int iTab){.  
20170 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d  int i;.  if( pA=
20180 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65  =0 && pB==0 ) re
20190 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41  turn 0;.  if( pA
201a0 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72  ==0 || pB==0 ) r
201b0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70  eturn 1;.  if( p
201c0 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45  A->nExpr!=pB->nE
201d0 78 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  xpr ) return 1;.
201e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d    for(i=0; i<pA-
201f0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
20200 20 20 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d    Expr *pExprA =
20210 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b   pA->a[i].pExpr;
20220 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
20230 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78  B = pB->a[i].pEx
20240 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e  pr;.    if( pA->
20250 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d  a[i].sortOrder!=
20260 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  pB->a[i].sortOrd
20270 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  er ) return 1;. 
20280 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
20290 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72 41  prCompare(pExprA
202a0 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62 29 20  , pExprB, iTab) 
202b0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
202c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
202d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
202e0 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76 65   if we can prove
202f0 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61 6c   the pE2 will al
20300 77 61 79 73 20 62 65 20 74 72 75 65 20 69 66 20  ways be true if 
20310 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20  pE1 is.** true. 
20320 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
20330 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c   we cannot compl
20340 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f 72  ete the proof or
20350 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a   if pE2 might.**
20360 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61 6d   be false.  Exam
20370 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ples:.**.**     
20380 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20 20  pE1: x==5       
20390 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20  pE2: x==5       
203a0 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72        Result: tr
203b0 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  ue.**     pE1: x
203c0 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a 20 78  >0        pE2: x
203d0 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20  ==5             
203e0 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a  Result: false.**
203f0 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20 20       pE1: x=21  
20400 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20 4f       pE2: x=21 O
20410 52 20 79 3d 34 33 20 20 20 20 20 52 65 73 75 6c  R y=43     Resul
20420 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70  t: true.**     p
20430 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20 70  E1: x!=123     p
20440 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
20450 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75  L    Result: tru
20460 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21  e.**     pE1: x!
20470 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78 20  =?1      pE2: x 
20480 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
20490 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20  esult: true.**  
204a0 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55 4c     pE1: x IS NUL
204b0 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54  L  pE2: x IS NOT
204c0 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a   NULL    Result:
204d0 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45   false.**     pE
204e0 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70 45  1: x IS ?2    pE
204f0 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
20500 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c 73      Reuslt: fals
20510 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d  e.**.** When com
20520 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e  paring TK_COLUMN
20530 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20 70   nodes between p
20540 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20 70  E1 and pE2, if p
20550 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69  E2 has.** Expr.i
20560 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73 73  Table<0 then ass
20570 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d 62  ume a table numb
20580 65 72 20 67 69 76 65 6e 20 62 79 20 69 54 61 62  er given by iTab
20590 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 20  ..**.** When in 
205a0 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 20 66 61  doubt, return fa
205b0 6c 73 65 2e 20 20 52 65 74 75 72 6e 69 6e 67 20  lse.  Returning 
205c0 74 72 75 65 20 6d 69 67 68 74 20 67 69 76 65 20  true might give 
205d0 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a  a performance.**
205e0 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 20 20 52   improvement.  R
205f0 65 74 75 72 6e 69 6e 67 20 66 61 6c 73 65 20 6d  eturning false m
20600 69 67 68 74 20 63 61 75 73 65 20 61 20 70 65 72  ight cause a per
20610 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69  formance reducti
20620 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74 20 77 69  on, but.** it wi
20630 6c 6c 20 61 6c 77 61 79 73 20 67 69 76 65 20 74  ll always give t
20640 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65  he correct answe
20650 72 20 61 6e 64 20 69 73 20 68 65 6e 63 65 20 61  r and is hence a
20660 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a 2f 0a 69  lways safe..*/.i
20670 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d  nt sqlite3ExprIm
20680 70 6c 69 65 73 45 78 70 72 28 45 78 70 72 20 2a  pliesExpr(Expr *
20690 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32 2c 20  pE1, Expr *pE2, 
206a0 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 66 28  int iTab){.  if(
206b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
206c0 61 72 65 28 70 45 31 2c 20 70 45 32 2c 20 69 54  are(pE1, pE2, iT
206d0 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ab)==0 ){.    re
206e0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
206f0 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52  ( pE2->op==TK_OR
20700 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65 33 45  .   && (sqlite3E
20710 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70  xprImpliesExpr(p
20720 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20  E1, pE2->pLeft, 
20730 69 54 61 62 29 0a 20 20 20 20 20 20 20 20 20 20  iTab).          
20740 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70     || sqlite3Exp
20750 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45 31  rImpliesExpr(pE1
20760 2c 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20 69  , pE2->pRight, i
20770 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20 20  Tab) ).  ){.    
20780 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
20790 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f  if( pE2->op==TK_
207a0 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 73 71  NOTNULL.   && sq
207b0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
207c0 28 70 45 31 2d 3e 70 4c 65 66 74 2c 20 70 45 32  (pE1->pLeft, pE2
207d0 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3d 3d  ->pLeft, iTab)==
207e0 30 0a 20 20 20 26 26 20 28 70 45 31 2d 3e 6f 70  0.   && (pE1->op
207f0 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26 20 70  !=TK_ISNULL && p
20800 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 29 0a 20  E1->op!=TK_IS). 
20810 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
20820 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
20830 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  ;.}../*.** An in
20840 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
20850 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
20860 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  e is used by the
20870 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20   tree walker.** 
20880 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72 65 6e  to count referen
20890 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c  ces to table col
208a0 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72 67 75  umns in the argu
208b0 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20  ments of an .** 
208c0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
208d0 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  on, in order to 
208e0 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a  implement the.**
208f0 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
20900 54 68 69 73 53 72 63 28 29 20 72 6f 75 74 69 6e  ThisSrc() routin
20910 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72 63  e..*/.struct Src
20920 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73  Count {.  SrcLis
20930 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e  t *pSrc;   /* On
20940 65 20 70 61 72 74 69 63 75 6c 61 72 20 46 52 4f  e particular FRO
20950 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e 65  M clause in a ne
20960 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a 20 20  sted query */.  
20970 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20 20 20  int nThis;      
20980 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
20990 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
209a0 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20  mns in pSrcList 
209b0 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b  */.  int nOther;
209c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
209d0 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
209e0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65   columns in othe
209f0 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a  r FROM clauses *
20a00 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e  /.};../*.** Coun
20a10 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
20a20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
20a30 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  lumns..*/.static
20a40 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f 75 6e   int exprSrcCoun
20a50 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
20a60 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
20a70 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45 52 28  .  /* The NEVER(
20a80 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  ) on the second 
20a90 74 65 72 6d 20 69 73 20 62 65 63 61 75 73 65 20  term is because 
20aa0 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55  sqlite3FunctionU
20ab0 73 65 73 54 68 69 73 53 72 63 28 29 0a 20 20 2a  sesThisSrc().  *
20ac0 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c 6c  * is always call
20ad0 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65  ed before sqlite
20ae0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
20af0 65 67 61 74 65 73 28 29 20 61 6e 64 20 73 6f 20  egates() and so 
20b00 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55  the.  ** TK_COLU
20b10 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74  MNs have not yet
20b20 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20   been converted 
20b30 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  into TK_AGG_COLU
20b40 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c  MN.  If.  ** sql
20b50 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73  ite3FunctionUses
20b60 54 68 69 73 53 72 63 28 29 20 69 73 20 75 73 65  ThisSrc() is use
20b70 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 69 6e  d differently in
20b80 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 65   the future, the
20b90 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20 77 69  .  ** NEVER() wi
20ba0 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65  ll need to be re
20bb0 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  moved. */.  if( 
20bc0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
20bd0 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45  LUMN || NEVER(pE
20be0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
20bf0 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69  COLUMN) ){.    i
20c00 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74  nt i;.    struct
20c10 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70   SrcCount *p = p
20c20 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f  Walker->u.pSrcCo
20c30 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74  unt;.    SrcList
20c40 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
20c50 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
20c60 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  <pSrc->nSrc; i++
20c70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  ){.      if( pEx
20c80 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63  pr->iTable==pSrc
20c90 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29  ->a[i].iCursor )
20ca0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
20cb0 20 20 69 66 28 20 69 3c 70 53 72 63 2d 3e 6e 53    if( i<pSrc->nS
20cc0 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  rc ){.      p->n
20cd0 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  This++;.    }els
20ce0 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 74 68  e{.      p->nOth
20cf0 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  er++;.    }.  }.
20d00 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
20d10 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
20d20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 79  Determine if any
20d30 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   of the argument
20d40 73 20 74 6f 20 74 68 65 20 70 45 78 70 72 20 46  s to the pExpr F
20d50 75 6e 63 74 69 6f 6e 20 72 65 66 65 72 65 6e 63  unction referenc
20d60 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74 2e 20 20  e.** pSrcList.  
20d70 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
20d80 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f 20 72 65  hey do.  Also re
20d90 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
20da0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73   function.** has
20db0 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 6f 72   no arguments or
20dc0 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73 74 61   has only consta
20dd0 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52  nt arguments.  R
20de0 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 70  eturn false if p
20df0 45 78 70 72 0a 2a 2a 20 72 65 66 65 72 65 6e 63  Expr.** referenc
20e00 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 6e  es columns but n
20e10 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 61  ot columns of ta
20e20 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20 70 53  bles found in pS
20e30 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73  rcList..*/.int s
20e40 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73  qlite3FunctionUs
20e50 65 73 54 68 69 73 53 72 63 28 45 78 70 72 20 2a  esThisSrc(Expr *
20e60 70 45 78 70 72 2c 20 53 72 63 4c 69 73 74 20 2a  pExpr, SrcList *
20e70 70 53 72 63 4c 69 73 74 29 7b 0a 20 20 57 61 6c  pSrcList){.  Wal
20e80 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20  ker w;.  struct 
20e90 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b 0a 20 20  SrcCount cnt;.  
20ea0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
20eb0 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
20ec0 4f 4e 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  ON );.  memset(&
20ed0 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29  w, 0, sizeof(w))
20ee0 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
20ef0 61 63 6b 20 3d 20 65 78 70 72 53 72 63 43 6f 75  ack = exprSrcCou
20f00 6e 74 3b 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f  nt;.  w.u.pSrcCo
20f10 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e  unt = &cnt;.  cn
20f20 74 2e 70 53 72 63 20 3d 20 70 53 72 63 4c 69 73  t.pSrc = pSrcLis
20f30 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d  t;.  cnt.nThis =
20f40 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72   0;.  cnt.nOther
20f50 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 57   = 0;.  sqlite3W
20f60 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 77 2c 20  alkExprList(&w, 
20f70 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
20f80 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54  .  return cnt.nT
20f90 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74  his>0 || cnt.nOt
20fa0 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  her==0;.}../*.**
20fb0 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
20fc0 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e  nt to the pAggIn
20fd0 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79  fo->aCol[] array
20fe0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
20ff0 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  dex of.** the ne
21000 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75  w element.  Retu
21010 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  rn a negative nu
21020 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66  mber if malloc f
21030 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
21040 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f  int addAggInfoCo
21050 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  lumn(sqlite3 *db
21060 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f  , AggInfo *pInfo
21070 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49  ){.  int i;.  pI
21080 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69  nfo->aCol = sqli
21090 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
210a0 28 0a 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20  (.       db,.   
210b0 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c      pInfo->aCol,
210c0 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  .       sizeof(p
210d0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a  Info->aCol[0]),.
210e0 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
210f0 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26  Column,.       &
21100 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  i.  );.  return 
21110 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  i;.}    ../*.** 
21120 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
21130 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66  t to the pAggInf
21140 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79  o->aFunc[] array
21150 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
21160 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  dex of.** the ne
21170 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75  w element.  Retu
21180 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  rn a negative nu
21190 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66  mber if malloc f
211a0 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
211b0 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75  int addAggInfoFu
211c0 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nc(sqlite3 *db, 
211d0 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b  AggInfo *pInfo){
211e0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66  .  int i;.  pInf
211f0 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74  o->aFunc = sqlit
21200 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
21210 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20  .       db, .   
21220 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63      pInfo->aFunc
21230 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28  ,.       sizeof(
21240 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29  pInfo->aFunc[0])
21250 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d  ,.       &pInfo-
21260 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26  >nFunc,.       &
21270 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  i.  );.  return 
21280 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  i;.}    ../*.** 
21290 54 68 69 73 20 69 73 20 74 68 65 20 78 45 78 70  This is the xExp
212a0 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20  rCallback for a 
212b0 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74  tree walker.  It
212c0 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69   is used to.** i
212d0 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33  mplement sqlite3
212e0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
212f0 67 61 74 65 73 28 29 2e 20 20 53 65 65 20 73 71  gates().  See sq
21300 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
21310 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f  Aggregates.** fo
21320 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
21330 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
21340 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41  tic int analyzeA
21350 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20  ggregate(Walker 
21360 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
21370 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pExpr){.  int i;
21380 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
21390 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75  pNC = pWalker->u
213a0 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70  .pNC;.  Parse *p
213b0 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
213c0 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  rse;.  SrcList *
213d0 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pSrcList = pNC->
213e0 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49  pSrcList;.  AggI
213f0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20  nfo *pAggInfo = 
21400 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a  pNC->pAggInfo;..
21410 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
21420 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
21430 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
21440 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
21450 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  N: {.      testc
21460 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
21470 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
21480 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
21490 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
214a0 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f  OLUMN );.      /
214b0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
214c0 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  f the column is 
214d0 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61  in one of the ta
214e0 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
214f0 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65  .      ** clause
21500 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74   of the aggregat
21510 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20  e query */.     
21520 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 72 63   if( ALWAYS(pSrc
21530 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  List!=0) ){.    
21540 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
21550 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
21560 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20   pSrcList->a;.  
21570 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
21580 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pSrcList->nSrc;
21590 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
215a0 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
215b0 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
215c0 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ol;.          as
215d0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
215e0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
215f0 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
21600 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20  duced) );.      
21610 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
21620 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43  Table==pItem->iC
21630 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  ursor ){.       
21640 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65       /* If we re
21650 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
21660 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45  it means that pE
21670 78 70 72 20 72 65 66 65 72 73 20 74 6f 20 61 20  xpr refers to a 
21680 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  table.          
21690 20 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20    ** that is in 
216a0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
216b0 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
216c0 20 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20   query.  .      
216d0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
216e0 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20       ** Make an 
216f0 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f  entry for the co
21700 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f  lumn in pAggInfo
21710 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72  ->aCol[] if ther
21720 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
21730 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79   is not an entry
21740 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
21750 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
21760 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b             int k
21770 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
21780 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  ol = pAggInfo->a
21790 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Col;.           
217a0 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67   for(k=0; k<pAgg
217b0 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b  Info->nColumn; k
217c0 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
217d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
217e0 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78  Col->iTable==pEx
217f0 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20  pr->iTable &&.  
21800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21810 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  pCol->iColumn==p
21820 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  Expr->iColumn ){
21830 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21840 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
21850 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21860 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21870 20 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e    if( (k>=pAggIn
21880 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20  fo->nColumn).   
21890 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6b 20            && (k 
218a0 3d 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75  = addAggInfoColu
218b0 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  mn(pParse->db, p
218c0 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20  AggInfo))>=0 .  
218d0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
218e0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
218f0 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  = &pAggInfo->aCo
21900 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[k];.          
21910 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d      pCol->pTab =
21920 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20   pExpr->pTab;.  
21930 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
21940 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72  ->iTable = pExpr
21950 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
21960 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43          pCol->iC
21970 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69  olumn = pExpr->i
21980 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
21990 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d        pCol->iMem
219a0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
219b0 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m;.             
219c0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
219d0 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
219e0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70           pCol->p
219f0 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
21a00 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
21a10 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70  pAggInfo->pGroup
21a20 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  By ){.          
21a30 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a        int j, n;.
21a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a50 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20  ExprList *pGB = 
21a60 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70  pAggInfo->pGroup
21a70 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  By;.            
21a80 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
21a90 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20  ist_item *pTerm 
21aa0 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20  = pGB->a;.      
21ab0 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47            n = pG
21ac0 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  B->nExpr;.      
21ad0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
21ae0 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65  0; j<n; j++, pTe
21af0 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  rm++){.         
21b00 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
21b10 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  E = pTerm->pExpr
21b20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
21b30 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
21b40 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d  TK_COLUMN && pE-
21b50 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e  >iTable==pExpr->
21b60 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20  iTable &&.      
21b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b80 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78  pE->iColumn==pEx
21b90 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pr->iColumn ){. 
21ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bb0 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
21bc0 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20  Column = j;.    
21bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21be0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
21bf0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21c00 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
21c10 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
21c20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
21c30 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
21c40 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  mn<0 ){.        
21c50 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
21c60 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41  orterColumn = pA
21c70 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67  ggInfo->nSorting
21c80 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20  Column++;.      
21c90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21cb0 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
21cc0 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72  now an entry for
21cd0 20 70 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e   pExpr in pAggIn
21ce0 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68  fo->aCol[] (eith
21cf0 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  er.            *
21d00 2a 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73  * because it was
21d10 20 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72   there before or
21d20 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74   because we just
21d30 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20   created it)..  
21d40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e            ** Con
21d50 76 65 72 74 20 74 68 65 20 70 45 78 70 72 20 74  vert the pExpr t
21d60 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f  o be a TK_AGG_CO
21d70 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74  LUMN referring t
21d80 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  o that.         
21d90 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e     ** pAggInfo->
21da0 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20  aCol[] entry..  
21db0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
21dc0 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74           ExprSet
21dd0 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70  VVAProperty(pExp
21de0 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b  r, EP_NoReduce);
21df0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
21e00 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70  pr->pAggInfo = p
21e10 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AggInfo;.       
21e20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
21e30 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a   TK_AGG_COLUMN;.
21e40 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
21e50 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 6b  r->iAgg = (i16)k
21e60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
21e70 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
21e80 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d   /* endif pExpr-
21e90 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e  >iTable==pItem->
21ea0 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20  iCursor */.     
21eb0 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70     } /* end loop
21ec0 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a   over pSrcList *
21ed0 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
21ee0 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
21ef0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
21f00 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
21f10 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  : {.      if( (p
21f20 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43  NC->ncFlags & NC
21f30 5f 49 6e 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20  _InAggFunc)==0. 
21f40 20 20 20 20 20 20 26 26 20 70 57 61 6c 6b 65 72        && pWalker
21f50 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70  ->walkerDepth==p
21f60 45 78 70 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20  Expr->op2.      
21f70 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ){.        /* Ch
21f80 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45  eck to see if pE
21f90 78 70 72 20 69 73 20 61 20 64 75 70 6c 69 63 61  xpr is a duplica
21fa0 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67  te of another ag
21fb0 67 72 65 67 61 74 65 20 0a 20 20 20 20 20 20 20  gregate .       
21fc0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   ** function tha
21fd0 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
21fe0 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72  the pAggInfo str
21ff0 75 63 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a  ucture.        *
22000 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  /.        struct
22010 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
22020 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d  Item = pAggInfo-
22030 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20  >aFunc;.        
22040 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
22050 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
22060 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
22070 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
22080 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65  ExprCompare(pIte
22090 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72 2c  m->pExpr, pExpr,
220a0 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   -1)==0 ){.     
220b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
220c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
220d0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
220e0 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75  i>=pAggInfo->nFu
220f0 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
22100 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69 67  /* pExpr is orig
22110 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65  inal.  Make a ne
22120 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49  w entry in pAggI
22130 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20  nfo->aFunc[].   
22140 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
22150 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43      u8 enc = ENC
22160 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
22170 20 20 20 20 20 20 20 20 69 20 3d 20 61 64 64 41          i = addA
22180 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73  ggInfoFunc(pPars
22190 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
221a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
221b0 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  i>=0 ){.        
221c0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
221d0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
221e0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
221f0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
22200 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e   pItem = &pAggIn
22210 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20  fo->aFunc[i];.  
22220 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
22230 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
22240 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
22250 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  m->iMem = ++pPar
22260 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
22270 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
22280 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
22290 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
222a0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
222b0 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d    pItem->pFunc =
222c0 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
222d0 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
222e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
222f0 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f      pExpr->u.zTo
22300 6b 65 6e 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ken, sqlite3Strl
22310 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54  en30(pExpr->u.zT
22320 6f 6b 65 6e 29 2c 0a 20 20 20 20 20 20 20 20 20  oken),.         
22330 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
22340 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72  >x.pList ? pExpr
22350 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
22360 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20   : 0, enc, 0);. 
22370 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
22380 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
22390 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
223a0 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
223b0 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50  ->iDistinct = pP
223c0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
223d0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
223e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
223f0 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20  Item->iDistinct 
22400 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
22410 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
22420 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22430 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20    /* Make pExpr 
22440 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70  point to the app
22450 72 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e 66  ropriate pAggInf
22460 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79  o->aFunc[] entry
22470 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
22480 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
22490 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
224a0 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
224b0 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
224c0 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 56          ExprSetV
224d0 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  VAProperty(pExpr
224e0 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
224f0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
22500 41 67 67 20 3d 20 28 69 31 36 29 69 3b 0a 20 20  Agg = (i16)i;.  
22510 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67        pExpr->pAg
22520 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f  gInfo = pAggInfo
22530 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
22540 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
22550 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22560 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
22570 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
22580 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
22590 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
225a0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c  .static int anal
225b0 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53  yzeAggregatesInS
225c0 65 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57  elect(Walker *pW
225d0 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
225e0 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45  Select){.  UNUSE
225f0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 57 61 6c  D_PARAMETER(pWal
22600 6b 65 72 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ker);.  UNUSED_P
22610 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74  ARAMETER(pSelect
22620 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  );.  return WRC_
22630 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
22640 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 70  ** Analyze the p
22650 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20  Expr expression 
22660 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72  looking for aggr
22670 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
22680 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61  and.** for varia
22690 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  bles that need t
226a0 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 41 67  o be added to Ag
226b0 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61  gInfo object tha
226c0 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 0a  t pNC->pAggInfo.
226d0 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41  ** points to.  A
226e0 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65  dditional entrie
226f0 73 20 61 72 65 20 6d 61 64 65 20 6f 6e 20 74 68  s are made on th
22700 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74  e AggInfo object
22710 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79   as.** necessary
22720 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
22730 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tine should only
22740 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
22750 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
22760 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c  has been.** anal
22770 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 52  yzed by sqlite3R
22780 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
22790 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
227a0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
227b0 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74  regates(NameCont
227c0 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a  ext *pNC, Expr *
227d0 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72  pExpr){.  Walker
227e0 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c   w;.  memset(&w,
227f0 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
22800 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
22810 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  k = analyzeAggre
22820 67 61 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63  gate;.  w.xSelec
22830 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c  tCallback = anal
22840 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53  yzeAggregatesInS
22850 65 6c 65 63 74 3b 0a 20 20 77 2e 75 2e 70 4e 43  elect;.  w.u.pNC
22860 20 3d 20 70 4e 43 3b 0a 20 20 61 73 73 65 72 74   = pNC;.  assert
22870 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21  ( pNC->pSrcList!
22880 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57  =0 );.  sqlite3W
22890 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70  alkExpr(&w, pExp
228a0 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  r);.}../*.** Cal
228b0 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  l sqlite3ExprAna
228c0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
228d0 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65   for every expre
228e0 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65  ssion in an.** e
228f0 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
22900 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
22910 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a  er of errors..**
22920 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
22930 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e  is found, the an
22940 61 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68  alysis is cut sh
22950 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ort..*/.void sql
22960 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
22970 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65  ggList(NameConte
22980 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73  xt *pNC, ExprLis
22990 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72  t *pList){.  str
229a0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
229b0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
229c0 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  i;.  if( pList )
229d0 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d  {.    for(pItem=
229e0 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
229f0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
22a00 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
22a10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
22a20 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
22a30 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78  (pNC, pItem->pEx
22a40 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  pr);.    }.  }.}
22a50 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
22a60 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65   a single new re
22a70 67 69 73 74 65 72 20 66 6f 72 20 75 73 65 20 74  gister for use t
22a80 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65  o hold some inte
22a90 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e  rmediate result.
22aa0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47  .*/.int sqlite3G
22ab0 65 74 54 65 6d 70 52 65 67 28 50 61 72 73 65 20  etTempReg(Parse 
22ac0 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20  *pParse){.  if( 
22ad0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
22ae0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
22af0 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  n ++pParse->nMem
22b00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
22b10 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
22b20 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  --pParse->nTempR
22b30 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  eg];.}../*.** De
22b40 61 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73  allocate a regis
22b50 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69  ter, making avai
22b60 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20  lable for reuse 
22b70 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a  for some other.*
22b80 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a  * purpose..**.**
22b90 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20 69   If a register i
22ba0 73 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  s currently bein
22bb0 67 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f  g used by the co
22bc0 6c 75 6d 6e 20 63 61 63 68 65 2c 20 74 68 65 6e  lumn cache, then
22bd0 0a 2a 2a 20 74 68 65 20 64 61 6c 6c 6f 63 61 74  .** the dallocat
22be0 69 6f 6e 20 69 73 20 64 65 66 65 72 72 65 64 20  ion is deferred 
22bf0 75 6e 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e  until the column
22c00 20 63 61 63 68 65 20 6c 69 6e 65 20 74 68 61 74   cache line that
22c10 20 75 73 65 73 0a 2a 2a 20 74 68 65 20 72 65 67   uses.** the reg
22c20 69 73 74 65 72 20 62 65 63 6f 6d 65 73 20 73 74  ister becomes st
22c30 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ale..*/.void sql
22c40 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
22c50 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eg(Parse *pParse
22c60 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69  , int iReg){.  i
22c70 66 28 20 69 52 65 67 20 26 26 20 70 50 61 72 73  f( iReg && pPars
22c80 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61  e->nTempReg<Arra
22c90 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54  ySize(pParse->aT
22ca0 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 69  empReg) ){.    i
22cb0 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74  nt i;.    struct
22cc0 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
22cd0 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50     for(i=0, p=pP
22ce0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
22cf0 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
22d00 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
22d10 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52  .      if( p->iR
22d20 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20  eg==iReg ){.    
22d30 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
22d40 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
22d50 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
22d60 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54  }.    pParse->aT
22d70 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e  empReg[pParse->n
22d80 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65  TempReg++] = iRe
22d90 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g;.  }.}../*.** 
22da0 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c  Allocate or deal
22db0 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f  locate a block o
22dc0 66 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69  f nReg consecuti
22dd0 76 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2f 0a  ve registers.*/.
22de0 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65  int sqlite3GetTe
22df0 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  mpRange(Parse *p
22e00 50 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29  Parse, int nReg)
22e10 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  {.  int i, n;.  
22e20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e  i = pParse->iRan
22e30 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61  geReg;.  n = pPa
22e40 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a  rse->nRangeReg;.
22e50 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29 7b    if( nReg<=n ){
22e60 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 75 73  .    assert( !us
22e70 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28  edAsColumnCache(
22e80 70 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d 31  pParse, i, i+n-1
22e90 29 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ) );.    pParse-
22ea0 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52  >iRangeReg += nR
22eb0 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  eg;.    pParse->
22ec0 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65  nRangeReg -= nRe
22ed0 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  g;.  }else{.    
22ee0 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  i = pParse->nMem
22ef0 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  +1;.    pParse->
22f00 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20  nMem += nReg;.  
22f10 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  }.  return i;.}.
22f20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65  void sqlite3Rele
22f30 61 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72  aseTempRange(Par
22f40 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
22f50 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b  iReg, int nReg){
22f60 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
22f70 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
22f80 2c 20 69 52 65 67 2c 20 6e 52 65 67 29 3b 0a 20  , iReg, nReg);. 
22f90 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73 65   if( nReg>pParse
22fa0 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a 20  ->nRangeReg ){. 
22fb0 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67     pParse->nRang
22fc0 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20  eReg = nReg;.   
22fd0 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
22fe0 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d  eg = iReg;.  }.}
22ff0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c  ../*.** Mark all
23000 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
23010 74 65 72 73 20 61 73 20 62 65 69 6e 67 20 75 6e  ters as being un
23020 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65  available for re
23030 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  use..*/.void sql
23040 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67  ite3ClearTempReg
23050 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61  Cache(Parse *pPa
23060 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e  rse){.  pParse->
23070 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  nTempReg = 0;.  
23080 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
23090 67 20 3d 20 30 3b 0a 7d 0a                       g = 0;.}.