/ Hex Artifact Content
Login

Artifact 014b8087a15c4c314bdd798cb1cb0b32693f8b40:


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 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
3ed0: 73 73 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20  ssion is always 
3ee0: 65 69 74 68 65 72 20 54 52 55 45 20 6f 72 20 46  either TRUE or F
3ef0: 41 4c 53 45 20 28 72 65 73 70 65 63 74 69 76 65  ALSE (respective
3f00: 6c 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74  ly),.** then ret
3f10: 75 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20 63  urn 1.  If one c
3f20: 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20  annot determine 
3f30: 74 68 65 20 74 72 75 74 68 20 76 61 6c 75 65 20  the truth value 
3f40: 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  of the.** expres
3f50: 73 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65 2d  sion at compile-
3f60: 74 69 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a  time return 0..*
3f70: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  *.** This is an 
3f80: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
3f90: 66 20 69 73 20 4f 4b 20 74 6f 20 72 65 74 75 72  f is OK to retur
3fa0: 6e 20 30 20 68 65 72 65 20 65 76 65 6e 20 69 66  n 0 here even if
3fb0: 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69  .** the expressi
3fc0: 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61 6c 77  on really is alw
3fd0: 61 79 73 20 66 61 6c 73 65 20 6f 72 20 66 61 6c  ays false or fal
3fe0: 73 65 20 28 61 20 66 61 6c 73 65 20 6e 65 67 61  se (a false nega
3ff0: 74 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69 74  tive)..** But it
4000: 20 69 73 20 61 20 62 75 67 20 74 6f 20 72 65 74   is a bug to ret
4010: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
4020: 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 68 61  ression might ha
4030: 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ve different.** 
4040: 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20 69  boolean values i
4050: 6e 20 64 69 66 66 65 72 65 6e 74 20 63 69 72 63  n different circ
4060: 75 6d 73 74 61 6e 63 65 73 20 28 61 20 66 61 6c  umstances (a fal
4070: 73 65 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a 2a  se positive.).**
4080: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66  .** Note that if
4090: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
40a0: 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6e 64 69  is part of condi
40b0: 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a 20  tional for a.** 
40c0: 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20  LEFT JOIN, then 
40d0: 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d  we cannot determ
40e0: 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ine at compile-t
40f0: 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ime whether or n
4100: 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74 72 75 65  ot.** is it true
4110: 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20 61 6c   or false, so al
4120: 77 61 79 73 20 72 65 74 75 72 6e 20 30 2e 0a 2a  ways return 0..*
4130: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
4140: 72 41 6c 77 61 79 73 54 72 75 65 28 45 78 70 72  rAlwaysTrue(Expr
4150: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20   *p){.  int v = 
4160: 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  0;.  if( ExprHas
4170: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46  Property(p, EP_F
4180: 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72  romJoin) ) retur
4190: 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  n 0;.  if( !sqli
41a0: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
41b0: 28 70 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e  (p, &v) ) return
41c0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 21 3d   0;.  return v!=
41d0: 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  0;.}.static int 
41e0: 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
41f0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Expr *p){.  int 
4200: 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70  v = 0;.  if( Exp
4210: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
4220: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72  EP_FromJoin) ) r
4230: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
4240: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
4250: 65 67 65 72 28 70 2c 20 26 76 29 20 29 20 72 65  eger(p, &v) ) re
4260: 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
4270: 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   v==0;.}../*.** 
4280: 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73  Join two express
4290: 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e  ions using an AN
42a0: 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20  D operator.  If 
42b0: 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f  either expressio
42c0: 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68  n is.** NULL, th
42d0: 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74  en just return t
42e0: 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  he other express
42f0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e  ion..**.** If on
4300: 65 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74  e side or the ot
4310: 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69  her of the AND i
4320: 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61  s known to be fa
4330: 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61  lse, then instea
4340: 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e  d.** of returnin
4350: 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73  g an AND express
4360: 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e  ion, just return
4370: 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72   a constant expr
4380: 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61  ession with.** a
4390: 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e   value of false.
43a0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
43b0: 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33  3ExprAnd(sqlite3
43c0: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66   *db, Expr *pLef
43d0: 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29  t, Expr *pRight)
43e0: 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30  {.  if( pLeft==0
43f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
4400: 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69  Right;.  }else i
4410: 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a  f( pRight==0 ){.
4420: 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74      return pLeft
4430: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78  ;.  }else if( ex
4440: 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c  prAlwaysFalse(pL
4450: 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c 77 61  eft) || exprAlwa
4460: 79 73 46 61 6c 73 65 28 70 52 69 67 68 74 29 20  ysFalse(pRight) 
4470: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
4480: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65  prDelete(db, pLe
4490: 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
44a0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
44b0: 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75  Right);.    retu
44c0: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c  rn sqlite3ExprAl
44d0: 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  loc(db, TK_INTEG
44e0: 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54  ER, &sqlite3IntT
44f0: 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20  okens[0], 0);.  
4500: 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20  }else{.    Expr 
4510: 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
4520: 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
4530: 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  AND, 0, 0);.    
4540: 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63  sqlite3ExprAttac
4550: 68 53 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e  hSubtrees(db, pN
4560: 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  ew, pLeft, pRigh
4570: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70  t);.    return p
4580: 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  New;.  }.}../*.*
4590: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  * Construct a ne
45a0: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  w expression nod
45b0: 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  e for a function
45c0: 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a   with multiple.*
45d0: 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a  * arguments..*/.
45e0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
45f0: 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20  rFunction(Parse 
4600: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73  *pParse, ExprLis
4610: 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
4620: 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72  *pToken){.  Expr
4630: 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65   *pNew;.  sqlite
4640: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
4650: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  db;.  assert( pT
4660: 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d  oken );.  pNew =
4670: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
4680: 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f  c(db, TK_FUNCTIO
4690: 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20  N, pToken, 1);. 
46a0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
46b0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
46c0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
46d0: 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d  ist); /* Avoid m
46e0: 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20  emory leak when 
46f0: 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a  malloc fails */.
4700: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4710: 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73  }.  pNew->x.pLis
4720: 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73  t = pList;.  ass
4730: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
4740: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78  perty(pNew, EP_x
4750: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73  IsSelect) );.  s
4760: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
4770: 67 68 74 28 70 50 61 72 73 65 2c 20 70 4e 65 77  ght(pParse, pNew
4780: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
4790: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67  ;.}../*.** Assig
47a0: 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  n a variable num
47b0: 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73  ber to an expres
47c0: 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65  sion that encode
47d0: 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20  s a wildcard.** 
47e0: 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  in the original 
47f0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  SQL statement.  
4800: 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73  .**.** Wildcards
4810: 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61   consisting of a
4820: 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20   single "?" are 
4830: 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78  assigned the nex
4840: 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20  t sequential.** 
4850: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e  variable number.
4860: 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73  .**.** Wildcards
4870: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e   of the form "?n
4880: 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65 64  nn" are assigned
4890: 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e   the number "nnn
48a0: 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73  ".  We make.** s
48b0: 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74  ure "nnn" is not
48c0: 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69 64   too be to avoid
48d0: 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72   a denial of ser
48e0: 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e  vice attack when
48f0: 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74  .** the SQL stat
4900: 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d  ement comes from
4910: 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75   an external sou
4920: 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63  rce..**.** Wildc
4930: 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ards of the form
4940: 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22 2c   ":aaa", "@aaa",
4950: 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61   or "$aaa" are a
4960: 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65  ssigned the same
4970: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68   number.** as th
4980: 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61  e previous insta
4990: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
49a0: 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66  wildcard.  Or if
49b0: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
49c0: 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f  st.** instance o
49d0: 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20  f the wildcard, 
49e0: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 69  the next sequeni
49f0: 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  al variable numb
4a00: 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65  er is.** assigne
4a10: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
4a20: 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e  e3ExprAssignVarN
4a30: 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61  umber(Parse *pPa
4a40: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
4a50: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
4a60: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
4a70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
4a80: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
4a90: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
4aa0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
4ab0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
4ac0: 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65 64 75 63  ntValue|EP_Reduc
4ad0: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  ed|EP_TokenOnly)
4ae0: 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70 72 2d   );.  z = pExpr-
4af0: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61 73 73  >u.zToken;.  ass
4b00: 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 61  ert( z!=0 );.  a
4b10: 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30 20 29  ssert( z[0]!=0 )
4b20: 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20  ;.  if( z[1]==0 
4b30: 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  ){.    /* Wildca
4b40: 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rd of the form "
4b50: 3f 22 2e 20 20 41 73 73 69 67 6e 20 74 68 65 20  ?".  Assign the 
4b60: 6e 65 78 74 20 76 61 72 69 61 62 6c 65 20 6e 75  next variable nu
4b70: 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65  mber */.    asse
4b80: 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b  rt( z[0]=='?' );
4b90: 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c  .    pExpr->iCol
4ba0: 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b  umn = (ynVar)(++
4bb0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20  pParse->nVar);. 
4bc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 79 6e 56 61   }else{.    ynVa
4bd0: 72 20 78 20 3d 20 30 3b 0a 20 20 20 20 75 33 32  r x = 0;.    u32
4be0: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
4bf0: 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28  en30(z);.    if(
4c00: 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20   z[0]=='?' ){.  
4c10: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
4c20: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
4c30: 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e  n".  Convert "nn
4c40: 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  n" to an integer
4c50: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 73   and.      ** us
4c60: 65 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69  e it as the vari
4c70: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
4c80: 20 20 20 20 20 69 36 34 20 69 3b 0a 20 20 20 20       i64 i;.    
4c90: 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3d 3d 73    int bOk = 0==s
4ca0: 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26 7a 5b  qlite3Atoi64(&z[
4cb0: 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c  1], &i, n-1, SQL
4cc0: 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20  ITE_UTF8);.     
4cd0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
4ce0: 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a  = x = (ynVar)i;.
4cf0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
4d00: 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  i==0 );.      te
4d10: 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29 3b 0a  stcase( i==1 );.
4d20: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
4d30: 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  i==db->aLimit[SQ
4d40: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
4d50: 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29 3b  BLE_NUMBER]-1 );
4d60: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
4d70: 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53   i==db->aLimit[S
4d80: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
4d90: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a  ABLE_NUMBER] );.
4da0: 20 20 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d 30        if( bOk==0
4db0: 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64 62 2d   || i<1 || i>db-
4dc0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
4dd0: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
4de0: 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20 20 20  MBER] ){.       
4df0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
4e00: 28 70 50 61 72 73 65 2c 20 22 76 61 72 69 61 62  (pParse, "variab
4e10: 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62  le number must b
4e20: 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64  e between ?1 and
4e30: 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20   ?%d",.         
4e40: 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51     db->aLimit[SQ
4e50: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
4e60: 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20 20  BLE_NUMBER]);.  
4e70: 20 20 20 20 20 20 78 20 3d 20 30 3b 0a 20 20 20        x = 0;.   
4e80: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
4e90: 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b  >pParse->nVar ){
4ea0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
4eb0: 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29 69 3b 0a  >nVar = (int)i;.
4ec0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
4ed0: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64  e{.      /* Wild
4ee0: 63 61 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61  cards like ":aaa
4ef0: 22 2c 20 22 24 61 61 61 22 20 6f 72 20 22 40 61  ", "$aaa" or "@a
4f00: 61 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20  aa".  Reuse the 
4f10: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20  same variable.  
4f20: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73      ** number as
4f30: 20 74 68 65 20 70 72 69 6f 72 20 61 70 70 65 61   the prior appea
4f40: 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d  rance of the sam
4f50: 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68  e name, or if th
4f60: 65 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  e name.      ** 
4f70: 68 61 73 20 6e 65 76 65 72 20 61 70 70 65 61 72  has never appear
4f80: 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65  ed before, reuse
4f90: 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62   the same variab
4fa0: 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20  le number.      
4fb0: 2a 2f 0a 20 20 20 20 20 20 79 6e 56 61 72 20 69  */.      ynVar i
4fc0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
4fd0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72   i<pParse->nzVar
4fe0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
4ff0: 69 66 28 20 70 50 61 72 73 65 2d 3e 61 7a 56 61  if( pParse->azVa
5000: 72 5b 69 5d 20 26 26 20 73 74 72 63 6d 70 28 70  r[i] && strcmp(p
5010: 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69 5d 2c  Parse->azVar[i],
5020: 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  z)==0 ){.       
5030: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
5040: 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69  n = x = (ynVar)i
5050: 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  +1;.          br
5060: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
5070: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
5080: 20 78 3d 3d 30 20 29 20 78 20 3d 20 70 45 78 70   x==0 ) x = pExp
5090: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e  r->iColumn = (yn
50a0: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
50b0: 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Var);.    }.    
50c0: 69 66 28 20 78 3e 30 20 29 7b 0a 20 20 20 20 20  if( x>0 ){.     
50d0: 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e   if( x>pParse->n
50e0: 7a 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20  zVar ){.        
50f0: 63 68 61 72 20 2a 2a 61 3b 0a 20 20 20 20 20 20  char **a;.      
5100: 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52    a = sqlite3DbR
5110: 65 61 6c 6c 6f 63 28 64 62 2c 20 70 50 61 72 73  ealloc(db, pPars
5120: 65 2d 3e 61 7a 56 61 72 2c 20 78 2a 73 69 7a 65  e->azVar, x*size
5130: 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20  of(a[0]));.     
5140: 20 20 20 69 66 28 20 61 3d 3d 30 20 29 20 72 65     if( a==0 ) re
5150: 74 75 72 6e 3b 20 20 2f 2a 20 45 72 72 6f 72 20  turn;  /* Error 
5160: 72 65 70 6f 72 74 65 64 20 74 68 72 6f 75 67 68  reported through
5170: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
5180: 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 61  d */.        pPa
5190: 72 73 65 2d 3e 61 7a 56 61 72 20 3d 20 61 3b 0a  rse->azVar = a;.
51a0: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
51b0: 61 5b 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 5d  a[pParse->nzVar]
51c0: 2c 20 30 2c 20 28 78 2d 70 50 61 72 73 65 2d 3e  , 0, (x-pParse->
51d0: 6e 7a 56 61 72 29 2a 73 69 7a 65 6f 66 28 61 5b  nzVar)*sizeof(a[
51e0: 30 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 70 50  0]));.        pP
51f0: 61 72 73 65 2d 3e 6e 7a 56 61 72 20 3d 20 78 3b  arse->nzVar = x;
5200: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
5210: 66 28 20 7a 5b 30 5d 21 3d 27 3f 27 20 7c 7c 20  f( z[0]!='?' || 
5220: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d  pParse->azVar[x-
5230: 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1]==0 ){.       
5240: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5250: 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  b, pParse->azVar
5260: 5b 78 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  [x-1]);.        
5270: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d  pParse->azVar[x-
5280: 31 5d 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  1] = sqlite3DbSt
5290: 72 4e 44 75 70 28 64 62 2c 20 7a 2c 20 6e 29 3b  rNDup(db, z, n);
52a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
52b0: 20 7d 20 0a 20 20 69 66 28 20 21 70 50 61 72 73   } .  if( !pPars
52c0: 65 2d 3e 6e 45 72 72 20 26 26 20 70 50 61 72 73  e->nErr && pPars
52d0: 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61 4c 69 6d  e->nVar>db->aLim
52e0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
52f0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
5300: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
5310: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
5320: 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61  "too many SQL va
5330: 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d  riables");.  }.}
5340: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76  ../*.** Recursiv
5350: 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78  ely delete an ex
5360: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a  pression tree..*
5370: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
5380: 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  prDelete(sqlite3
5390: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a   *db, Expr *p){.
53a0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
53b0: 75 72 6e 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79  urn;.  /* Sanity
53c0: 20 63 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74   check: Assert t
53d0: 68 61 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65  hat the IntValue
53e0: 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   is non-negative
53f0: 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f   if it exists */
5400: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
5410: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
5420: 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70  P_IntValue) || p
5430: 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b  ->u.iValue>=0 );
5440: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
5450: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
5460: 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  kenOnly) ){.    
5470: 2f 2a 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e  /* The Expr.x un
5480: 69 6f 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65  ion is never use
5490: 64 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  d at the same ti
54a0: 6d 65 20 61 73 20 45 78 70 72 2e 70 52 69 67 68  me as Expr.pRigh
54b0: 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  t */.    assert(
54c0: 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c   p->x.pList==0 |
54d0: 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  | p->pRight==0 )
54e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
54f0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
5500: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
5510: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
5520: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20   p->pRight);.   
5530: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
5540: 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f  erty(p, EP_MemTo
5550: 6b 65 6e 29 20 29 20 73 71 6c 69 74 65 33 44 62  ken) ) sqlite3Db
5560: 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54  Free(db, p->u.zT
5570: 6f 6b 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 45  oken);.    if( E
5580: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5590: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
55a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
55b0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
55c0: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a   p->x.pSelect);.
55d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
55e0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
55f0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e  Delete(db, p->x.
5600: 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pList);.    }.  
5610: 7d 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  }.  if( !ExprHas
5620: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53  Property(p, EP_S
5630: 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20 73 71  tatic) ){.    sq
5640: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5650: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
5660: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
5670: 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f  er of bytes allo
5680: 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 65 78  cated for the ex
5690: 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75  pression structu
56a0: 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73  re .** passed as
56b0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
56c0: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77  ent. This is alw
56d0: 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f  ays one of EXPR_
56e0: 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50  FULLSIZE,.** EXP
56f0: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72  R_REDUCEDSIZE or
5700: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
5710: 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  IZE..*/.static i
5720: 6e 74 20 65 78 70 72 53 74 72 75 63 74 53 69 7a  nt exprStructSiz
5730: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  e(Expr *p){.  if
5740: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
5750: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
5760: 79 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52  y) ) return EXPR
5770: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a  _TOKENONLYSIZE;.
5780: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
5790: 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75  perty(p, EP_Redu
57a0: 63 65 64 29 20 29 20 72 65 74 75 72 6e 20 45 58  ced) ) return EX
57b0: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a  PR_REDUCEDSIZE;.
57c0: 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55    return EXPR_FU
57d0: 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LLSIZE;.}../*.**
57e0: 20 54 68 65 20 64 75 70 65 64 45 78 70 72 2a 53   The dupedExpr*S
57f0: 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73 20 65  ize() routines e
5800: 61 63 68 20 72 65 74 75 72 6e 20 74 68 65 20 6e  ach return the n
5810: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
5820: 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74  equired.** to st
5830: 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20 61 6e  ore a copy of an
5840: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 65   expression or e
5850: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
5860: 20 54 68 65 79 20 64 69 66 66 65 72 20 69 6e 0a   They differ in.
5870: 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74  ** how much of t
5880: 68 65 20 74 72 65 65 20 69 73 20 6d 65 61 73 75  he tree is measu
5890: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64  red..**.**     d
58a0: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
58b0: 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20 6f 66  ze()     Size of
58c0: 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72 20 73   only the Expr s
58d0: 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20 20 20  tructure .**    
58e0: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
58f0: 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a 65 20  ze()       Size 
5900: 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63 65 20  of Expr + space 
5910: 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20  for token.**    
5920: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 29   dupedExprSize()
5930: 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
5940: 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65  + token + subtre
5950: 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a  e components.**.
5960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
59b0: 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72 53  * The dupedExprS
59c0: 74 72 75 63 74 53 69 7a 65 28 29 20 66 75 6e 63  tructSize() func
59d0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 77 6f  tion returns two
59e0: 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f   values OR-ed to
59f0: 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29  gether:  .** (1)
5a00: 20 74 68 65 20 73 70 61 63 65 20 72 65 71 75 69   the space requi
5a10: 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79 20 6f  red for a copy o
5a20: 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  f the Expr struc
5a30: 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a  ture only and .*
5a40: 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78 78 78  * (2) the EP_xxx
5a50: 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69   flags that indi
5a60: 63 61 74 65 20 77 68 61 74 20 74 68 65 20 73 74  cate what the st
5a70: 72 75 63 74 75 72 65 20 73 69 7a 65 20 73 68 6f  ructure size sho
5a80: 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72  uld be..** The r
5a90: 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69 73 20  eturn values is 
5aa0: 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a  always one of:.*
5ab0: 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 46  *.**      EXPR_F
5ac0: 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20  ULLSIZE.**      
5ad0: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
5ae0: 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65 64 0a     | EP_Reduced.
5af0: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54 4f 4b  **      EXPR_TOK
5b00: 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f  ENONLYSIZE | EP_
5b10: 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20  TokenOnly.**.** 
5b20: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
5b30: 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65  structure can be
5b40: 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e   found by maskin
5b50: 67 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  g the return val
5b60: 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f  ue.** of this ro
5b70: 75 74 69 6e 65 20 77 69 74 68 20 30 78 66 66 66  utine with 0xfff
5b80: 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63 61 6e  .  The flags can
5b90: 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73   be found by mas
5ba0: 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74 75  king the.** retu
5bb0: 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20 45 50  rn value with EP
5bc0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
5bd0: 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  nOnly..**.** Not
5be0: 65 20 74 68 61 74 20 77 69 74 68 20 66 6c 61 67  e that with flag
5bf0: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
5c00: 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 73  E, this routines
5c10: 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73   works on full-s
5c20: 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65  ize.** (unreduce
5c30: 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20  d) Expr objects 
5c40: 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69 67 69  as they or origi
5c50: 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74 65  nally constructe
5c60: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e  d by the parser.
5c70: 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70 72 65  .** During expre
5c80: 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20  ssion analysis, 
5c90: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
5ca0: 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e  n is computed an
5cb0: 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20  d moved into.** 
5cc0: 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66 20 74  later parts of t
5cd0: 65 68 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61  eh Expr object a
5ce0: 6e 64 20 74 68 61 74 20 65 78 74 72 61 20 69 6e  nd that extra in
5cf0: 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20  formation might 
5d00: 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f  get chopped.** o
5d10: 66 66 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ff if the expres
5d20: 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65 64 2e  sion is reduced.
5d30: 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
5d40: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   it does not wor
5d50: 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 20 45  k to.** make a E
5d60: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 63 6f  XPRDUP_REDUCE co
5d70: 70 79 20 6f 66 20 61 20 72 65 64 75 63 65 64 20  py of a reduced 
5d80: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 74 20  expression.  It 
5d90: 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a  is only legal.**
5da0: 20 74 6f 20 72 65 64 75 63 65 20 61 20 70 72 69   to reduce a pri
5db0: 73 74 69 6e 65 20 65 78 70 72 65 73 73 69 6f 6e  stine expression
5dc0: 20 74 72 65 65 20 66 72 6f 6d 20 74 68 65 20 70   tree from the p
5dd0: 61 72 73 65 72 2e 20 20 54 68 65 20 69 6d 70 6c  arser.  The impl
5de0: 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66  ementation.** of
5df0: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
5e00: 53 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d  Size() contain m
5e10: 75 6c 74 69 70 6c 65 20 61 73 73 65 72 74 28 29  ultiple assert()
5e20: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
5e30: 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65   attempt.** to e
5e40: 6e 66 6f 72 63 65 20 74 68 69 73 20 63 6f 6e 73  nforce this cons
5e50: 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  traint..*/.stati
5e60: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53  c int dupedExprS
5e70: 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a  tructSize(Expr *
5e80: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
5e90: 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73   int nSize;.  as
5ea0: 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 45 58 50  sert( flags==EXP
5eb0: 52 44 55 50 5f 52 45 44 55 43 45 20 7c 7c 20 66  RDUP_REDUCE || f
5ec0: 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e  lags==0 ); /* On
5ed0: 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75  ly one flag valu
5ee0: 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 61  e allowed */.  a
5ef0: 73 73 65 72 74 28 20 45 58 50 52 5f 46 55 4c 4c  ssert( EXPR_FULL
5f00: 53 49 5a 45 3c 3d 30 78 66 66 66 20 29 3b 0a 20  SIZE<=0xfff );. 
5f10: 20 61 73 73 65 72 74 28 20 28 30 78 66 66 66 20   assert( (0xfff 
5f20: 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50  & (EP_Reduced|EP
5f30: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20  _TokenOnly))==0 
5f40: 29 3b 0a 20 20 69 66 28 20 30 3d 3d 28 66 6c 61  );.  if( 0==(fla
5f50: 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43  gs&EXPRDUP_REDUC
5f60: 45 29 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20  E) ){.    nSize 
5f70: 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b  = EXPR_FULLSIZE;
5f80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
5f90: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
5fa0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
5fb0: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
5fc0: 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  d) );.    assert
5fd0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
5fe0: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
5ff0: 6e 29 20 29 3b 20 0a 20 20 20 20 61 73 73 65 72  n) ); .    asser
6000: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
6010: 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b  rty(p, EP_MemTok
6020: 65 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  en) );.    asser
6030: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
6040: 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75  rty(p, EP_NoRedu
6050: 63 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ce) );.    if( p
6060: 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 78 2e  ->pLeft || p->x.
6070: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e  pList ){.      n
6080: 53 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55  Size = EXPR_REDU
6090: 43 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64  CEDSIZE | EP_Red
60a0: 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  uced;.    }else{
60b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
60c0: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
60d0: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50       nSize = EXP
60e0: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20  R_TOKENONLYSIZE 
60f0: 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a  | EP_TokenOnly;.
6100: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
6110: 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a  rn nSize;.}../*.
6120: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
6130: 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 70 61   returns the spa
6140: 63 65 20 69 6e 20 62 79 74 65 73 20 72 65 71 75  ce in bytes requ
6150: 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  ired to store th
6160: 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68  e copy .** of th
6170: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  e Expr structure
6180: 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74   and a copy of t
6190: 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e  he Expr.u.zToken
61a0: 20 73 74 72 69 6e 67 20 28 69 66 20 74 68 61 74   string (if that
61b0: 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 64 65  .** string is de
61c0: 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69  fined.).*/.stati
61d0: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 4e  c int dupedExprN
61e0: 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a 70 2c  odeSize(Expr *p,
61f0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
6200: 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64  nt nByte = duped
6210: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  ExprStructSize(p
6220: 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66 66 66  , flags) & 0xfff
6230: 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  ;.  if( !ExprHas
6240: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49  Property(p, EP_I
6250: 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75  ntValue) && p->u
6260: 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e  .zToken ){.    n
6270: 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  Byte += sqlite3S
6280: 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f  trlen30(p->u.zTo
6290: 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65  ken)+1;.  }.  re
62a0: 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74  turn ROUND8(nByt
62b0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  e);.}../*.** Ret
62c0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
62d0: 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  f bytes required
62e0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 75 70   to create a dup
62f0: 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20 0a 2a  licate of the .*
6300: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73  * expression pas
6310: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
6320: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 73   argument. The s
6330: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
6340: 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74  s a.** mask cont
6350: 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50 5f 58  aining EXPRDUP_X
6360: 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20  XX flags..**.** 
6370: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
6380: 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70 61 63  ed includes spac
6390: 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f  e to create a co
63a0: 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73  py of the Expr s
63b0: 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20  truct.** itself 
63c0: 61 6e 64 20 74 68 65 20 62 75 66 66 65 72 20 72  and the buffer r
63d0: 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 45 78  eferred to by Ex
63e0: 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20  pr.u.zToken, if 
63f0: 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  any..**.** If th
6400: 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  e EXPRDUP_REDUCE
6410: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
6420: 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  en the return va
6430: 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a  lue includes .**
6440: 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c 69 63   space to duplic
6450: 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64  ate all Expr nod
6460: 65 73 20 69 6e 20 74 68 65 20 74 72 65 65 20 66  es in the tree f
6470: 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e 70 4c  ormed by Expr.pL
6480: 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72  eft .** and Expr
6490: 2e 70 52 69 67 68 74 20 76 61 72 69 61 62 6c 65  .pRight variable
64a0: 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72 20 61  s (but not for a
64b0: 6e 79 20 73 74 72 75 63 74 75 72 65 73 20 70 6f  ny structures po
64c0: 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20  inted to or .** 
64d0: 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d 20 74  descended from t
64e0: 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20  he Expr.x.pList 
64f0: 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63  or Expr.x.pSelec
6500: 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f  t variables)..*/
6510: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65  .static int dupe
6520: 64 45 78 70 72 53 69 7a 65 28 45 78 70 72 20 2a  dExprSize(Expr *
6530: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
6540: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a   int nByte = 0;.
6550: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6e    if( p ){.    n
6560: 42 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72  Byte = dupedExpr
6570: 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67  NodeSize(p, flag
6580: 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67  s);.    if( flag
6590: 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  s&EXPRDUP_REDUCE
65a0: 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20   ){.      nByte 
65b0: 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  += dupedExprSize
65c0: 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73  (p->pLeft, flags
65d0: 29 20 2b 20 64 75 70 65 64 45 78 70 72 53 69 7a  ) + dupedExprSiz
65e0: 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61  e(p->pRight, fla
65f0: 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  gs);.    }.  }. 
6600: 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d   return nByte;.}
6610: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
6620: 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72  ction is similar
6630: 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 44   to sqlite3ExprD
6640: 75 70 28 29 2c 20 65 78 63 65 70 74 20 74 68 61  up(), except tha
6650: 74 20 69 66 20 70 7a 42 75 66 66 65 72 20 0a 2a  t if pzBuffer .*
6660: 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  * is not NULL th
6670: 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20  en *pzBuffer is 
6680: 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74  assumed to point
6690: 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c 61 72   to a buffer lar
66a0: 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f  ge enough .** to
66b0: 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20   store the copy 
66c0: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2c  of expression p,
66d0: 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 70   the copies of p
66e0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69  ->u.zToken.** (i
66f0: 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 61  f applicable), a
6700: 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66  nd the copies of
6710: 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e   the p->pLeft an
6720: 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78 70 72  d p->pRight expr
6730: 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61  essions,.** if a
6740: 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72  ny. Before retur
6750: 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72 20  ning, *pzBuffer 
6760: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 66 69  is set to the fi
6770: 72 73 74 20 62 79 74 65 20 70 61 73 73 65 64 20  rst byte passed 
6780: 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f  the.** portion o
6790: 66 20 74 68 65 20 62 75 66 66 65 72 20 63 6f 70  f the buffer cop
67a0: 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68 69 73  ied into by this
67b0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
67c0: 61 74 69 63 20 45 78 70 72 20 2a 65 78 70 72 44  atic Expr *exprD
67d0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
67e0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
67f0: 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65  gs, u8 **pzBuffe
6800: 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  r){.  Expr *pNew
6810: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
6820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
6830: 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  lue to return */
6840: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
6850: 63 6f 6e 73 74 20 69 6e 74 20 69 73 52 65 64 75  const int isRedu
6860: 63 65 64 20 3d 20 28 66 6c 61 67 73 26 45 58 50  ced = (flags&EXP
6870: 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
6880: 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a 20 20    u8 *zAlloc;.  
6890: 20 20 75 33 32 20 73 74 61 74 69 63 46 6c 61 67    u32 staticFlag
68a0: 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73 65 72   = 0;..    asser
68b0: 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c  t( pzBuffer==0 |
68c0: 7c 20 69 73 52 65 64 75 63 65 64 20 29 3b 0a 0a  | isReduced );..
68d0: 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
68e0: 74 20 77 68 65 72 65 20 74 6f 20 77 72 69 74 65  t where to write
68f0: 20 74 68 65 20 6e 65 77 20 45 78 70 72 20 73 74   the new Expr st
6900: 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20 20  ructure. */.    
6910: 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a  if( pzBuffer ){.
6920: 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a        zAlloc = *
6930: 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 20 20  pzBuffer;.      
6940: 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45 50 5f  staticFlag = EP_
6950: 53 74 61 74 69 63 3b 0a 20 20 20 20 7d 65 6c 73  Static;.    }els
6960: 65 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20  e{.      zAlloc 
6970: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
6980: 63 52 61 77 28 64 62 2c 20 64 75 70 65 64 45 78  cRaw(db, dupedEx
6990: 70 72 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  prSize(p, flags)
69a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  );.    }.    pNe
69b0: 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c  w = (Expr *)zAll
69c0: 6f 63 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65  oc;..    if( pNe
69d0: 77 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65  w ){.      /* Se
69e0: 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74 68  t nNewSize to th
69f0: 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64  e size allocated
6a00: 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75   for the structu
6a10: 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20  re pointed to.  
6a20: 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20      ** by pNew. 
6a30: 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20 45  This is either E
6a40: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58  XPR_FULLSIZE, EX
6a50: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f  PR_REDUCEDSIZE o
6a60: 72 0a 20 20 20 20 20 20 2a 2a 20 45 58 50 52 5f  r.      ** EXPR_
6a70: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e  TOKENONLYSIZE. n
6a80: 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20  Token is set to 
6a90: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
6aa0: 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20  tes consumed.   
6ab0: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f 70     ** by the cop
6ac0: 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54  y of the p->u.zT
6ad0: 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20  oken string (if 
6ae0: 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  any)..      */. 
6af0: 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67       const unsig
6b00: 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20  ned nStructSize 
6b10: 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  = dupedExprStruc
6b20: 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b  tSize(p, flags);
6b30: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
6b40: 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72   nNewSize = nStr
6b50: 75 63 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b  uctSize & 0xfff;
6b60: 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65  .      int nToke
6b70: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21 45 78  n;.      if( !Ex
6b80: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
6b90: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26   EP_IntValue) &&
6ba0: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a   p->u.zToken ){.
6bb0: 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d          nToken =
6bc0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6bd0: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20  (p->u.zToken) + 
6be0: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
6bf0: 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d          nToken =
6c00: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
6c10: 20 20 69 66 28 20 69 73 52 65 64 75 63 65 64 20    if( isReduced 
6c20: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
6c30: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
6c40: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
6c50: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
6c60: 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70  memcpy(zAlloc, p
6c70: 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20  , nNewSize);.   
6c80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6c90: 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20 65 78    int nSize = ex
6ca0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b  prStructSize(p);
6cb0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
6cc0: 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65  zAlloc, p, nSize
6cd0: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  );.        memse
6ce0: 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d  t(&zAlloc[nSize]
6cf0: 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49  , 0, EXPR_FULLSI
6d00: 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20  ZE-nSize);.     
6d10: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74   }..      /* Set
6d20: 20 74 68 65 20 45 50 5f 52 65 64 75 63 65 64 2c   the EP_Reduced,
6d30: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61   EP_TokenOnly, a
6d40: 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c 61  nd EP_Static fla
6d50: 67 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  gs appropriately
6d60: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  . */.      pNew-
6d70: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52  >flags &= ~(EP_R
6d80: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
6d90: 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c 45 50  nly|EP_Static|EP
6da0: 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  _MemToken);.    
6db0: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
6dc0: 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 28   nStructSize & (
6dd0: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
6de0: 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20  kenOnly);.      
6df0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73  pNew->flags |= s
6e00: 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20  taticFlag;..    
6e10: 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 2d    /* Copy the p-
6e20: 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67  >u.zToken string
6e30: 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20  , if any. */.   
6e40: 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b     if( nToken ){
6e50: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
6e60: 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e  Token = pNew->u.
6e70: 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29  zToken = (char*)
6e80: 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65  &zAlloc[nNewSize
6e90: 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ];.        memcp
6ea0: 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a  y(zToken, p->u.z
6eb0: 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a  Token, nToken);.
6ec0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
6ed0: 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73  f( 0==((p->flags
6ee0: 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20  |pNew->flags) & 
6ef0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
6f00: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c  .        /* Fill
6f10: 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e   in the pNew->x.
6f20: 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d  pSelect or pNew-
6f30: 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e  >x.pList member.
6f40: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
6f50: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
6f60: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
6f70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
6f80: 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20  ew->x.pSelect = 
6f90: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
6fa0: 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63  (db, p->x.pSelec
6fb0: 74 2c 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20  t, isReduced);. 
6fc0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
6fd0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e          pNew->x.
6fe0: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
6ff0: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
7000: 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 73 52 65 64  ->x.pList, isRed
7010: 75 63 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d  uced);.        }
7020: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
7030: 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d  /* Fill in pNew-
7040: 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d  >pLeft and pNew-
7050: 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  >pRight. */.    
7060: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
7070: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52  perty(pNew, EP_R
7080: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
7090: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
70a0: 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45  zAlloc += dupedE
70b0: 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66  xprNodeSize(p, f
70c0: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 69  lags);.        i
70d0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
70e0: 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75  ty(pNew, EP_Redu
70f0: 63 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ced) ){.        
7100: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
7110: 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  exprDup(db, p->p
7120: 4c 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45  Left, EXPRDUP_RE
7130: 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a  DUCE, &zAlloc);.
7140: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
7150: 70 52 69 67 68 74 20 3d 20 65 78 70 72 44 75 70  pRight = exprDup
7160: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
7170: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20  EXPRDUP_REDUCE, 
7180: 26 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  &zAlloc);.      
7190: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
71a0: 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20  pzBuffer ){.    
71b0: 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72 20        *pzBuffer 
71c0: 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20  = zAlloc;.      
71d0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
71e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 45 78  .        if( !Ex
71f0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
7200: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
7210: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
7220: 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
7230: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
7240: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
7250: 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68       pNew->pRigh
7260: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
7270: 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74  up(db, p->pRight
7280: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
7290: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 7d 0a 20        }..    }. 
72a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
72b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
72c0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64  e and return a d
72d0: 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65 20  eep copy of the 
72e0: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
72f0: 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   the second .** 
7300: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20  argument. If an 
7310: 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  OOM condition is
7320: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55   encountered, NU
7330: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  LL is returned.*
7340: 2a 20 61 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61  * and the db->ma
7350: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
7360: 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  set..*/.#ifndef 
7370: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
7380: 73 74 61 74 69 63 20 57 69 74 68 20 2a 77 69 74  static With *wit
7390: 68 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  hDup(sqlite3 *db
73a0: 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20 20 57 69  , With *p){.  Wi
73b0: 74 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  th *pRet = 0;.  
73c0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  if( p ){.    int
73d0: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
73e0: 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e  *p) + sizeof(p->
73f0: 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43 74 65  a[0]) * (p->nCte
7400: 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20  -1);.    pRet = 
7410: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
7420: 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a  ero(db, nByte);.
7430: 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
7440: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
7450: 20 20 20 70 52 65 74 2d 3e 6e 43 74 65 20 3d 20     pRet->nCte = 
7460: 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20 20 66  p->nCte;.      f
7470: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74  or(i=0; i<p->nCt
7480: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
7490: 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c   pRet->a[i].pSel
74a0: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
74b0: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  ectDup(db, p->a[
74c0: 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  i].pSelect, 0);.
74d0: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b          pRet->a[
74e0: 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74  i].pCols = sqlit
74f0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
7500: 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c  , p->a[i].pCols,
7510: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65   0);.        pRe
7520: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
7530: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
7540: 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  db, p->a[i].zNam
7550: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
7560: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
7570: 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  Ret;.}.#else.# d
7580: 65 66 69 6e 65 20 77 69 74 68 44 75 70 28 78 2c  efine withDup(x,
7590: 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y) 0.#endif../*.
75a0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
75b0: 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e   group of routin
75c0: 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70  es make deep cop
75d0: 69 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ies of expressio
75e0: 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ns,.** expressio
75f0: 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74  n lists, ID list
7600: 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74  s, and select st
7610: 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63  atements.  The c
7620: 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20  opies can.** be 
7630: 64 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e  deleted (by bein
7640: 67 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69  g passed to thei
7650: 72 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e  r respective ...
7660: 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65  Delete() routine
7670: 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66  s).** without ef
7680: 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67  fecting the orig
7690: 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  inals..**.** The
76a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
76b0: 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65  , ID, and source
76c0: 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79   lists return by
76d0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
76e0: 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65  Dup(),.** sqlite
76f0: 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e  3IdListDup(), an
7700: 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
7710: 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65  Dup() can not be
7720: 20 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65   further expande
7730: 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75  d .** by subsequ
7740: 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
7750: 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29  ite*ListAppend()
7760: 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a   routines..**.**
7770: 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74   Any tables that
7780: 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67   the SrcList mig
7790: 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20  ht point to are 
77a0: 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a  not duplicated..
77b0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
77c0: 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69  parameter contai
77d0: 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ns a combination
77e0: 20 6f 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   of the EXPRDUP_
77f0: 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66  XXX flags..** If
7800: 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44   the EXPRDUP_RED
7810: 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c  UCE flag is set,
7820: 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63 74   then the struct
7830: 75 72 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  ure returned is 
7840: 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 76  a.** truncated v
7850: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 75 73  ersion of the us
7860: 75 61 6c 20 45 78 70 72 20 73 74 72 75 63 74 75  ual Expr structu
7870: 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  re that will be 
7880: 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61 72  stored as.** par
7890: 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  t of the in-memo
78a0: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
78b0: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
78c0: 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70  e schema..*/.Exp
78d0: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75  r *sqlite3ExprDu
78e0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
78f0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
7900: 73 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70  s){.  return exp
7910: 72 44 75 70 28 64 62 2c 20 70 2c 20 66 6c 61 67  rDup(db, p, flag
7920: 73 2c 20 30 29 3b 0a 7d 0a 45 78 70 72 4c 69 73  s, 0);.}.ExprLis
7930: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
7940: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
7950: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20  b, ExprList *p, 
7960: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78  int flags){.  Ex
7970: 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  prList *pNew;.  
7980: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
7990: 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f  item *pItem, *pO
79a0: 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  ldItem;.  int i;
79b0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
79c0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
79d0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
79e0: 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  Raw(db, sizeof(*
79f0: 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
7a00: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
7a10: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 45 43 75 72  0;.  pNew->iECur
7a20: 73 6f 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  sor = 0;.  pNew-
7a30: 3e 6e 45 78 70 72 20 3d 20 69 20 3d 20 70 2d 3e  >nExpr = i = p->
7a40: 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 28 66 6c  nExpr;.  if( (fl
7a50: 61 67 73 20 26 20 45 58 50 52 44 55 50 5f 52 45  ags & EXPRDUP_RE
7a60: 44 55 43 45 29 3d 3d 30 20 29 20 66 6f 72 28 69  DUCE)==0 ) for(i
7a70: 3d 31 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =1; i<p->nExpr; 
7a80: 69 2b 3d 69 29 7b 7d 0a 20 20 70 4e 65 77 2d 3e  i+=i){}.  pNew->
7a90: 61 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69  a = pItem = sqli
7aa0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
7ab0: 62 2c 20 20 69 2a 73 69 7a 65 6f 66 28 70 2d 3e  b,  i*sizeof(p->
7ac0: 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70  a[0]) );.  if( p
7ad0: 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Item==0 ){.    s
7ae0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7af0: 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75   pNew);.    retu
7b00: 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c  rn 0;.  } .  pOl
7b10: 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20  dItem = p->a;.  
7b20: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45  for(i=0; i<p->nE
7b30: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
7b40: 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a  +, pOldItem++){.
7b50: 20 20 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78      Expr *pOldEx
7b60: 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  pr = pOldItem->p
7b70: 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d  Expr;.    pItem-
7b80: 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  >pExpr = sqlite3
7b90: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  ExprDup(db, pOld
7ba0: 45 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Expr, flags);.  
7bb0: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
7bc0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
7bd0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
7be0: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d  Name);.    pItem
7bf0: 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
7c00: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
7c10: 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a  ldItem->zSpan);.
7c20: 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f      pItem->sortO
7c30: 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rder = pOldItem-
7c40: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
7c50: 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b  pItem->done = 0;
7c60: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 70 61  .    pItem->bSpa
7c70: 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  nIsTab = pOldIte
7c80: 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 3b 0a 20  m->bSpanIsTab;. 
7c90: 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70 4f     pItem->u = pO
7ca0: 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20  ldItem->u;.  }. 
7cb0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
7cc0: 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  ./*.** If cursor
7cd0: 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69 65  s, triggers, vie
7ce0: 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
7cf0: 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65  s are all omitte
7d00: 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75  d from.** the bu
7d10: 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f  ild, then none o
7d20: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
7d30: 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74  routines, except
7d40: 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33   for .** sqlite3
7d50: 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e  SelectDup(), can
7d60: 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69   be called. sqli
7d70: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20 69  te3SelectDup() i
7d80: 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63  s sometimes.** c
7d90: 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c  alled with a NUL
7da0: 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  L argument..*/.#
7db0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
7dc0: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
7dd0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7de0: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c  _OMIT_TRIGGER) \
7df0: 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  . || !defined(SQ
7e00: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
7e10: 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  RY).SrcList *sql
7e20: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 73  ite3SrcListDup(s
7e30: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c  qlite3 *db, SrcL
7e40: 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  ist *p, int flag
7e50: 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  s){.  SrcList *p
7e60: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
7e70: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28  int nByte;.  if(
7e80: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
7e90: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  ;.  nByte = size
7ea0: 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72  of(*p) + (p->nSr
7eb0: 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e  c>0 ? sizeof(p->
7ec0: 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63  a[0]) * (p->nSrc
7ed0: 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77  -1) : 0);.  pNew
7ee0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7ef0: 6f 63 52 61 77 28 64 62 2c 20 6e 42 79 74 65 20  ocRaw(db, nByte 
7f00: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
7f10: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
7f20: 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77  New->nSrc = pNew
7f30: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53  ->nAlloc = p->nS
7f40: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
7f50: 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  <p->nSrc; i++){.
7f60: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
7f70: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
7f80: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
7f90: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
7fa0: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
7fb0: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
7fc0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
7fd0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
7fe0: 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d  chema = pOldItem
7ff0: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70  ->pSchema;.    p
8000: 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  NewItem->zDataba
8010: 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  se = sqlite3DbSt
8020: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
8030: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
8040: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
8050: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
8060: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
8070: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
8080: 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  NewItem->zAlias 
8090: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
80a0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
80b0: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65  zAlias);.    pNe
80c0: 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  wItem->jointype 
80d0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e  = pOldItem->join
80e0: 74 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 49 74  type;.    pNewIt
80f0: 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f  em->iCursor = pO
8100: 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ldItem->iCursor;
8110: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61  .    pNewItem->a
8120: 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c  ddrFillSub = pOl
8130: 64 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  dItem->addrFillS
8140: 75 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ub;.    pNewItem
8150: 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 70 4f  ->regReturn = pO
8160: 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72  ldItem->regRetur
8170: 6e 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  n;.    pNewItem-
8180: 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 20 3d 20  >isCorrelated = 
8190: 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 43 6f 72 72  pOldItem->isCorr
81a0: 65 6c 61 74 65 64 3b 0a 20 20 20 20 70 4e 65 77  elated;.    pNew
81b0: 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69  Item->viaCorouti
81c0: 6e 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 76  ne = pOldItem->v
81d0: 69 61 43 6f 72 6f 75 74 69 6e 65 3b 0a 20 20 20  iaCoroutine;.   
81e0: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73 52 65 63   pNewItem->isRec
81f0: 75 72 73 69 76 65 20 3d 20 70 4f 6c 64 49 74 65  ursive = pOldIte
8200: 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65 3b 0a  m->isRecursive;.
8210: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 49      pNewItem->zI
8220: 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62  ndex = sqlite3Db
8230: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
8240: 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20  tem->zIndex);.  
8250: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6e 6f 74 49    pNewItem->notI
8260: 6e 64 65 78 65 64 20 3d 20 70 4f 6c 64 49 74 65  ndexed = pOldIte
8270: 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3b 0a 20  m->notIndexed;. 
8280: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 6e     pNewItem->pIn
8290: 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  dex = pOldItem->
82a0: 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62  pIndex;.    pTab
82b0: 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61   = pNewItem->pTa
82c0: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54  b = pOldItem->pT
82d0: 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
82e0: 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   ){.      pTab->
82f0: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nRef++;.    }.  
8300: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c    pNewItem->pSel
8310: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
8320: 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  ectDup(db, pOldI
8330: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c  tem->pSelect, fl
8340: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ags);.    pNewIt
8350: 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65  em->pOn = sqlite
8360: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c  3ExprDup(db, pOl
8370: 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67  dItem->pOn, flag
8380: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
8390: 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74  ->pUsing = sqlit
83a0: 65 33 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20  e3IdListDup(db, 
83b0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67  pOldItem->pUsing
83c0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
83d0: 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49  >colUsed = pOldI
83e0: 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20  tem->colUsed;.  
83f0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
8400: 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74  .}.IdList *sqlit
8410: 65 33 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69  e3IdListDup(sqli
8420: 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
8430: 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70  *p){.  IdList *p
8440: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
8450: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
8460: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
8470: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
8480: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
8490: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
84a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
84b0: 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d    pNew->nId = p-
84c0: 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20  >nId;.  pNew->a 
84d0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
84e0: 63 52 61 77 28 64 62 2c 20 70 2d 3e 6e 49 64 2a  cRaw(db, p->nId*
84f0: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
8500: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61  );.  if( pNew->a
8510: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
8520: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65  e3DbFree(db, pNe
8530: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
8540: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20  ;.  }.  /* Note 
8550: 74 68 61 74 20 62 65 63 61 75 73 65 20 74 68 65  that because the
8560: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c   size of the all
8570: 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61  ocation for p->a
8580: 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e  [] is not.  ** n
8590: 65 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77  ecessarily a pow
85a0: 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74  er of two, sqlit
85b0: 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29  e3IdListAppend()
85c0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c   may not be call
85d0: 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ed.  ** on the d
85e0: 75 70 6c 69 63 61 74 65 20 63 72 65 61 74 65 64  uplicate created
85f0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
8600: 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  n. */.  for(i=0;
8610: 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b   i<p->nId; i++){
8620: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
8630: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
8640: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
8650: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
8660: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
8670: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
8680: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
8690: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
86a0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
86b0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
86c0: 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f  ewItem->idx = pO
86d0: 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d  ldItem->idx;.  }
86e0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
86f0: 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  }.Select *sqlite
8700: 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74  3SelectDup(sqlit
8710: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
8720: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
8730: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 2c 20 2a   Select *pNew, *
8740: 70 50 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 3d  pPrior;.  if( p=
8750: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
8760: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
8770: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
8780: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
8790: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
87a0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  urn 0;.  pNew->p
87b0: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
87c0: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
87d0: 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29  ->pEList, flags)
87e0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d  ;.  pNew->pSrc =
87f0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
8800: 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20  up(db, p->pSrc, 
8810: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
8820: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
8830: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
8840: 57 68 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20  Where, flags);. 
8850: 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
8860: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
8870: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f  tDup(db, p->pGro
8880: 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20  upBy, flags);.  
8890: 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20  pNew->pHaving = 
88a0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
88b0: 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66  b, p->pHaving, f
88c0: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
88d0: 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
88e0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
88f0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c   p->pOrderBy, fl
8900: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70  ags);.  pNew->op
8910: 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77   = p->op;.  pNew
8920: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
8930: 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  r = sqlite3Selec
8940: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69  tDup(db, p->pPri
8950: 6f 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66  or, flags);.  if
8960: 28 20 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f  ( pPrior ) pPrio
8970: 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b  r->pNext = pNew;
8980: 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d  .  pNew->pNext =
8990: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d   0;.  pNew->pLim
89a0: 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  it = sqlite3Expr
89b0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  Dup(db, p->pLimi
89c0: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  t, flags);.  pNe
89d0: 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73 71 6c  w->pOffset = sql
89e0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
89f0: 70 2d 3e 70 4f 66 66 73 65 74 2c 20 66 6c 61 67  p->pOffset, flag
8a00: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d  s);.  pNew->iLim
8a10: 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  it = 0;.  pNew->
8a20: 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70  iOffset = 0;.  p
8a30: 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20  New->selFlags = 
8a40: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53  p->selFlags & ~S
8a50: 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
8a60: 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65  .  pNew->addrOpe
8a70: 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20  nEphm[0] = -1;. 
8a80: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
8a90: 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70  phm[1] = -1;.  p
8aa0: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
8ab0: 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  m[2] = -1;.  pNe
8ac0: 77 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  w->nSelectRow = 
8ad0: 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  p->nSelectRow;. 
8ae0: 20 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 77   pNew->pWith = w
8af0: 69 74 68 44 75 70 28 64 62 2c 20 70 2d 3e 70 57  ithDup(db, p->pW
8b00: 69 74 68 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ith);.  return p
8b10: 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c  New;.}.#else.Sel
8b20: 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65  ect *sqlite3Sele
8b30: 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  ctDup(sqlite3 *d
8b40: 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  b, Select *p, in
8b50: 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65  t flags){.  asse
8b60: 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65  rt( p==0 );.  re
8b70: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
8b80: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  .../*.** Add a n
8b90: 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
8ba0: 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72  e end of an expr
8bb0: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66  ession list.  If
8bc0: 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69   pList is.** ini
8bd0: 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65  tially NULL, the
8be0: 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 65  n create a new e
8bf0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
8c00: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
8c10: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
8c20: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65  or occurs, the e
8c30: 6e 74 69 72 65 20 6c 69 73 74 20 69 73 20 66 72  ntire list is fr
8c40: 65 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20  eed and.** NULL 
8c50: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  is returned.  If
8c60: 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74   non-NULL is ret
8c70: 75 72 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69  urned, then it i
8c80: 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
8c90: 74 68 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74  that the new ent
8ca0: 72 79 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ry was successfu
8cb0: 6c 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f  lly appended..*/
8cc0: 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74  .ExprList *sqlit
8cd0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
8ce0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
8cf0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
8d00: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
8d10: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
8d20: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
8d30: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
8d40: 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65  append. Might be
8d50: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
8d60: 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20  *pExpr          
8d70: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
8d80: 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e   to be appended.
8d90: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
8da0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
8db0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
8dc0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
8dd0: 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
8de0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
8df0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78  ro(db, sizeof(Ex
8e00: 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  prList) );.    i
8e10: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
8e20: 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
8e30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
8e40: 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62  t->a = sqlite3Db
8e50: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
8e60: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
8e70: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  ));.    if( pLis
8e80: 74 2d 3e 61 3d 3d 30 20 29 20 67 6f 74 6f 20 6e  t->a==0 ) goto n
8e90: 6f 5f 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 20 69  o_mem;.  }else i
8ea0: 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72  f( (pList->nExpr
8eb0: 20 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72   & (pList->nExpr
8ec0: 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  -1))==0 ){.    s
8ed0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
8ee0: 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61 73 73 65  tem *a;.    asse
8ef0: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
8f00: 3e 30 20 29 3b 0a 20 20 20 20 61 20 3d 20 73 71  >0 );.    a = sq
8f10: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
8f20: 62 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69  b, pList->a, pLi
8f30: 73 74 2d 3e 6e 45 78 70 72 2a 32 2a 73 69 7a 65  st->nExpr*2*size
8f40: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
8f50: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
8f60: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
8f70: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
8f80: 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d  List->a = a;.  }
8f90: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
8fa0: 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ->a!=0 );.  if( 
8fb0: 31 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  1 ){.    struct 
8fc0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
8fd0: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
8fe0: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d  [pList->nExpr++]
8ff0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74  ;.    memset(pIt
9000: 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  em, 0, sizeof(*p
9010: 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65  Item));.    pIte
9020: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
9030: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
9040: 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20  List;..no_mem:  
9050: 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c     .  /* Avoid l
9060: 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66  eaking memory if
9070: 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c   malloc has fail
9080: 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ed. */.  sqlite3
9090: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
90a0: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
90b0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
90c0: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
90d0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
90e0: 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74  Set the ExprList
90f0: 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65  .a[].zName eleme
9100: 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  nt of the most r
9110: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74  ecently added it
9120: 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70  em.** on the exp
9130: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
9140: 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20  .** pList might 
9150: 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e  be NULL followin
9160: 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20  g an OOM error. 
9170: 20 42 75 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c   But pName shoul
9180: 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55  d never be.** NU
9190: 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  LL.  If a memory
91a0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
91b0: 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64  s, the pParse->d
91c0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
91d0: 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a  flag.** is set..
91e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
91f0: 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a  xprListSetName(.
9200: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
9210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
9220: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
9230: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
9240: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
9250: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64  t to which to ad
9260: 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20  d the span. */. 
9270: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20   Token *pName,  
9280: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
9290: 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a   to be added */.
92a0: 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20    int dequote   
92b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
92c0: 65 20 74 6f 20 63 61 75 73 65 20 74 68 65 20 6e  e to cause the n
92d0: 61 6d 65 20 74 6f 20 62 65 20 64 65 71 75 6f 74  ame to be dequot
92e0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  ed */.){.  asser
92f0: 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70  t( pList!=0 || p
9300: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
9310: 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20  cFailed!=0 );.  
9320: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
9330: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
9340: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
9350: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
9360: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20  >nExpr>0 );.    
9370: 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
9380: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  a[pList->nExpr-1
9390: 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
93a0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  Item->zName==0 )
93b0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61  ;.    pItem->zNa
93c0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
93d0: 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  rNDup(pParse->db
93e0: 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  , pName->z, pNam
93f0: 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 64  e->n);.    if( d
9400: 65 71 75 6f 74 65 20 26 26 20 70 49 74 65 6d 2d  equote && pItem-
9410: 3e 7a 4e 61 6d 65 20 29 20 73 71 6c 69 74 65 33  >zName ) sqlite3
9420: 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a  Dequote(pItem->z
9430: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Name);.  }.}../*
9440: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
9450: 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65  List.a[].zSpan e
9460: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f  lement of the mo
9470: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
9480: 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65  d item.** on the
9490: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
94a0: 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69  ..**.** pList mi
94b0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c  ght be NULL foll
94c0: 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72  owing an OOM err
94d0: 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20 73  or.  But pSpan s
94e0: 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a  hould never be.*
94f0: 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65  * NULL.  If a me
9500: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
9510: 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73  fails, the pPars
9520: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
9530: 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73  led flag.** is s
9540: 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
9550: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 70  te3ExprListSetSp
9560: 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  an(.  Parse *pPa
9570: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
9580: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
9590: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
95a0: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  pList,        /*
95b0: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
95c0: 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20  o add the span. 
95d0: 2a 2f 0a 20 20 45 78 70 72 53 70 61 6e 20 2a 70  */.  ExprSpan *p
95e0: 53 70 61 6e 20 20 20 20 20 20 20 20 20 2f 2a 20  Span         /* 
95f0: 54 68 65 20 73 70 61 6e 20 74 6f 20 62 65 20 61  The span to be a
9600: 64 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  dded */.){.  sql
9610: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
9620: 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
9630: 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d   pList!=0 || db-
9640: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30  >mallocFailed!=0
9650: 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   );.  if( pList 
9660: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
9670: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
9680: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
9690: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  List->nExpr-1];.
96a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
96b0: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
96c0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
96d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 49  llocFailed || pI
96e0: 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61  tem->pExpr==pSpa
96f0: 6e 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  n->pExpr );.    
9700: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
9710: 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  , pItem->zSpan);
9720: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61  .    pItem->zSpa
9730: 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  n = sqlite3DbStr
9740: 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29  NDup(db, (char*)
9750: 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20  pSpan->zStart,. 
9760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9780: 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e     (int)(pSpan->
9790: 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53  zEnd - pSpan->zS
97a0: 74 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  tart));.  }.}../
97b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
97c0: 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69  ession list pELi
97d0: 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65  st contains more
97e0: 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65   than iLimit ele
97f0: 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20  ments,.** leave 
9800: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
9810: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76   in pParse..*/.v
9820: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
9830: 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a  istCheckLength(.
9840: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
9850: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
9860: 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ist,.  const cha
9870: 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20  r *zObject.){.  
9880: 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65 2d  int mx = pParse-
9890: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
98a0: 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
98b0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  ;.  testcase( pE
98c0: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
98d0: 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74  nExpr==mx );.  t
98e0: 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20  estcase( pEList 
98f0: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
9900: 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28 20  ==mx+1 );.  if( 
9910: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
9920: 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20  ->nExpr>mx ){.  
9930: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9940: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
9950: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25  any columns in %
9960: 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20  s", zObject);.  
9970: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
9980: 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72  e an entire expr
9990: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
99a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
99b0: 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74  ListDelete(sqlit
99c0: 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74  e3 *db, ExprList
99d0: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
99e0: 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  i;.  struct Expr
99f0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
9a00: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
9a10: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
9a20: 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30  ert( pList->a!=0
9a30: 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72   || pList->nExpr
9a40: 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 49 74  ==0 );.  for(pIt
9a50: 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
9a60: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
9a70: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
9a80: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
9a90: 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
9aa0: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71  ->pExpr);.    sq
9ab0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9ac0: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
9ad0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
9ae0: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61  (db, pItem->zSpa
9af0: 6e 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  n);.  }.  sqlite
9b00: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
9b10: 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  t->a);.  sqlite3
9b20: 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
9b30: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  );.}../*.** Thes
9b40: 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57  e routines are W
9b50: 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e  alker callbacks.
9b60: 20 20 57 61 6c 6b 65 72 2e 75 2e 70 69 20 69 73    Walker.u.pi is
9b70: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
9b80: 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 54 68   an integer.  Th
9b90: 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
9ba0: 20 63 68 65 63 6b 69 6e 67 20 61 6e 20 65 78 70   checking an exp
9bb0: 72 65 73 73 69 6f 6e 20 74 6f 20 73 65 65 0a 2a  ression to see.*
9bc0: 2a 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6e  * if it is a con
9bd0: 73 74 61 6e 74 2e 20 20 53 65 74 20 2a 57 61 6c  stant.  Set *Wal
9be0: 6b 65 72 2e 75 2e 70 69 20 74 6f 20 30 20 69 66  ker.u.pi to 0 if
9bf0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9c00: 69 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 73 74 61  is.** not consta
9c10: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  nt..**.** These 
9c20: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
9c30: 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d  s are used to im
9c40: 70 6c 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c  plement the foll
9c50: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
9c60: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
9c70: 6e 73 74 61 6e 74 28 29 0a 2a 2a 20 20 20 20 20  nstant().**     
9c80: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
9c90: 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 0a 2a  stantNotJoin().*
9ca0: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
9cb0: 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
9cc0: 63 74 69 6f 6e 28 29 0a 2a 2a 0a 2a 2f 0a 73 74  ction().**.*/.st
9cd0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64  atic int exprNod
9ce0: 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b  eIsConstant(Walk
9cf0: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
9d00: 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a  r *pExpr){..  /*
9d10: 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69   If pWalker->u.i
9d20: 20 69 73 20 33 20 74 68 65 6e 20 61 6e 79 20 74   is 3 then any t
9d30: 65 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65  erm of the expre
9d40: 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73  ssion that comes
9d50: 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f   from.  ** the O
9d60: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
9d70: 65 73 20 6f 66 20 61 20 6a 6f 69 6e 20 64 69 73  es of a join dis
9d80: 71 75 61 6c 69 66 69 65 73 20 74 68 65 20 65 78  qualifies the ex
9d90: 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72  pression.  ** fr
9da0: 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65  om being conside
9db0: 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f  red constant. */
9dc0: 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e  .  if( pWalker->
9dd0: 75 2e 69 3d 3d 33 20 26 26 20 45 78 70 72 48 61  u.i==3 && ExprHa
9de0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
9df0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
9e00: 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  .    pWalker->u.
9e10: 69 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  i = 0;.    retur
9e20: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
9e30: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
9e40: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  r->op ){.    /* 
9e50: 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f  Consider functio
9e60: 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e  ns to be constan
9e70: 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61  t if all their a
9e80: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e  rguments are con
9e90: 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64  stant.    ** and
9ea0: 20 65 69 74 68 65 72 20 70 57 61 6c 6b 65 72 2d   either pWalker-
9eb0: 3e 75 2e 69 3d 3d 32 20 6f 72 20 74 68 65 20 66  >u.i==2 or the f
9ec0: 75 6e 63 74 69 6f 6e 20 61 73 20 74 68 65 20 53  unction as the S
9ed0: 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54  QLITE_FUNC_CONST
9ee0: 0a 20 20 20 20 2a 2a 20 66 6c 61 67 2e 20 2a 2f  .    ** flag. */
9ef0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
9f00: 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28  CTION:.      if(
9f10: 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32   pWalker->u.i==2
9f20: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
9f30: 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e  rty(pExpr,EP_Con
9f40: 73 74 61 6e 74 29 20 29 7b 0a 20 20 20 20 20 20  stant) ){.      
9f50: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
9f60: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
9f70: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
9f80: 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65  ough */.    case
9f90: 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65   TK_ID:.    case
9fa0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20   TK_COLUMN:.    
9fb0: 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
9fc0: 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  TION:.    case T
9fd0: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
9fe0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
9ff0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  xpr->op==TK_ID )
a000: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
a010: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
a020: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
a030: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
a040: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
a050: 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  TION );.      te
a060: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
a070: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
a080: 20 29 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b 65   );.      pWalke
a090: 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 20 20  r->u.i = 0;.    
a0a0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
a0b0: 72 74 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  rt;.    default:
a0c0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
a0d0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
a0e0: 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 65 6c 65  ELECT ); /* sele
a0f0: 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  ctNodeIsConstant
a100: 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a   will disallow *
a110: 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
a120: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
a130: 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 65 6c  EXISTS ); /* sel
a140: 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  ectNodeIsConstan
a150: 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20  t will disallow 
a160: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
a170: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
a180: 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  }.}.static int s
a190: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
a1a0: 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ant(Walker *pWal
a1b0: 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74  ker, Select *Not
a1c0: 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Used){.  UNUSED_
a1d0: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
a1e0: 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 75  d);.  pWalker->u
a1f0: 2e 69 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  .i = 0;.  return
a200: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74   WRC_Abort;.}.st
a210: 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 43  atic int exprIsC
a220: 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e  onst(Expr *p, in
a230: 74 20 69 6e 69 74 46 6c 61 67 29 7b 0a 20 20 57  t initFlag){.  W
a240: 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65  alker w;.  memse
a250: 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
a260: 77 29 29 3b 0a 20 20 77 2e 75 2e 69 20 3d 20 69  w));.  w.u.i = i
a270: 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78  nitFlag;.  w.xEx
a280: 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
a290: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b  rNodeIsConstant;
a2a0: 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
a2b0: 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64  back = selectNod
a2c0: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 73  eIsConstant;.  s
a2d0: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
a2e0: 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  w, p);.  return 
a2f0: 77 2e 75 2e 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w.u.i;.}../*.** 
a300: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
a310: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
a320: 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
a330: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
a340: 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20  .** and 0 if it 
a350: 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c  involves variabl
a360: 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63  es or function c
a370: 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  alls..**.** For 
a380: 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
a390: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
a3a0: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
a3b0: 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22  tring (ex: "abc"
a3c0: 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  ).** is consider
a3d0: 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75  ed a variable bu
a3e0: 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65  t a single-quote
a3f0: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61  d string (ex: 'a
a400: 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e  bc') is.** a con
a410: 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stant..*/.int sq
a420: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
a430: 61 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ant(Expr *p){.  
a440: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
a450: 73 74 28 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  st(p, 1);.}../*.
a460: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
a470: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
a480: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
a490: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
a4a0: 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73  ant.** that does
a4b0: 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72   no originate fr
a4c0: 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  om the ON or USI
a4d0: 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20  NG clauses of a 
a4e0: 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  join..** Return 
a4f0: 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73  0 if it involves
a500: 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75   variables or fu
a510: 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20  nction calls or 
a520: 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e  terms from.** an
a530: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
a540: 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
a550: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
a560: 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70  tNotJoin(Expr *p
a570: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
a580: 49 73 43 6f 6e 73 74 28 70 2c 20 33 29 3b 0a 7d  IsConst(p, 3);.}
a590: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
a5a0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
a5b0: 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
a5c0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
a5d0: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61  constant.** or a
a5e0: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77   function call w
a5f0: 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  ith constant arg
a600: 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  uments.  Return 
a610: 61 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a  and 0 if there.*
a620: 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62  * are any variab
a630: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
a640: 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
a650: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
a660: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
a670: 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29  ring (ex: "abc")
a680: 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
a690: 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74  d a variable but
a6a0: 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64   a single-quoted
a6b0: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62   string (ex: 'ab
a6c0: 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73  c') is.** a cons
a6d0: 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tant..*/.int sql
a6e0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
a6f0: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70  ntOrFunction(Exp
a700: 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *p){.  return 
a710: 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32  exprIsConst(p, 2
a720: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  );.}../*.** If t
a730: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  he expression p 
a740: 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74  codes a constant
a750: 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 73   integer that is
a760: 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a   small enough.**
a770: 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d   to fit in a 32-
a780: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74  bit integer, ret
a790: 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68  urn 1 and put th
a7a0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
a7b0: 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56  nteger.** in *pV
a7c0: 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65 78  alue.  If the ex
a7d0: 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20  pression is not 
a7e0: 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66  an integer or if
a7f0: 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a   it is too big.*
a800: 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69  * to fit in a si
a810: 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65  gned 32-bit inte
a820: 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e  ger, return 0 an
a830: 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20  d leave *pValue 
a840: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  unchanged..*/.in
a850: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  t sqlite3ExprIsI
a860: 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20  nteger(Expr *p, 
a870: 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20  int *pValue){.  
a880: 69 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f  int rc = 0;..  /
a890: 2a 20 49 66 20 61 6e 20 65 78 70 72 65 73 73 69  * If an expressi
a8a0: 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  on is an integer
a8b0: 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 66 69   literal that fi
a8c0: 74 73 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33  ts in a signed 3
a8d0: 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67  2-bit.  ** integ
a8e0: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 45 50 5f  er, then the EP_
a8f0: 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 77 69  IntValue flag wi
a900: 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ll have already 
a910: 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73  been set */.  as
a920: 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f  sert( p->op!=TK_
a930: 49 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66  INTEGER || (p->f
a940: 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
a950: 75 65 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  ue)!=0.         
a960: 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49    || sqlite3GetI
a970: 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  nt32(p->u.zToken
a980: 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20  , &rc)==0 );..  
a990: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45  if( p->flags & E
a9a0: 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20  P_IntValue ){.  
a9b0: 20 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75    *pValue = p->u
a9c0: 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 72 65 74  .iValue;.    ret
a9d0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69  urn 1;.  }.  swi
a9e0: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
a9f0: 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
aa00: 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
aa10: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
aa20: 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61  er(p->pLeft, pVa
aa30: 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  lue);.      brea
aa40: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
aa50: 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
aa60: 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20       int v;.    
aa70: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
aa80: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
aa90: 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20  eft, &v) ){.    
aaa0: 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 28      assert( v!=(
aab0: 2d 32 31 34 37 34 38 33 36 34 37 2d 31 29 20 29  -2147483647-1) )
aac0: 3b 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75  ;.        *pValu
aad0: 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20  e = -v;.        
aae0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rc = 1;.      }.
aaf0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ab00: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
ab10: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
ab20: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
ab30: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
ab40: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61   there is no cha
ab50: 6e 63 65 20 74 68 61 74 20 74 68 65 20 65 78 70  nce that the exp
ab60: 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e  ression can be N
ab70: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ULL..**.** If th
ab80: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67  e expression mig
ab90: 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66  ht be NULL or if
aba0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
abb0: 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a  is too complex.*
abc0: 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e  * to tell return
abd0: 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54   TRUE.  .**.** T
abe0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
abf0: 73 65 64 20 61 73 20 61 6e 20 6f 70 74 69 6d 69  sed as an optimi
ac00: 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20  zation, to skip 
ac10: 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65  OP_IsNull opcode
ac20: 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f  s.** when we kno
ac30: 77 20 74 68 61 74 20 61 20 76 61 6c 75 65 20 63  w that a value c
ac40: 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20  annot be NULL.  
ac50: 48 65 6e 63 65 2c 20 61 20 66 61 6c 73 65 20 70  Hence, a false p
ac60: 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72 65 74 75  ositive.** (retu
ac70: 72 6e 69 6e 67 20 54 52 55 45 20 77 68 65 6e 20  rning TRUE when 
ac80: 69 6e 20 66 61 63 74 20 74 68 65 20 65 78 70 72  in fact the expr
ac90: 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72  ession can never
aca0: 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a   be NULL) might.
acb0: 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20 70 65  ** be a small pe
acc0: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 20 62 75  rformance hit bu
acd0: 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 68  t is otherwise h
ace0: 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65  armless.  On the
acf0: 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20   other.** hand, 
ad00: 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65  a false negative
ad10: 20 28 72 65 74 75 72 6e 69 6e 67 20 46 41 4c 53   (returning FALS
ad20: 45 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c  E when the resul
ad30: 74 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29  t could be NULL)
ad40: 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  .** will likely 
ad50: 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63  result in an inc
ad60: 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e 20 20  orrect answer.  
ad70: 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75 62 74  So when in doubt
ad80: 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45  , return.** TRUE
ad90: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ada0: 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f  ExprCanBeNull(co
adb0: 6e 73 74 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  nst Expr *p){.  
adc0: 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20  u8 op;.  while( 
add0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  p->op==TK_UPLUS 
ade0: 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49  || p->op==TK_UMI
adf0: 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c  NUS ){ p = p->pL
ae00: 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d  eft; }.  op = p-
ae10: 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
ae20: 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20  K_REGISTER ) op 
ae30: 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74  = p->op2;.  swit
ae40: 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
ae50: 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20  se TK_INTEGER:. 
ae60: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
ae70: 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  G:.    case TK_F
ae80: 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54  LOAT:.    case T
ae90: 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65  K_BLOB:.      re
aea0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 64 65 66 61  turn 0;.    defa
aeb0: 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
aec0: 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 1;.  }.}../*.*
aed0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
aee0: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
aef0: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74  ssion is a const
af00: 61 6e 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ant which would 
af10: 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20  be.** unchanged 
af20: 62 79 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77  by OP_Affinity w
af30: 69 74 68 20 74 68 65 20 61 66 66 69 6e 69 74 79  ith the affinity
af40: 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65   given in the se
af50: 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  cond.** argument
af60: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
af70: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
af80: 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
af90: 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65   OP_Affinity ope
afa0: 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65  ration.** can be
afb0: 20 6f 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20   omitted.  When 
afc0: 69 6e 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20  in doubt return 
afd0: 46 41 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20  FALSE.  A false 
afe0: 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68  negative.** is h
aff0: 61 72 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73  armless.  A fals
b000: 65 20 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65  e positive, howe
b010: 76 65 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20  ver, can result 
b020: 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20  in the wrong.** 
b030: 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  answer..*/.int s
b040: 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e  qlite3ExprNeedsN
b050: 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  oAffinityChange(
b060: 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63  const Expr *p, c
b070: 68 61 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f  har aff){.  u8 o
b080: 70 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51  p;.  if( aff==SQ
b090: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 20  LITE_AFF_NONE ) 
b0a0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c  return 1;.  whil
b0b0: 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c  e( p->op==TK_UPL
b0c0: 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  US || p->op==TK_
b0d0: 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d  UMINUS ){ p = p-
b0e0: 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d  >pLeft; }.  op =
b0f0: 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70   p->op;.  if( op
b100: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20  ==TK_REGISTER ) 
b110: 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73  op = p->op2;.  s
b120: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
b130: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
b140: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
b150: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
b160: 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d  _INTEGER || aff=
b170: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
b180: 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  RIC;.    }.    c
b190: 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a  ase TK_FLOAT: {.
b1a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66        return aff
b1b0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
b1c0: 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  L || aff==SQLITE
b1d0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
b1e0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
b1f0: 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
b200: 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49  return aff==SQLI
b210: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
b220: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
b230: 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  LOB: {.      ret
b240: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
b250: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
b260: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
b270: 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b   p->iTable>=0 );
b280: 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65    /* p cannot be
b290: 20 70 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b   part of a CHECK
b2a0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
b2b0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69       return p->i
b2c0: 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20  Column<0.       
b2d0: 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49     && (aff==SQLI
b2e0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c  TE_AFF_INTEGER |
b2f0: 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
b300: 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20  F_NUMERIC);.    
b310: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
b320: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
b330: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
b340: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
b350: 69 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  if the given str
b360: 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20  ing is a row-id 
b370: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a  column name..*/.
b380: 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77  int sqlite3IsRow
b390: 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  id(const char *z
b3a0: 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
b3b0: 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57  StrICmp(z, "_ROW
b3c0: 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72  ID_")==0 ) retur
b3d0: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
b3e0: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f  e3StrICmp(z, "RO
b3f0: 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  WID")==0 ) retur
b400: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
b410: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49  e3StrICmp(z, "OI
b420: 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
b430: 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
b440: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
b450: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 61 62  rue if we are ab
b460: 6c 65 20 74 6f 20 74 68 65 20 49 4e 20 6f 70 65  le to the IN ope
b470: 72 61 74 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69  rator optimizati
b480: 6f 6e 20 6f 6e 20 61 0a 2a 2a 20 71 75 65 72 79  on on a.** query
b490: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a   of the form.**.
b4a0: 2a 2a 20 20 20 20 20 20 20 78 20 49 4e 20 28 53  **       x IN (S
b4b0: 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  ELECT ...).**.**
b4c0: 20 57 68 65 72 65 20 74 68 65 20 53 45 4c 45 43   Where the SELEC
b4d0: 54 2e 2e 2e 20 63 6c 61 75 73 65 20 69 73 20 61  T... clause is a
b4e0: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  s specified by t
b4f0: 68 65 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  he parameter to 
b500: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e  this.** routine.
b510: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 65 6c 65 63  .**.** The Selec
b520: 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  t object passed 
b530: 69 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  in has already b
b540: 65 65 6e 20 70 72 65 70 72 6f 63 65 73 73 65 64  een preprocessed
b550: 20 61 6e 64 20 6e 6f 0a 2a 2a 20 65 72 72 6f 72   and no.** error
b560: 73 20 68 61 76 65 20 62 65 65 6e 20 66 6f 75 6e  s have been foun
b570: 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  d..*/.#ifndef SQ
b580: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
b590: 52 59 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  RY.static int is
b5a0: 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
b5b0: 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  t(Select *p){.  
b5c0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
b5d0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
b5e0: 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  t;.  Table *pTab
b5f0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
b600: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
b610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 69             /* ri
b620: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
b630: 20 49 4e 20 69 73 20 53 45 4c 45 43 54 20 2a 2f   IN is SELECT */
b640: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
b650: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
b660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74            /* Not
b670: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
b680: 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  CT */.  if( p->s
b690: 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
b6a0: 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
b6b0: 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74  ate) ){.    test
b6c0: 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61  case( (p->selFla
b6d0: 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
b6e0: 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
b6f0: 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b  ==SF_Distinct );
b700: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28  .    testcase( (
b710: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
b720: 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
b730: 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67  gregate))==SF_Ag
b740: 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72  gregate );.    r
b750: 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44  eturn 0; /* No D
b760: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
b770: 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65  and no aggregate
b780: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
b790: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  }.  assert( p->p
b7a0: 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20  GroupBy==0 );   
b7b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
b7c0: 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  s no GROUP BY cl
b7d0: 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ause */.  if( p-
b7e0: 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
b7f0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
b800: 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54   /* Has no LIMIT
b810: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73 73   clause */.  ass
b820: 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d  ert( p->pOffset=
b830: 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
b840: 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20      /* No LIMIT 
b850: 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54 20  means no OFFSET 
b860: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65  */.  if( p->pWhe
b870: 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  re ) return 0;  
b880: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
b890: 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  as no WHERE clau
b8a0: 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70  se */.  pSrc = p
b8b0: 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
b8c0: 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69  ( pSrc!=0 );.  i
b8d0: 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  f( pSrc->nSrc!=1
b8e0: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
b8f0: 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20        /* Single 
b900: 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61  term in FROM cla
b910: 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72  use */.  if( pSr
b920: 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20  c->a[0].pSelect 
b930: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
b940: 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61  /* FROM is not a
b950: 20 73 75 62 71 75 65 72 79 20 6f 72 20 76 69 65   subquery or vie
b960: 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53  w */.  pTab = pS
b970: 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20  rc->a[0].pTab;. 
b980: 20 69 66 28 20 4e 45 56 45 52 28 70 54 61 62 3d   if( NEVER(pTab=
b990: 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  =0) ) return 0;.
b9a0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
b9b0: 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20  pSelect==0 );   
b9c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d           /* FROM
b9d0: 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61   clause is not a
b9e0: 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49   view */.  if( I
b9f0: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
ba00: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
ba10: 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
ba20: 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74   not a virtual t
ba30: 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74  able */.  pEList
ba40: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
ba50: 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  if( pEList->nExp
ba60: 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  r!=1 ) return 0;
ba70: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 6f         /* One co
ba80: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75  lumn in the resu
ba90: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 66 28 20  lt set */.  if( 
baa0: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
bab0: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
bac0: 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a  N ) return 0; /*
bad0: 20 52 65 73 75 6c 74 20 69 73 20 61 20 63 6f 6c   Result is a col
bae0: 75 6d 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  umn */.  return 
baf0: 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
bb00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
bb10: 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ERY */../*.** Co
bb20: 64 65 20 61 6e 20 4f 50 5f 4f 6e 63 65 20 69 6e  de an OP_Once in
bb30: 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 61 6c  struction and al
bb40: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
bb50: 20 69 74 73 20 66 6c 61 67 2e 20 52 65 74 75 72   its flag. Retur
bb60: 6e 20 74 68 65 20 0a 2a 2a 20 61 64 64 72 65 73  n the .** addres
bb70: 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73  s of the new ins
bb80: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  truction..*/.int
bb90: 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65   sqlite3CodeOnce
bba0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
bbb0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
bbc0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
bbd0: 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 56 69 72  se);      /* Vir
bbe0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69  tual machine bei
bbf0: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 72 65  ng coded */.  re
bc00: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
bc10: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp1(v, OP_Onc
bc20: 65 2c 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65  e, pParse->nOnce
bc30: 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ++);.}../*.** Th
bc40: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
bc50: 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65  sed by the imple
bc60: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
bc70: 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74   IN (...) operat
bc80: 6f 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70 61  or..** The pX pa
bc90: 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65  rameter is the e
bca0: 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65  xpression on the
bcb0: 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
bcc0: 70 65 72 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a  perator, which.*
bcd0: 2a 20 6d 69 67 68 74 20 62 65 20 65 69 74 68 65  * might be eithe
bce0: 72 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72  r a list of expr
bcf0: 65 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62  essions or a sub
bd00: 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  query..**.** The
bd10: 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75   job of this rou
bd20: 74 69 6e 65 20 69 73 20 74 6f 20 66 69 6e 64 20  tine is to find 
bd30: 6f 72 20 63 72 65 61 74 65 20 61 20 62 2d 74 72  or create a b-tr
bd40: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63  ee object that c
bd50: 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 65 69  an.** be used ei
bd60: 74 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72  ther to test for
bd70: 20 6d 65 6d 62 65 72 73 68 69 70 20 69 6e 20 74   membership in t
bd80: 68 65 20 52 48 53 20 73 65 74 20 6f 72 20 74 6f  he RHS set or to
bd90: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
bda0: 0a 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20  .** all members 
bdb0: 6f 66 20 74 68 65 20 52 48 53 20 73 65 74 2c 20  of the RHS set, 
bdc0: 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61  skipping duplica
bdd0: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72  tes..**.** A cur
bde0: 73 6f 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  sor is opened on
bdf0: 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65   the b-tree obje
be00: 63 74 20 74 68 61 74 20 74 68 65 20 52 48 53 20  ct that the RHS 
be10: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
be20: 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69 54  or.** and pX->iT
be30: 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74  able is set to t
be40: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74  he index of that
be50: 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54   cursor..**.** T
be60: 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
be70: 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
be80: 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68 65  on indicates the
be90: 20 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73   b-tree type, as
bea0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
beb0: 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44    IN_INDEX_ROWID
bec0: 20 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73        - The curs
bed0: 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
bee0: 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c   a database tabl
bef0: 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  e..**   IN_INDEX
bf00: 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d 20 54 68  _INDEX_ASC  - Th
bf10: 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
bf20: 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64  ned on an ascend
bf30: 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20  ing index..**   
bf40: 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44  IN_INDEX_INDEX_D
bf50: 45 53 43 20 2d 20 54 68 65 20 63 75 72 73 6f 72  ESC - The cursor
bf60: 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
bf70: 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65   descending inde
bf80: 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  x..**   IN_INDEX
bf90: 5f 45 50 48 20 20 20 20 20 20 20 20 2d 20 54 68  _EPH        - Th
bfa0: 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
bfb0: 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61 6c  ned on a special
bfc0: 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a  ly created and.*
bfd0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
bfe0: 20 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c 61            popula
bff0: 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74 61  ted epheremal ta
c000: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  ble..**.** An ex
c010: 69 73 74 69 6e 67 20 62 2d 74 72 65 65 20 6d 69  isting b-tree mi
c020: 67 68 74 20 62 65 20 75 73 65 64 20 69 66 20 74  ght be used if t
c030: 68 65 20 52 48 53 20 65 78 70 72 65 73 73 69 6f  he RHS expressio
c040: 6e 20 70 58 20 69 73 20 61 20 73 69 6d 70 6c 65  n pX is a simple
c050: 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 73 75 63  .** subquery suc
c060: 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  h as:.**.**     
c070: 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20  SELECT <column> 
c080: 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a  FROM <table>.**.
c090: 2a 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f 66  ** If the RHS of
c0a0: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
c0b0: 20 69 73 20 61 20 6c 69 73 74 20 6f 72 20 61 20   is a list or a 
c0c0: 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 73 75 62  more complex sub
c0d0: 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61  query, then.** a
c0e0: 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
c0f0: 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  e might need to 
c100: 62 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  be generated fro
c110: 6d 20 74 68 65 20 52 48 53 20 61 6e 64 20 74 68  m the RHS and th
c120: 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65  en.** pX->iTable
c130: 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74   made to point t
c140: 6f 20 74 68 65 20 65 70 68 65 72 6d 65 72 61 6c  o the ephermeral
c150: 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f   table instead o
c160: 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67  f an.** existing
c170: 20 74 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 20   table.  .**.** 
c180: 49 66 20 74 68 65 20 70 72 4e 6f 74 46 6f 75 6e  If the prNotFoun
c190: 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  d parameter is 0
c1a0: 2c 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65  , then the b-tre
c1b0: 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  e will be used t
c1c0: 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72  o iterate.** thr
c1d0: 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d  ough the set mem
c1e0: 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67 20 61  bers, skipping a
c1f0: 6e 79 20 64 75 70 6c 69 63 61 74 65 73 2e 20 49  ny duplicates. I
c200: 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 0a 2a  n this case an.*
c210: 2a 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  * epheremal tabl
c220: 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 75  e must be used u
c230: 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63 74  nless the select
c240: 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 67  ed <column> is g
c250: 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20  uaranteed.** to 
c260: 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68  be unique - eith
c270: 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69 73  er because it is
c280: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
c290: 41 52 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a 2a  ARY KEY or it.**
c2a0: 20 68 61 73 20 61 20 55 4e 49 51 55 45 20 63 6f   has a UNIQUE co
c2b0: 6e 73 74 72 61 69 6e 74 20 6f 72 20 55 4e 49 51  nstraint or UNIQ
c2c0: 55 45 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  UE index..**.** 
c2d0: 49 66 20 74 68 65 20 70 72 4e 6f 74 46 6f 75 6e  If the prNotFoun
c2e0: 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  d parameter is n
c2f0: 6f 74 20 30 2c 20 74 68 65 6e 20 74 68 65 20 62  ot 0, then the b
c300: 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73  -tree will be us
c310: 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20  ed .** for fast 
c320: 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74  set membership t
c330: 65 73 74 73 2e 20 49 6e 20 74 68 69 73 20 63 61  ests. In this ca
c340: 73 65 20 61 6e 20 65 70 68 65 72 65 6d 61 6c 20  se an epheremal 
c350: 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62  table must .** b
c360: 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c 63  e used unless <c
c370: 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e 20 49 4e 54  olumn> is an INT
c380: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
c390: 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 63 61 6e   or an index can
c3a0: 20 0a 2a 2a 20 62 65 20 66 6f 75 6e 64 20 77 69   .** be found wi
c3b0: 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61 73 20 69  th <column> as i
c3c0: 74 73 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  ts left-most col
c3d0: 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  umn..**.** When 
c3e0: 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 62 65  the b-tree is be
c3f0: 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65 6d  ing used for mem
c400: 62 65 72 73 68 69 70 20 74 65 73 74 73 2c 20 74  bership tests, t
c410: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
c420: 69 6f 6e 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  ion.** needs to 
c430: 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20  know whether or 
c440: 6e 6f 74 20 74 68 65 20 73 74 72 75 63 74 75 72  not the structur
c450: 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 53 51  e contains an SQ
c460: 4c 20 4e 55 4c 4c 20 0a 2a 2a 20 76 61 6c 75 65  L NULL .** value
c470: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 72   in order to cor
c480: 72 65 63 74 6c 79 20 65 76 61 6c 75 61 74 65 20  rectly evaluate 
c490: 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 69 6b 65  expressions like
c4a0: 20 22 58 20 49 4e 20 28 59 2c 20 5a 29 22 2e 0a   "X IN (Y, Z)"..
c4b0: 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  ** If there is a
c4c0: 6e 79 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  ny chance that t
c4d0: 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63  he (...) might c
c4e0: 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61  ontain a NULL va
c4f0: 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d  lue at.** runtim
c500: 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69 73 74  e, then a regist
c510: 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  er is allocated 
c520: 61 6e 64 20 74 68 65 20 72 65 67 69 73 74 65 72  and the register
c530: 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a   number written.
c540: 2a 2a 20 74 6f 20 2a 70 72 4e 6f 74 46 6f 75 6e  ** to *prNotFoun
c550: 64 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  d. If there is n
c560: 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  o chance that th
c570: 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73  e (...) contains
c580: 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65   a.** NULL value
c590: 2c 20 74 68 65 6e 20 2a 70 72 4e 6f 74 46 6f 75  , then *prNotFou
c5a0: 6e 64 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  nd is left uncha
c5b0: 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nged..**.** If a
c5c0: 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c   register is all
c5d0: 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c  ocated and its l
c5e0: 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69  ocation stored i
c5f0: 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2c 20 74  n *prNotFound, t
c600: 68 65 6e 0a 2a 2a 20 69 74 73 20 69 6e 69 74 69  hen.** its initi
c610: 61 6c 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c  al value is NULL
c620: 2e 20 20 49 66 20 74 68 65 20 28 2e 2e 2e 29 20  .  If the (...) 
c630: 64 6f 65 73 20 6e 6f 74 20 72 65 6d 61 69 6e 20  does not remain 
c640: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20  constant.** for 
c650: 74 68 65 20 64 75 72 61 74 69 6f 6e 20 6f 66 20  the duration of 
c660: 74 68 65 20 71 75 65 72 79 20 28 69 2e 65 2e 20  the query (i.e. 
c670: 74 68 65 20 53 45 4c 45 43 54 20 77 69 74 68 69  the SELECT withi
c680: 6e 20 74 68 65 20 28 2e 2e 2e 29 0a 2a 2a 20 69  n the (...).** i
c690: 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  s a correlated s
c6a0: 75 62 71 75 65 72 79 29 20 74 68 65 6e 20 74 68  ubquery) then th
c6b0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 61  e value of the a
c6c0: 6c 6c 6f 63 61 74 65 64 20 72 65 67 69 73 74 65  llocated registe
c6d0: 72 20 69 73 0a 2a 2a 20 72 65 73 65 74 20 74 6f  r is.** reset to
c6e0: 20 4e 55 4c 4c 20 65 61 63 68 20 74 69 6d 65 20   NULL each time 
c6f0: 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
c700: 72 65 72 75 6e 2e 20 54 68 69 73 20 61 6c 6c 6f  rerun. This allo
c710: 77 73 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72  ws the.** caller
c720: 20 74 6f 20 75 73 65 20 76 64 62 65 20 63 6f 64   to use vdbe cod
c730: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  e equivalent to 
c740: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
c750: 2a 0a 2a 2a 20 20 20 69 66 28 20 72 65 67 69 73  *.**   if( regis
c760: 74 65 72 3d 3d 4e 55 4c 4c 20 29 7b 0a 2a 2a 20  ter==NULL ){.** 
c770: 20 20 20 20 68 61 73 5f 6e 75 6c 6c 20 3d 20 3c      has_null = <
c780: 74 65 73 74 20 69 66 20 64 61 74 61 20 73 74 72  test if data str
c790: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
c7a0: 6e 75 6c 6c 3e 0a 2a 2a 20 20 20 20 20 72 65 67  null>.**     reg
c7b0: 69 73 74 65 72 20 3d 20 31 0a 2a 2a 20 20 20 7d  ister = 1.**   }
c7c0: 0a 2a 2a 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  .**.** in order 
c7d0: 74 6f 20 61 76 6f 69 64 20 72 75 6e 6e 69 6e 67  to avoid running
c7e0: 20 74 68 65 20 3c 74 65 73 74 20 69 66 20 64 61   the <test if da
c7f0: 74 61 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ta structure con
c800: 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 74  tains null>.** t
c810: 65 73 74 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74  est more often t
c820: 68 61 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79  han is necessary
c830: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
c840: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
c850: 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e  Y.int sqlite3Fin
c860: 64 49 6e 49 6e 64 65 78 28 50 61 72 73 65 20 2a  dInIndex(Parse *
c870: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 58  pParse, Expr *pX
c880: 2c 20 69 6e 74 20 2a 70 72 4e 6f 74 46 6f 75 6e  , int *prNotFoun
c890: 64 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b  d){.  Select *p;
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
c8c0: 45 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69 67  ELECT to the rig
c8d0: 68 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f  ht of IN operato
c8e0: 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65  r */.  int eType
c8f0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
c900: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c910: 54 79 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c  Type of RHS tabl
c920: 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f  e. IN_INDEX_* */
c930: 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50  .  int iTab = pP
c940: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
c950: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
c960: 6f 72 20 6f 66 20 74 68 65 20 52 48 53 20 74 61  or of the RHS ta
c970: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73  ble */.  int mus
c980: 74 42 65 55 6e 69 71 75 65 20 3d 20 28 70 72 4e  tBeUnique = (prN
c990: 6f 74 46 6f 75 6e 64 3d 3d 30 29 3b 20 20 20 2f  otFound==0);   /
c9a0: 2a 20 54 72 75 65 20 69 66 20 52 48 53 20 6d 75  * True if RHS mu
c9b0: 73 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a  st be unique */.
c9c0: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
c9d0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
c9e0: 65 29 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75  e);     /* Virtu
c9f0: 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67  al machine being
ca00: 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73   coded */..  ass
ca10: 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ert( pX->op==TK_
ca20: 49 4e 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  IN );..  /* Chec
ca30: 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65  k to see if an e
ca40: 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72  xisting table or
ca50: 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73   index can be us
ca60: 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73  ed to.  ** satis
ca70: 66 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 54  fy the query.  T
ca80: 68 69 73 20 69 73 20 70 72 65 66 65 72 61 62 6c  his is preferabl
ca90: 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20  e to generating 
caa0: 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65  a new .  ** ephe
cab0: 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a  meral table..  *
cac0: 2f 0a 20 20 70 20 3d 20 28 45 78 70 72 48 61 73  /.  p = (ExprHas
cad0: 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f  Property(pX, EP_
cae0: 78 49 73 53 65 6c 65 63 74 29 20 3f 20 70 58 2d  xIsSelect) ? pX-
caf0: 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30 29 3b  >x.pSelect : 0);
cb00: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 50  .  if( ALWAYS(pP
cb10: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 29 20 26  arse->nErr==0) &
cb20: 26 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  & isCandidateFor
cb30: 49 6e 4f 70 74 28 70 29 20 29 7b 0a 20 20 20 20  InOpt(p) ){.    
cb40: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
cb50: 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
cb60: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
cb70: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
cb80: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
cb90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cba0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
cbb0: 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f  able <table>. */
cbc0: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
cbd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cbe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
cbf0: 78 70 72 65 73 73 69 6f 6e 20 3c 63 6f 6c 75 6d  xpression <colum
cc00: 6e 3e 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 43  n> */.    i16 iC
cc10: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc30: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
cc40: 75 6d 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a  umn <column> */.
cc50: 20 20 20 20 69 31 36 20 69 44 62 3b 20 20 20 20      i16 iDb;    
cc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
cc80: 74 61 62 61 73 65 20 69 64 78 20 66 6f 72 20 70  tabase idx for p
cc90: 54 61 62 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  Tab */..    asse
cca0: 72 74 28 20 70 20 29 3b 20 20 20 20 20 20 20 20  rt( p );        
ccb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccc0: 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
ccd0: 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
cce0: 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65  t(p) */.    asse
ccf0: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30  rt( p->pEList!=0
cd00: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
cd10: 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
cd20: 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
cd30: 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65  t(p) */.    asse
cd40: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  rt( p->pEList->a
cd50: 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 20  [0].pExpr!=0 ); 
cd60: 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
cd70: 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
cd80: 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65  t(p) */.    asse
cd90: 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29  rt( p->pSrc!=0 )
cda0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cdb0: 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
cdc0: 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
cdd0: 74 28 70 29 20 2a 2f 0a 20 20 20 20 70 54 61 62  t(p) */.    pTab
cde0: 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
cdf0: 2e 70 54 61 62 3b 0a 20 20 20 20 70 45 78 70 72  .pTab;.    pExpr
ce00: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b   = p->pEList->a[
ce10: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 43  0].pExpr;.    iC
ce20: 6f 6c 20 3d 20 28 69 31 36 29 70 45 78 70 72 2d  ol = (i16)pExpr-
ce30: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 0a 20 20  >iColumn;.   .  
ce40: 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f    /* Code an OP_
ce50: 54 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  Transaction and 
ce60: 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72  OP_TableLock for
ce70: 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20   <table>. */.   
ce80: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
ce90: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
cea0: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
ceb0: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
cec0: 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
ced0: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  se, iDb);.    sq
cee0: 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
cef0: 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
cf00: 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
cf10: 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a  >zName);..    /*
cf20: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
cf30: 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72  s only called fr
cf40: 6f 6d 20 74 77 6f 20 70 6c 61 63 65 73 2e 20 49  om two places. I
cf50: 6e 20 62 6f 74 68 20 63 61 73 65 73 20 74 68 65  n both cases the
cf60: 20 76 64 62 65 0a 20 20 20 20 2a 2a 20 68 61 73   vdbe.    ** has
cf70: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
cf80: 6c 6f 63 61 74 65 64 2e 20 53 6f 20 61 73 73 75  located. So assu
cf90: 6d 65 20 73 71 6c 69 74 65 33 47 65 74 56 64 62  me sqlite3GetVdb
cfa0: 65 28 29 20 69 73 20 61 6c 77 61 79 73 0a 20 20  e() is always.  
cfb0: 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20    ** successful 
cfc0: 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  here..    */.   
cfd0: 20 61 73 73 65 72 74 28 76 29 3b 0a 20 20 20 20   assert(v);.    
cfe0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
cff0: 20 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20      int iAddr = 
d000: 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
d010: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 56  pParse);.      V
d020: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
d030: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
d040: 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
d050: 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c  iTab, iDb, pTab,
d060: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
d070: 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f       eType = IN_
d080: 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20  INDEX_ROWID;..  
d090: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
d0a0: 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72  umpHere(v, iAddr
d0b0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
d0c0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
d0f0: 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
d100: 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ..      /* The c
d110: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
d120: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f  e used by the co
d130: 6d 70 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20  mparison. If an 
d140: 69 6e 64 65 78 20 69 73 20 74 6f 0a 20 20 20 20  index is to.    
d150: 20 20 2a 2a 20 62 65 20 75 73 65 64 20 69 6e 20    ** be used in 
d160: 70 6c 61 63 65 20 6f 66 20 61 20 74 65 6d 70 2d  place of a temp-
d170: 74 61 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62  table, it must b
d180: 65 20 6f 72 64 65 72 65 64 20 61 63 63 6f 72 64  e ordered accord
d190: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ing.      ** to 
d1a0: 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  this collation s
d1b0: 65 71 75 65 6e 63 65 2e 20 20 2a 2f 0a 20 20 20  equence.  */.   
d1c0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71     CollSeq *pReq
d1d0: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
d1e0: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
d1f0: 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74  Parse, pX->pLeft
d200: 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20  , pExpr);..     
d210: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
d220: 68 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74  he affinity that
d230: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
d240: 20 70 65 72 66 6f 72 6d 20 74 68 65 20 0a 20 20   perform the .  
d250: 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
d260: 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  n is the same as
d270: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
d280: 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a   the column. If.
d290: 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6e        ** it is n
d2a0: 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ot, it is not po
d2b0: 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 61 6e  ssible to use an
d2c0: 79 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a  y index..      *
d2d0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 69  /.      int affi
d2e0: 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65  nity_ok = sqlite
d2f0: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b  3IndexAffinityOk
d300: 28 70 58 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  (pX, pTab->aCol[
d310: 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 29 3b  iCol].affinity);
d320: 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78  ..      for(pIdx
d330: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
d340: 49 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30 20  Idx && eType==0 
d350: 26 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20  && affinity_ok; 
d360: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
d370: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
d380: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  pIdx->aiColumn[0
d390: 5d 3d 3d 69 43 6f 6c 29 0a 20 20 20 20 20 20 20  ]==iCol).       
d3a0: 20 20 26 26 20 73 71 6c 69 74 65 33 46 69 6e 64    && sqlite3Find
d3b0: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28  CollSeq(db, ENC(
d3c0: 64 62 29 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  db), pIdx->azCol
d3d0: 6c 5b 30 5d 2c 20 30 29 3d 3d 70 52 65 71 0a 20  l[0], 0)==pReq. 
d3e0: 20 20 20 20 20 20 20 20 26 26 20 28 21 6d 75 73          && (!mus
d3f0: 74 42 65 55 6e 69 71 75 65 20 7c 7c 20 28 70 49  tBeUnique || (pI
d400: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26  dx->nKeyCol==1 &
d410: 26 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  & pIdx->onError!
d420: 3d 4f 45 5f 4e 6f 6e 65 29 29 0a 20 20 20 20 20  =OE_None)).     
d430: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
d440: 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69  int iAddr = sqli
d450: 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72  te3CodeOnce(pPar
d460: 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  se); VdbeCoverag
d470: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
d480: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d490: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  3(v, OP_OpenRead
d4a0: 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e  , iTab, pIdx->tn
d4b0: 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  um, iDb);.      
d4c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
d4d0: 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72  etP4KeyInfo(pPar
d4e0: 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  se, pIdx);.     
d4f0: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
d500: 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d  ((v, "%s", pIdx-
d510: 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
d520: 20 20 20 20 61 73 73 65 72 74 28 20 49 4e 5f 49      assert( IN_I
d530: 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
d540: 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  == IN_INDEX_INDE
d550: 58 5f 41 53 43 2b 31 20 29 3b 0a 20 20 20 20 20  X_ASC+1 );.     
d560: 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f       eType = IN_
d570: 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20  INDEX_INDEX_ASC 
d580: 2b 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  + pIdx->aSortOrd
d590: 65 72 5b 30 5d 3b 0a 0a 20 20 20 20 20 20 20 20  er[0];..        
d5a0: 20 20 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64    if( prNotFound
d5b0: 20 26 26 20 21 70 54 61 62 2d 3e 61 43 6f 6c 5b   && !pTab->aCol[
d5c0: 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b  iCol].notNull ){
d5d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 72  .            *pr
d5e0: 4e 6f 74 46 6f 75 6e 64 20 3d 20 2b 2b 70 50 61  NotFound = ++pPa
d5f0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
d600: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d610: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
d620: 75 6c 6c 2c 20 30 2c 20 2a 70 72 4e 6f 74 46 6f  ull, 0, *prNotFo
d630: 75 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  und);.          
d640: 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
d650: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
d660: 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20  v, iAddr);.     
d670: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
d680: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54   }.  }..  if( eT
d690: 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ype==0 ){.    /*
d6a0: 20 43 6f 75 6c 64 20 6e 6f 74 20 66 6f 75 6e 64   Could not found
d6b0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62   an existing tab
d6c0: 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 75  le or index to u
d6d0: 73 65 20 61 73 20 74 68 65 20 52 48 53 20 62 2d  se as the RHS b-
d6e0: 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20  tree..    ** We 
d6f0: 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 67 65 6e  will have to gen
d700: 65 72 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72  erate an ephemer
d710: 61 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f 20 74  al table to do t
d720: 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20  he job..    */. 
d730: 20 20 20 75 33 32 20 73 61 76 65 64 4e 51 75 65     u32 savedNQue
d740: 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d  ryLoop = pParse-
d750: 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20  >nQueryLoop;.   
d760: 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c   int rMayHaveNul
d770: 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65  l = 0;.    eType
d780: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b   = IN_INDEX_EPH;
d790: 0a 20 20 20 20 69 66 28 20 70 72 4e 6f 74 46 6f  .    if( prNotFo
d7a0: 75 6e 64 20 29 7b 0a 20 20 20 20 20 20 2a 70 72  und ){.      *pr
d7b0: 4e 6f 74 46 6f 75 6e 64 20 3d 20 72 4d 61 79 48  NotFound = rMayH
d7c0: 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72  aveNull = ++pPar
d7d0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
d7e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d7f0: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
d800: 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20   *prNotFound);. 
d810: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d820: 74 65 73 74 63 61 73 65 28 20 70 50 61 72 73 65  testcase( pParse
d830: 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3e 30 20 29  ->nQueryLoop>0 )
d840: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
d850: 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a  nQueryLoop = 0;.
d860: 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 70 4c        if( pX->pL
d870: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26  eft->iColumn<0 &
d880: 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
d890: 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pX, EP_xIsSel
d8a0: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
d8b0: 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
d8c0: 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a  _ROWID;.      }.
d8d0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
d8e0: 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
d8f0: 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48  Parse, pX, rMayH
d900: 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d  aveNull, eType==
d910: 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b  IN_INDEX_ROWID);
d920: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75  .    pParse->nQu
d930: 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e  eryLoop = savedN
d940: 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c  QueryLoop;.  }el
d950: 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62  se{.    pX->iTab
d960: 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 20  le = iTab;.  }. 
d970: 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d   return eType;.}
d980: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
d990: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
d9a0: 20 73 63 61 6c 61 72 20 73 75 62 71 75 65 72 69   scalar subqueri
d9b0: 65 73 20 75 73 65 64 20 61 73 20 61 20 73 75 62  es used as a sub
d9c0: 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  query expression
d9d0: 2c 20 45 58 49 53 54 53 2c 0a 2a 2a 20 6f 72 20  , EXISTS,.** or 
d9e0: 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 45  IN operators.  E
d9f0: 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  xamples:.**.**  
da00: 20 20 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f     (SELECT a FRO
da10: 4d 20 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d  M b)          --
da20: 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20   subquery.**    
da30: 20 45 58 49 53 54 53 20 28 53 45 4c 45 43 54 20   EXISTS (SELECT 
da40: 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45  a FROM b)   -- E
da50: 58 49 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a  XISTS subquery.*
da60: 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c  *     x IN (4,5,
da70: 31 31 29 20 20 20 20 20 20 20 20 20 20 20 20 20  11)             
da80: 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
da90: 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67  with list on rig
daa0: 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20  ht-hand side.** 
dab0: 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54      x IN (SELECT
dac0: 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d   a FROM b)     -
dad0: 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  - IN operator wi
dae0: 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74  th subquery on t
daf0: 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54  he right.**.** T
db00: 68 65 20 70 45 78 70 72 20 70 61 72 61 6d 65 74  he pExpr paramet
db10: 65 72 20 64 65 73 63 72 69 62 65 73 20 74 68 65  er describes the
db20: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
db30: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4e   contains the IN
db40: 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  .** operator or 
db50: 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  subquery..**.** 
db60: 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 52  If parameter isR
db70: 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  owid is non-zero
db80: 2c 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f  , then expressio
db90: 6e 20 70 45 78 70 72 20 69 73 20 67 75 61 72 61  n pExpr is guara
dba0: 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 6f  nteed.** to be o
dbb0: 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 72 6f 77  f the form "<row
dbc0: 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29  id> IN (?, ?, ?)
dbd0: 22 2c 20 77 68 65 72 65 20 3c 72 6f 77 69 64 3e  ", where <rowid>
dbe0: 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a   is a reference.
dbf0: 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74 65 67  ** to some integ
dc00: 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f 66  er key column of
dc10: 20 61 20 74 61 62 6c 65 20 42 2d 54 72 65 65 2e   a table B-Tree.
dc20: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 75   In this case, u
dc30: 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20  se an.** intkey 
dc40: 42 2d 54 72 65 65 20 74 6f 20 73 74 6f 72 65 20  B-Tree to store 
dc50: 74 68 65 20 73 65 74 20 6f 66 20 49 4e 28 2e 2e  the set of IN(..
dc60: 2e 29 20 76 61 6c 75 65 73 20 69 6e 73 74 65 61  .) values instea
dc70: 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a  d of the usual.*
dc80: 2a 20 28 73 6c 6f 77 65 72 29 20 76 61 72 69 61  * (slower) varia
dc90: 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 73 20  ble length keys 
dca0: 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  B-Tree..**.** If
dcb0: 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69 73   rMayHaveNull is
dcc0: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61 74 20   non-zero, that 
dcd0: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6f  means that the o
dce0: 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e 20 49  peration is an I
dcf0: 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45 4c 45  N.** (not a SELE
dd00: 43 54 20 6f 72 20 45 58 49 53 54 53 29 20 61 6e  CT or EXISTS) an
dd10: 64 20 74 68 61 74 20 74 68 65 20 52 48 53 20 6d  d that the RHS m
dd20: 69 67 68 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55  ight contains NU
dd30: 4c 4c 73 2e 0a 2a 2a 20 46 75 72 74 68 65 72 6d  LLs..** Furtherm
dd40: 6f 72 65 2c 20 74 68 65 20 49 4e 20 69 73 20 69  ore, the IN is i
dd50: 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  n a WHERE clause
dd60: 20 61 6e 64 20 74 68 61 74 20 77 65 20 72 65 61   and that we rea
dd70: 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20 74 6f 20 69  lly want.** to i
dd80: 74 65 72 61 74 65 20 6f 76 65 72 20 74 68 65 20  terate over the 
dd90: 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
dda0: 65 72 61 74 6f 72 20 69 6e 20 6f 72 64 65 72 20  erator in order 
ddb0: 74 6f 20 71 75 69 63 6b 6c 79 20 6c 6f 63 61 74  to quickly locat
ddc0: 65 0a 2a 2a 20 61 6c 6c 20 63 6f 72 72 65 73 70  e.** all corresp
ddd0: 6f 6e 64 69 6e 67 20 4c 48 53 20 65 6c 65 6d 65  onding LHS eleme
dde0: 6e 74 73 2e 20 20 41 6c 6c 20 74 68 69 73 20 72  nts.  All this r
ddf0: 6f 75 74 69 6e 65 20 64 6f 65 73 20 69 73 20 69  outine does is i
de00: 6e 69 74 69 61 6c 69 7a 65 0a 2a 2a 20 74 68 65  nitialize.** the
de10: 20 72 65 67 69 73 74 65 72 20 67 69 76 65 6e 20   register given 
de20: 62 79 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  by rMayHaveNull 
de30: 74 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e  to NULL.  Callin
de40: 67 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20  g routines will 
de50: 74 61 6b 65 0a 2a 2a 20 63 61 72 65 20 6f 66 20  take.** care of 
de60: 63 68 61 6e 67 69 6e 67 20 74 68 69 73 20 72 65  changing this re
de70: 67 69 73 74 65 72 20 76 61 6c 75 65 20 74 6f 20  gister value to 
de80: 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20  non-NULL if the 
de90: 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65  RHS is NULL-free
dea0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48  ..**.** If rMayH
deb0: 61 76 65 4e 75 6c 6c 20 69 73 20 7a 65 72 6f 2c  aveNull is zero,
dec0: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
ded0: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
dee0: 20 62 65 69 6e 67 20 75 73 65 64 0a 2a 2a 20 66   being used.** f
def0: 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  or membership te
df00: 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 54 68 65  sting only.  The
df10: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
df20: 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 0a   initialize any.
df30: 2a 2a 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  ** registers to 
df40: 69 6e 64 69 63 61 74 65 20 74 68 65 20 70 72 65  indicate the pre
df50: 73 65 6e 63 65 20 6f 72 20 61 62 73 65 6e 63 65  sence or absence
df60: 20 6f 66 20 4e 55 4c 4c 73 20 6f 6e 20 74 68 65   of NULLs on the
df70: 20 52 48 53 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20   RHS..**.** For 
df80: 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53  a SELECT or EXIS
df90: 54 53 20 6f 70 65 72 61 74 6f 72 2c 20 72 65 74  TS operator, ret
dfa0: 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
dfb0: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 0a   that holds the.
dfc0: 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20  ** result.  For 
dfd0: 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20  IN operators or 
dfe0: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
dff0: 72 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76  rs, the return v
e000: 61 6c 75 65 20 69 73 20 30 2e 0a 2a 2f 0a 23 69  alue is 0..*/.#i
e010: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e020: 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73  T_SUBQUERY.int s
e030: 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
e040: 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
e050: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
e060: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
e070: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
e080: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  pr,            /
e090: 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c 45 43 54  * The IN, SELECT
e0a0: 2c 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72  , or EXISTS oper
e0b0: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 4d  ator */.  int rM
e0c0: 61 79 48 61 76 65 4e 75 6c 6c 2c 20 20 20 20 20  ayHaveNull,     
e0d0: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
e0e0: 61 74 20 72 65 63 6f 72 64 73 20 77 68 65 74 68  at records wheth
e0f0: 65 72 20 4e 55 4c 4c 73 20 65 78 69 73 74 20 69  er NULLs exist i
e100: 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69  n RHS */.  int i
e110: 73 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20  sRowid          
e120: 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 4c     /* If true, L
e130: 48 53 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f  HS of IN operato
e140: 72 20 69 73 20 61 20 72 6f 77 69 64 20 2a 2f 0a  r is a rowid */.
e150: 29 7b 0a 20 20 69 6e 74 20 74 65 73 74 41 64 64  ){.  int testAdd
e160: 72 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  r = -1;         
e170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e180: 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64  One-time test ad
e190: 64 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72  dress */.  int r
e1a0: 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Reg = 0;        
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1c0: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73     /* Register s
e1d0: 74 6f 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67  toring resulting
e1e0: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
e1f0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
e200: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 4e 45  Parse);.  if( NE
e210: 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75  VER(v==0) ) retu
e220: 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45  rn 0;.  sqlite3E
e230: 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
e240: 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  rse);..  /* This
e250: 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20 72 75   code must be ru
e260: 6e 20 69 6e 20 69 74 73 20 65 6e 74 69 72 65 74  n in its entiret
e270: 79 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 20  y every time it 
e280: 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20  is encountered. 
e290: 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20 74 68   ** if any of th
e2a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74  e following is t
e2b0: 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  rue:.  **.  **  
e2c0: 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
e2d0: 61 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f  and side is a co
e2e0: 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
e2f0: 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  y.  **    *  The
e300: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
e310: 20 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f   is an expressio
e320: 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  n list containin
e330: 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a  g variables.  **
e340: 20 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e      *  We are in
e350: 73 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20  side a trigger. 
e360: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20   **.  ** If all 
e370: 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65  of the above are
e380: 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20   false, then we 
e390: 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64  can run this cod
e3a0: 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a  e just once.  **
e3b0: 20 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74   save the result
e3c0: 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65  s, and reuse the
e3d0: 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20   same result on 
e3e0: 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63  subsequent invoc
e3f0: 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ations..  */.  i
e400: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
e410: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61  rty(pExpr, EP_Va
e420: 72 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  rSelect) ){.    
e430: 74 65 73 74 41 64 64 72 20 3d 20 73 71 6c 69 74  testAddr = sqlit
e440: 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73  e3CodeOnce(pPars
e450: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
e460: 28 76 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  (v);.  }..#ifnde
e470: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
e480: 50 4c 41 49 4e 0a 20 20 69 66 28 20 70 50 61 72  PLAIN.  if( pPar
e490: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
e4a0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67  {.    char *zMsg
e4b0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
e4c0: 66 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  f(.        pPars
e4d0: 65 2d 3e 64 62 2c 20 22 45 58 45 43 55 54 45 20  e->db, "EXECUTE 
e4e0: 25 73 25 73 20 53 55 42 51 55 45 52 59 20 25 64  %s%s SUBQUERY %d
e4f0: 22 2c 20 74 65 73 74 41 64 64 72 3e 3d 30 3f 22  ", testAddr>=0?"
e500: 22 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22 2c  ":"CORRELATED ",
e510: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
e520: 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49 53 54 22  op==TK_IN?"LIST"
e530: 3a 22 53 43 41 4c 41 52 22 2c 20 70 50 61 72 73  :"SCALAR", pPars
e540: 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
e550: 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
e560: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
e570: 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61   OP_Explain, pPa
e580: 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
e590: 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  0, 0, zMsg, P4_D
e5a0: 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e  YNAMIC);.  }.#en
e5b0: 64 69 66 0a 0a 20 20 73 77 69 74 63 68 28 20 70  dif..  switch( p
e5c0: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
e5d0: 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
e5e0: 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74      char affinit
e5f0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
e600: 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f 66 20 74  /* Affinity of t
e610: 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
e620: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
e630: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
e640: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
e650: 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d   of OP_OpenEphem
e660: 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
e670: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
e680: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
e690: 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c 48 53  Left; /* the LHS
e6a0: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
e6b0: 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 4b 65 79  tor */.      Key
e6c0: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
e6d0: 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65 79 20   0;      /* Key 
e6e0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a  information */..
e6f0: 20 20 20 20 20 20 69 66 28 20 72 4d 61 79 48 61        if( rMayHa
e700: 76 65 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  veNull ){.      
e710: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e720: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
e730: 30 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 29  0, rMayHaveNull)
e740: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
e750: 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69   affinity = sqli
e760: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
e770: 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f  pLeft);..      /
e780: 2a 20 57 68 65 74 68 65 72 20 74 68 69 73 20 69  * Whether this i
e790: 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43  s an 'x IN(SELEC
e7a0: 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20  T...)' or an 'x 
e7b0: 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a  IN(<exprlist>)'.
e7c0: 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
e7d0: 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65  ion it is handle
e7e0: 64 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20  d the same way. 
e7f0: 20 41 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   An ephemeral ta
e800: 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a  ble is .      **
e810: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 73 69 6e   filled with sin
e820: 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65 78 20  gle-field index 
e830: 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e  keys representin
e840: 67 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  g the results.  
e850: 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
e860: 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65  SELECT or the <e
e870: 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20  xprlist>..      
e880: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
e890: 68 65 20 27 78 27 20 65 78 70 72 65 73 73 69 6f  he 'x' expressio
e8a0: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  n is a column va
e8b0: 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45  lue, or the SELE
e8c0: 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73  CT....      ** s
e8d0: 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73  tatement returns
e8e0: 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c   a column value,
e8f0: 20 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69   then the affini
e900: 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20  ty of that.     
e910: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73   ** column is us
e920: 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20  ed to build the 
e930: 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62  index keys. If b
e940: 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a  oth 'x' and the.
e950: 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e        ** SELECT.
e960: 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65  .. statement are
e970: 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e   columns, then n
e980: 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 20  umeric affinity 
e990: 69 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a  is used.      **
e9a0: 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d   if either colum
e9b0: 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72  n has NUMERIC or
e9c0: 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74   INTEGER affinit
e9d0: 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20  y. If neither.  
e9e0: 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74      ** 'x' nor t
e9f0: 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61  he SELECT... sta
ea00: 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d  tement are colum
ea10: 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63  ns, then numeric
ea20: 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20   affinity.      
ea30: 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20  ** is used..    
ea40: 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72    */.      pExpr
ea50: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73  ->iTable = pPars
ea60: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
ea70: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
ea80: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
ea90: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
eaa0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 21 69  Expr->iTable, !i
eab0: 73 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 70  sRowid);.      p
eac0: 4b 65 79 49 6e 66 6f 20 3d 20 69 73 52 6f 77 69  KeyInfo = isRowi
ead0: 64 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 4b  d ? 0 : sqlite3K
eae0: 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72  eyInfoAlloc(pPar
eaf0: 73 65 2d 3e 64 62 2c 20 31 2c 20 31 29 3b 0a 0a  se->db, 1, 1);..
eb00: 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
eb10: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
eb20: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
eb30: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
eb40: 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 1:     expr IN
eb50: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20   (SELECT ...).  
eb60: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
eb70: 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   ** Generate cod
eb80: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72  e to write the r
eb90: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
eba0: 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65  lect into the te
ebb0: 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20  mporary.        
ebc0: 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74  ** table allocat
ebd0: 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62  ed and opened ab
ebe0: 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ove..        */.
ebf0: 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65          SelectDe
ec00: 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20  st dest;.       
ec10: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
ec20: 74 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65  t;..        asse
ec30: 72 74 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a  rt( !isRowid );.
ec40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
ec50: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
ec60: 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45  est, SRT_Set, pE
ec70: 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
ec80: 20 20 20 20 20 20 64 65 73 74 2e 61 66 66 53 64        dest.affSd
ec90: 73 74 20 3d 20 28 75 38 29 61 66 66 69 6e 69 74  st = (u8)affinit
eca0: 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  y;.        asser
ecb0: 74 28 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c  t( (pExpr->iTabl
ecc0: 65 26 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70  e&0x0000FFFF)==p
ecd0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a  Expr->iTable );.
ece0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78          pExpr->x
ecf0: 2e 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74  .pSelect->iLimit
ed00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 74 65   = 0;.        te
ed10: 73 74 63 61 73 65 28 20 70 4b 65 79 49 6e 66 6f  stcase( pKeyInfo
ed20: 3d 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73 65 64  ==0 ); /* Caused
ed30: 20 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74   by OOM in sqlit
ed40: 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29  e3KeyInfoAlloc()
ed50: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
ed60: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
ed70: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70  arse, pExpr->x.p
ed80: 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20 29  Select, &dest) )
ed90: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
eda0: 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
edb0: 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20  pKeyInfo);.     
edc0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
edd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ede0: 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   pEList = pExpr-
edf0: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
ee00: 73 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  st;.        asse
ee10: 72 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20  rt( pKeyInfo!=0 
ee20: 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63  ); /* OOM will c
ee30: 61 75 73 65 20 65 78 69 74 20 61 66 74 65 72 20  ause exit after 
ee40: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20  sqlite3Select() 
ee50: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
ee60: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
ee70: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ee80: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20  pEList->nExpr>0 
ee90: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
eea0: 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
eeb0: 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65  oIsWriteable(pKe
eec0: 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20  yInfo) );.      
eed0: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c    pKeyInfo->aCol
eee0: 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 42 69  l[0] = sqlite3Bi
eef0: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
ef00: 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
ef10: 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20  ->pLeft,.       
ef20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef50: 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70    pEList->a[0].p
ef60: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Expr);.      }el
ef70: 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45  se if( ALWAYS(pE
ef80: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29  xpr->x.pList!=0)
ef90: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
efa0: 61 73 65 20 32 3a 20 20 20 20 20 65 78 70 72 20  ase 2:     expr 
efb0: 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20  IN (exprlist).  
efc0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
efd0: 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70   ** For each exp
efe0: 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61  ression, build a
eff0: 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d  n index key from
f000: 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   the evaluation 
f010: 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  and.        ** s
f020: 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74  tore it in the t
f030: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
f040: 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63  If <expr> is a c
f050: 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a  olumn, then use.
f060: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
f070: 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79  columns affinity
f080: 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69   when building i
f090: 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65  ndex keys. If <e
f0a0: 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20  xpr> is not.    
f0b0: 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c      ** a column,
f0c0: 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66   use numeric aff
f0d0: 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a  inity..        *
f0e0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  /.        int i;
f0f0: 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
f100: 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
f110: 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
f120: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
f130: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
f140: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20          int r1, 
f150: 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20 20 20  r2, r3;..       
f160: 20 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29   if( !affinity )
f170: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 69  {.          affi
f180: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
f190: 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
f1a0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b  }.        if( pK
f1b0: 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
f1c0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
f1d0: 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
f1e0: 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20  eable(pKeyInfo) 
f1f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65  );.          pKe
f200: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20  yInfo->aColl[0] 
f210: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
f220: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
f230: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
f240: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
f250: 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65  * Loop through e
f260: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ach expression i
f270: 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f  n <exprlist>. */
f280: 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
f290: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
f2a0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
f2b0: 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
f2c0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
f2d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f2e0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f2f0: 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a 20  _Null, 0, r2);. 
f300: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69         for(i=pLi
f310: 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d  st->nExpr, pItem
f320: 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20  =pList->a; i>0; 
f330: 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i--, pItem++){. 
f340: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
f350: 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70  E2 = pItem->pExp
f360: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  r;.          int
f370: 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20   iValToIns;..   
f380: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
f390: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
f3a0: 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e  ot constant then
f3b0: 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   we will need to
f3c0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69  .          ** di
f3d0: 73 61 62 6c 65 20 74 68 65 20 74 65 73 74 20 74  sable the test t
f3e0: 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74 65  hat was generate
f3f0: 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b  d above that mak
f400: 65 73 20 73 75 72 65 0a 20 20 20 20 20 20 20 20  es sure.        
f410: 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f    ** this code o
f420: 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63  nly executes onc
f430: 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72 20  e.  Because for 
f440: 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20  a non-constant. 
f450: 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72           ** expr
f460: 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74  ession we need t
f470: 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64  o rerun this cod
f480: 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20  e each time..   
f490: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
f4a0: 20 20 20 20 69 66 28 20 74 65 73 74 41 64 64 72      if( testAddr
f4b0: 3e 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45  >=0 && !sqlite3E
f4c0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
f4d0: 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  2) ){.          
f4e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
f4f0: 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73  ngeToNoop(v, tes
f500: 74 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20  tAddr);.        
f510: 20 20 20 20 74 65 73 74 41 64 64 72 20 3d 20 2d      testAddr = -
f520: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  1;.          }..
f530: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61            /* Eva
f540: 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73  luate the expres
f550: 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20  sion and insert 
f560: 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70  it into the temp
f570: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
f580: 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20      if( isRowid 
f590: 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
f5a0: 49 6e 74 65 67 65 72 28 70 45 32 2c 20 26 69 56  Integer(pE2, &iV
f5b0: 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20  alToIns) ){.    
f5c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f5d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
f5e0: 49 6e 73 65 72 74 49 6e 74 2c 20 70 45 78 70 72  InsertInt, pExpr
f5f0: 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 69 56  ->iTable, r2, iV
f600: 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20  alToIns);.      
f610: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f620: 20 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69         r3 = sqli
f630: 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
f640: 74 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72  t(pParse, pE2, r
f650: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
f660: 69 66 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20  if( isRowid ){. 
f670: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
f680: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f690: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
f6a0: 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r3,.            
f6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
f6d0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29  urrentAddr(v)+2)
f6e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
f6f0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
f700: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
f710: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
f720: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
f730: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32  Expr->iTable, r2
f740: 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20  , r3);.         
f750: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f760: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f770: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
f780: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20  MakeRecord, r3, 
f790: 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79  1, r2, &affinity
f7a0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
f7b0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
f7c0: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
f7d0: 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31  ge(pParse, r3, 1
f7e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
f7f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f800: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
f810: 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt, pExpr->iTabl
f820: 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  e, r2);.        
f830: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
f840: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
f850: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
f860: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
f870: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
f880: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
f890: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
f8a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f8b0: 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
f8c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f8d0: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
f8e0: 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65  ddr, (void *)pKe
f8f0: 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
f900: 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  O);.      }.    
f910: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
f920: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
f930: 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  TS:.    case TK_
f940: 53 45 4c 45 43 54 3a 0a 20 20 20 20 64 65 66 61  SELECT:.    defa
f950: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ult: {.      /* 
f960: 49 66 20 74 68 69 73 20 68 61 73 20 74 6f 20 62  If this has to b
f970: 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45 43  e a scalar SELEC
f980: 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64  T.  Generate cod
f990: 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20 20  e to put the.   
f9a0: 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74     ** value of t
f9b0: 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61 20  his select in a 
f9c0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
f9d0: 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65  record the numbe
f9e0: 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  r.      ** of th
f9f0: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e  e memory cell in
fa00: 20 69 43 6f 6c 75 6d 6e 2e 20 20 49 66 20 74 68   iColumn.  If th
fa10: 69 73 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c  is is an EXISTS,
fa20: 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
fa30: 61 6e 20 69 6e 74 65 67 65 72 20 30 20 28 6e 6f  an integer 0 (no
fa40: 74 20 65 78 69 73 74 73 29 20 6f 72 20 31 20 28  t exists) or 1 (
fa50: 65 78 69 73 74 73 29 20 69 6e 74 6f 20 61 20 6d  exists) into a m
fa60: 65 6d 6f 72 79 20 63 65 6c 6c 0a 20 20 20 20 20  emory cell.     
fa70: 20 2a 2a 20 61 6e 64 20 72 65 63 6f 72 64 20 74   ** and record t
fa80: 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  hat memory cell 
fa90: 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20  in iColumn..    
faa0: 20 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63    */.      Selec
fab0: 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20 20 20  t *pSel;        
fac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fad0: 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
fae0: 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a  ment to encode *
faf0: 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65  /.      SelectDe
fb00: 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 20 20  st dest;        
fb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fb20: 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69 74   How to deal wit
fb30: 68 20 53 45 4c 45 43 74 20 72 65 73 75 6c 74 20  h SELECt result 
fb40: 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61  */..      testca
fb50: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
fb60: 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20  K_EXISTS );.    
fb70: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
fb80: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
fb90: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
fba0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
fbb0: 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d  EXISTS || pExpr-
fbc0: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
fbd0: 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
fbe0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
fbf0: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
fc00: 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 70  lect) );.      p
fc10: 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  Sel = pExpr->x.p
fc20: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 73 71  Select;.      sq
fc30: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
fc40: 6e 69 74 28 26 64 65 73 74 2c 20 30 2c 20 2b 2b  nit(&dest, 0, ++
fc50: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20  pParse->nMem);. 
fc60: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
fc70: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
fc80: 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44  .        dest.eD
fc90: 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20  est = SRT_Mem;. 
fca0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
fcb0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
fcc0: 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53 44  ull, 0, dest.iSD
fcd0: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56  Parm);.        V
fce0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
fcf0: 49 6e 69 74 20 73 75 62 71 75 65 72 79 20 72 65  Init subquery re
fd00: 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d  sult"));.      }
fd10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 65  else{.        de
fd20: 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45  st.eDest = SRT_E
fd30: 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73  xists;.        s
fd40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
fd50: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
fd60: 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29  0, dest.iSDParm)
fd70: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
fd80: 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20  mment((v, "Init 
fd90: 45 58 49 53 54 53 20 72 65 73 75 6c 74 22 29 29  EXISTS result"))
fda0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
fdb0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
fdc0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  e(pParse->db, pS
fdd0: 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20  el->pLimit);.   
fde0: 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20     pSel->pLimit 
fdf0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
fe00: 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45  Parse, TK_INTEGE
fe10: 52 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  R, 0, 0,.       
fe20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe30: 20 20 20 20 20 20 20 20 20 20 20 26 73 71 6c 69             &sqli
fe40: 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 29  te3IntTokens[1])
fe50: 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c  ;.      pSel->iL
fe60: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
fe70: 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
fe80: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20  t(pParse, pSel, 
fe90: 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  &dest) ){.      
fea0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
feb0: 20 20 7d 0a 20 20 20 20 20 20 72 52 65 67 20 3d    }.      rReg =
fec0: 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20   dest.iSDParm;. 
fed0: 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50       ExprSetVVAP
fee0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
fef0: 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
ff00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ff10: 20 20 7d 0a 0a 20 20 69 66 28 20 74 65 73 74 41    }..  if( testA
ff20: 64 64 72 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  ddr>=0 ){.    sq
ff30: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
ff40: 65 28 76 2c 20 74 65 73 74 41 64 64 72 29 3b 0a  e(v, testAddr);.
ff50: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
ff60: 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
ff70: 2c 20 31 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  , 1);..  return 
ff80: 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rReg;.}.#endif /
ff90: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
ffa0: 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64  BQUERY */..#ifnd
ffb0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
ffc0: 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65  UBQUERY./*.** Ge
ffd0: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
ffe0: 61 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e  an IN expression
fff0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49  ..**.**      x I
10000 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a  N (SELECT ...).*
10010 2a 20 20 20 20 20 20 78 20 49 4e 20 28 76 61 6c  *      x IN (val
10020 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a  ue, value, ...).
10030 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68  **.** The left-h
10040 61 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20 69  and side (LHS) i
10050 73 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65  s a scalar expre
10060 73 73 69 6f 6e 2e 20 20 54 68 65 20 72 69 67 68  ssion.  The righ
10070 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48 53  t-hand side (RHS
10080 29 0a 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79  ).** is an array
10090 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65   of zero or more
100a0 20 76 61 6c 75 65 73 2e 20 20 54 68 65 20 65 78   values.  The ex
100b0 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
100c0 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 0a 2a   if the LHS is.*
100d0 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  * contained with
100e0 69 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68 65  in the RHS.  The
100f0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 65 78   value of the ex
10100 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 6b 6e  pression is unkn
10110 6f 77 6e 20 28 4e 55 4c 4c 29 0a 2a 2a 20 69 66  own (NULL).** if
10120 20 74 68 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c   the LHS is NULL
10130 20 6f 72 20 69 66 20 74 68 65 20 4c 48 53 20 69   or if the LHS i
10140 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  s not contained 
10150 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 20 61  within the RHS a
10160 6e 64 20 74 68 65 0a 2a 2a 20 52 48 53 20 63 6f  nd the.** RHS co
10170 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
10180 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a  re NULL values..
10190 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
101a0 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
101b0 65 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 64  e will jump to d
101c0 65 73 74 49 66 46 61 6c 73 65 20 69 66 20 74 68  estIfFalse if th
101d0 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a  e LHS is not .**
101e0 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
101f0 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20 64  n the RHS.  If d
10200 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63  ue to NULLs we c
10210 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20  annot determine 
10220 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73  if the LHS.** is
10230 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
10240 65 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70 20  e RHS then jump 
10250 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20  to destIfNull.  
10260 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f  If the LHS is co
10270 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69  ntained.** withi
10280 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 66  n the RHS then f
10290 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a  all through..*/.
102a0 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
102b0 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20  te3ExprCodeIN(. 
102c0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
102d0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
102e0 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
102f0 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
10300 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
10310 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10320 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  IN expression */
10330 0a 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c  .  int destIfFal
10340 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  se,      /* Jump
10350 20 68 65 72 65 20 69 66 20 4c 48 53 20 69 73 20   here if LHS is 
10360 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
10370 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e   the RHS */.  in
10380 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20  t destIfNull    
10390 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
103a0 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   if the results 
103b0 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20  are unknown due 
103c0 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20  to NULLs */.){. 
103d0 20 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c   int rRhsHasNull
103e0 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74   = 0;  /* Regist
103f0 65 72 20 74 68 61 74 20 69 73 20 74 72 75 65 20  er that is true 
10400 69 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20  if RHS contains 
10410 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20  NULL values */. 
10420 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20   char affinity; 
10430 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72         /* Compar
10440 69 73 6f 6e 20 61 66 66 69 6e 69 74 79 20 74 6f  ison affinity to
10450 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 65 54   use */.  int eT
10460 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ype;            
10470 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20 52  /* Type of the R
10480 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72 31 3b 20  HS */.  int r1; 
10490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
104a0 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72   Temporary use r
104b0 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 56 64 62  egister */.  Vdb
104c0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
104d0 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
104e0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
104f0 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70  on */..  /* Comp
10500 75 74 65 20 74 68 65 20 52 48 53 2e 20 20 20 41  ute the RHS.   A
10510 66 74 65 72 20 74 68 69 73 20 73 74 65 70 2c 20  fter this step, 
10520 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 63  the table with c
10530 75 72 73 6f 72 0a 20 20 2a 2a 20 70 45 78 70 72  ursor.  ** pExpr
10540 2d 3e 69 54 61 62 6c 65 20 77 69 6c 6c 20 63 6f  ->iTable will co
10550 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  ntains the value
10560 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  s that make up t
10570 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 76  he RHS..  */.  v
10580 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
10590 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
105a0 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d   );       /* OOM
105b0 20 64 65 74 65 63 74 65 64 20 70 72 69 6f 72 20   detected prior 
105c0 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
105d0 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
105e0 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20  ment((v, "begin 
105f0 49 4e 20 65 78 70 72 22 29 29 3b 0a 20 20 65 54  IN expr"));.  eT
10600 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ype = sqlite3Fin
10610 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c  dInIndex(pParse,
10620 20 70 45 78 70 72 2c 20 26 72 52 68 73 48 61 73   pExpr, &rRhsHas
10630 4e 75 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 46 69 67  Null);..  /* Fig
10640 75 72 65 20 6f 75 74 20 74 68 65 20 61 66 66 69  ure out the affi
10650 6e 69 74 79 20 74 6f 20 75 73 65 20 74 6f 20 63  nity to use to c
10660 72 65 61 74 65 20 61 20 6b 65 79 20 66 72 6f 6d  reate a key from
10670 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a   the results.  *
10680 2a 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  * of the express
10690 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72  ion. affinityStr
106a0 20 73 74 6f 72 65 73 20 61 20 73 74 61 74 69 63   stores a static
106b0 20 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65   string suitable
106c0 20 66 6f 72 0a 20 20 2a 2a 20 50 34 20 6f 66 20   for.  ** P4 of 
106d0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20  OP_MakeRecord.. 
106e0 20 2a 2f 0a 20 20 61 66 66 69 6e 69 74 79 20 3d   */.  affinity =
106f0 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e   comparisonAffin
10700 69 74 79 28 70 45 78 70 72 29 3b 0a 0a 20 20 2f  ity(pExpr);..  /
10710 2a 20 43 6f 64 65 20 74 68 65 20 4c 48 53 2c 20  * Code the LHS, 
10720 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20  the <expr> from 
10730 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29  "<expr> IN (...)
10740 22 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  "..  */.  sqlite
10750 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
10760 50 61 72 73 65 29 3b 0a 20 20 72 31 20 3d 20 73  Parse);.  r1 = s
10770 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
10780 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
10790 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
107a0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
107b0 2c 20 72 31 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  , r1);..  /* If 
107c0 74 68 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c 2c  the LHS is NULL,
107d0 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
107e0 20 69 73 20 65 69 74 68 65 72 20 66 61 6c 73 65   is either false
107f0 20 6f 72 20 4e 55 4c 4c 20 64 65 70 65 6e 64 69   or NULL dependi
10800 6e 67 0a 20 20 2a 2a 20 6f 6e 20 77 68 65 74 68  ng.  ** on wheth
10810 65 72 20 74 68 65 20 52 48 53 20 69 73 20 65 6d  er the RHS is em
10820 70 74 79 20 6f 72 20 6e 6f 74 2c 20 72 65 73 70  pty or not, resp
10830 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ectively..  */. 
10840 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d   if( destIfNull=
10850 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a  =destIfFalse ){.
10860 20 20 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20      /* Shortcut 
10870 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
10880 61 73 65 20 77 68 65 72 65 20 74 68 65 20 66 61  ase where the fa
10890 6c 73 65 20 61 6e 64 20 4e 55 4c 4c 20 6f 75 74  lse and NULL out
108a0 63 6f 6d 65 73 20 61 72 65 0a 20 20 20 20 2a 2a  comes are.    **
108b0 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a 20 20   the same. */.  
108c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
108d0 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
108e0 2c 20 72 31 2c 20 64 65 73 74 49 66 4e 75 6c 6c  , r1, destIfNull
108f0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
10900 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  v);.  }else{.   
10910 20 69 6e 74 20 61 64 64 72 31 20 3d 20 73 71 6c   int addr1 = sql
10920 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
10930 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 31  , OP_NotNull, r1
10940 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
10950 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
10960 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10970 52 65 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69  Rewind, pExpr->i
10980 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c  Table, destIfFal
10990 73 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  se);.    VdbeCov
109a0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
109b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
109c0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64  v, OP_Goto, 0, d
109d0 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
109e0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
109f0 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
10a00 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d   }..  if( eType=
10a10 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20  =IN_INDEX_ROWID 
10a20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  ){.    /* In thi
10a30 73 20 63 61 73 65 2c 20 74 68 65 20 52 48 53 20  s case, the RHS 
10a40 69 73 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20  is the ROWID of 
10a50 74 61 62 6c 65 20 62 2d 74 72 65 65 0a 20 20 20  table b-tree.   
10a60 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
10a70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10a80 4d 75 73 74 42 65 49 6e 74 2c 20 72 31 2c 20 64  MustBeInt, r1, d
10a90 65 73 74 49 66 46 61 6c 73 65 29 3b 20 56 64 62  estIfFalse); Vdb
10aa0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
10ab0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10ac0 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69  Op3(v, OP_NotExi
10ad0 73 74 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  sts, pExpr->iTab
10ae0 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  le, destIfFalse,
10af0 20 72 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f   r1);.    VdbeCo
10b00 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 65 6c  verage(v);.  }el
10b10 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68  se{.    /* In th
10b20 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48 53  is case, the RHS
10b30 20 69 73 20 61 6e 20 69 6e 64 65 78 20 62 2d 74   is an index b-t
10b40 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ree..    */.    
10b50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10b60 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79  4(v, OP_Affinity
10b70 2c 20 72 31 2c 20 31 2c 20 30 2c 20 26 61 66 66  , r1, 1, 0, &aff
10b80 69 6e 69 74 79 2c 20 31 29 3b 0a 0a 20 20 20 20  inity, 1);..    
10b90 2f 2a 20 49 66 20 74 68 65 20 73 65 74 20 6d 65  /* If the set me
10ba0 6d 62 65 72 73 68 69 70 20 74 65 73 74 20 66 61  mbership test fa
10bb0 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ils, then the re
10bc0 73 75 6c 74 20 6f 66 20 74 68 65 20 0a 20 20 20  sult of the .   
10bd0 20 2a 2a 20 22 78 20 49 4e 20 28 2e 2e 2e 29 22   ** "x IN (...)"
10be0 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74   expression must
10bf0 20 62 65 20 65 69 74 68 65 72 20 30 20 6f 72 20   be either 0 or 
10c00 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 73 65 74  NULL. If the set
10c10 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73  .    ** contains
10c20 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c   no NULL values,
10c30 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
10c40 20 69 73 20 30 2e 20 49 66 20 74 68 65 20 73 65   is 0. If the se
10c50 74 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69  t .    ** contai
10c60 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e  ns one or more N
10c70 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e  ULL values, then
10c80 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
10c90 68 65 0a 20 20 20 20 2a 2a 20 65 78 70 72 65 73  he.    ** expres
10ca0 73 69 6f 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c  sion is also NUL
10cb0 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  L..    */.    if
10cc0 28 20 72 52 68 73 48 61 73 4e 75 6c 6c 3d 3d 30  ( rRhsHasNull==0
10cd0 20 7c 7c 20 64 65 73 74 49 66 46 61 6c 73 65 3d   || destIfFalse=
10ce0 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 7b 0a 20  =destIfNull ){. 
10cf0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
10d00 6e 63 68 20 72 75 6e 73 20 69 66 20 69 74 20 69  nch runs if it i
10d10 73 20 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d 70 69  s known at compi
10d20 6c 65 20 74 69 6d 65 20 74 68 61 74 20 74 68 65  le time that the
10d30 20 52 48 53 0a 20 20 20 20 20 20 2a 2a 20 63 61   RHS.      ** ca
10d40 6e 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4e 55 4c  nnot contain NUL
10d50 4c 20 76 61 6c 75 65 73 2e 20 54 68 69 73 20 68  L values. This h
10d60 61 70 70 65 6e 73 20 61 73 20 74 68 65 20 72 65  appens as the re
10d70 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 6f 66  sult.      ** of
10d80 20 61 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f   a "NOT NULL" co
10d90 6e 73 74 72 61 69 6e 74 20 69 6e 20 74 68 65 20  nstraint in the 
10da0 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
10db0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
10dc0 2a 2a 20 41 6c 73 6f 20 72 75 6e 20 74 68 69 73  ** Also run this
10dd0 20 62 72 61 6e 63 68 20 69 66 20 4e 55 4c 4c 20   branch if NULL 
10de0 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
10df0 20 46 41 4c 53 45 0a 20 20 20 20 20 20 2a 2a 20   FALSE.      ** 
10e00 66 6f 72 20 74 68 69 73 20 70 61 72 74 69 63 75  for this particu
10e10 6c 61 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e  lar IN operator.
10e20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10e30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10e40 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f  4Int(v, OP_NotFo
10e50 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
10e60 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  le, destIfFalse,
10e70 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 56   r1, 1);.      V
10e80 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
10e90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10ea0 20 2f 2a 20 49 6e 20 74 68 69 73 20 62 72 61 6e   /* In this bran
10eb0 63 68 2c 20 74 68 65 20 52 48 53 20 6f 66 20 74  ch, the RHS of t
10ec0 68 65 20 49 4e 20 6d 69 67 68 74 20 63 6f 6e 74  he IN might cont
10ed0 61 69 6e 20 61 20 4e 55 4c 4c 20 61 6e 64 0a 20  ain a NULL and. 
10ee0 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65 73       ** the pres
10ef0 65 6e 63 65 20 6f 66 20 61 20 4e 55 4c 4c 20 6f  ence of a NULL o
10f00 6e 20 74 68 65 20 52 48 53 20 6d 61 6b 65 73 20  n the RHS makes 
10f10 61 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20  a difference in 
10f20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 75 74  the.      ** out
10f30 63 6f 6d 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  come..      */. 
10f40 20 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b       int j1, j2;
10f50 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74  ..      /* First
10f60 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
10f70 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74   the LHS is cont
10f80 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53  ained in the RHS
10f90 2e 20 20 49 66 20 73 6f 2c 0a 20 20 20 20 20 20  .  If so,.      
10fa0 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 72 65 73  ** then the pres
10fb0 65 6e 63 65 20 6f 66 20 4e 55 4c 4c 73 20 69 6e  ence of NULLs in
10fc0 20 74 68 65 20 52 48 53 20 64 6f 65 73 20 6e 6f   the RHS does no
10fd0 74 20 6d 61 74 74 65 72 2c 20 73 6f 20 6a 75 6d  t matter, so jum
10fe0 70 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20  p.      ** over 
10ff0 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20  all of the code 
11000 74 68 61 74 20 66 6f 6c 6c 6f 77 73 2e 0a 20 20  that follows..  
11010 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6a 31 20      */.      j1 
11020 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
11030 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
11040 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
11050 65 2c 20 30 2c 20 72 31 2c 20 31 29 3b 0a 20 20  e, 0, r1, 1);.  
11060 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
11070 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 48  (v);..      /* H
11080 65 72 65 20 77 65 20 62 65 67 69 6e 20 67 65 6e  ere we begin gen
11090 65 72 61 74 69 6e 67 20 63 6f 64 65 20 74 68 61  erating code tha
110a0 74 20 72 75 6e 73 20 69 66 20 74 68 65 20 4c 48  t runs if the LH
110b0 53 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a  S is not.      *
110c0 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  * contained with
110d0 69 6e 20 74 68 65 20 52 48 53 2e 20 20 47 65 6e  in the RHS.  Gen
110e0 65 72 61 74 65 20 61 64 64 69 74 69 6f 6e 61 6c  erate additional
110f0 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20 20   code that.     
11100 20 2a 2a 20 74 65 73 74 73 20 74 68 65 20 52 48   ** tests the RH
11110 53 20 66 6f 72 20 4e 55 4c 4c 73 2e 20 20 49 66  S for NULLs.  If
11120 20 74 68 65 20 52 48 53 20 63 6f 6e 74 61 69 6e   the RHS contain
11130 73 20 61 20 4e 55 4c 4c 20 74 68 65 6e 0a 20 20  s a NULL then.  
11140 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20 64      ** jump to d
11150 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74  estIfNull.  If t
11160 68 65 72 65 20 61 72 65 20 6e 6f 20 4e 55 4c 4c  here are no NULL
11170 73 20 69 6e 20 74 68 65 20 52 48 53 20 74 68 65  s in the RHS the
11180 6e 0a 20 20 20 20 20 20 2a 2a 20 6a 75 6d 70 20  n.      ** jump 
11190 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65 2e 0a  to destIfFalse..
111a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
111b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
111c0 28 76 2c 20 4f 50 5f 49 66 2c 20 72 52 68 73 48  (v, OP_If, rRhsH
111d0 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75  asNull, destIfNu
111e0 6c 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ll); VdbeCoverag
111f0 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
11200 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11210 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 52 68 73 48   OP_IfNot, rRhsH
11220 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 46 61  asNull, destIfFa
11230 6c 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  lse); VdbeCovera
11240 67 65 28 76 29 3b 0a 20 20 20 20 20 20 6a 32 20  ge(v);.      j2 
11250 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
11260 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
11270 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
11280 65 2c 20 30 2c 20 72 52 68 73 48 61 73 4e 75 6c  e, 0, rRhsHasNul
11290 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 56 64 62  l, 1);.      Vdb
112a0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
112b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
112c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
112d0 67 65 72 2c 20 30 2c 20 72 52 68 73 48 61 73 4e  ger, 0, rRhsHasN
112e0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
112f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11300 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73   OP_Goto, 0, des
11310 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  tIfFalse);.     
11320 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
11330 48 65 72 65 28 76 2c 20 6a 32 29 3b 0a 20 20 20  Here(v, j2);.   
11340 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11350 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
11360 65 72 2c 20 31 2c 20 72 52 68 73 48 61 73 4e 75  er, 1, rRhsHasNu
11370 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
11380 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11390 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74  OP_Goto, 0, dest
113a0 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20  IfNull);..      
113b0 2f 2a 20 54 68 65 20 4f 50 5f 46 6f 75 6e 64 20  /* The OP_Found 
113c0 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  at the top of th
113d0 69 73 20 62 72 61 6e 63 68 20 6a 75 6d 70 73 20  is branch jumps 
113e0 68 65 72 65 20 77 68 65 6e 20 74 72 75 65 2c 20  here when true, 
113f0 0a 20 20 20 20 20 20 2a 2a 20 63 61 75 73 69 6e  .      ** causin
11400 67 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 49 4e  g the overall IN
11410 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
11420 75 61 74 69 6f 6e 20 74 6f 20 66 61 6c 6c 20 74  uation to fall t
11430 68 72 6f 75 67 68 2e 0a 20 20 20 20 20 20 2a 2f  hrough..      */
11440 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11450 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31  beJumpHere(v, j1
11460 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
11470 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
11480 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
11490 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
114a0 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20  achePop(pParse, 
114b0 31 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  1);.  VdbeCommen
114c0 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78  t((v, "end IN ex
114d0 70 72 22 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  pr"));.}.#endif 
114e0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
114f0 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a  UBQUERY */../*.*
11500 2a 20 44 75 70 6c 69 63 61 74 65 20 61 6e 20 38  * Duplicate an 8
11510 2d 62 79 74 65 20 76 61 6c 75 65 0a 2a 2f 0a 73  -byte value.*/.s
11520 74 61 74 69 63 20 63 68 61 72 20 2a 64 75 70 38  tatic char *dup8
11530 62 79 74 65 73 28 56 64 62 65 20 2a 76 2c 20 63  bytes(Vdbe *v, c
11540 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e 29 7b 0a  onst char *in){.
11550 20 20 63 68 61 72 20 2a 6f 75 74 20 3d 20 73 71    char *out = sq
11560 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
11570 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76  (sqlite3VdbeDb(v
11580 29 2c 20 38 29 3b 0a 20 20 69 66 28 20 6f 75 74  ), 8);.  if( out
11590 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 6f   ){.    memcpy(o
115a0 75 74 2c 20 69 6e 2c 20 38 29 3b 0a 20 20 7d 0a  ut, in, 8);.  }.
115b0 20 20 72 65 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a    return out;.}.
115c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
115d0 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
115e0 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  INT./*.** Genera
115f0 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  te an instructio
11600 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20  n that will put 
11610 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  the floating poi
11620 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63  nt.** value desc
11630 72 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d  ribed by z[0..n-
11640 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  1] into register
11650 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   iMem..**.** The
11660 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c   z[] string will
11670 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65   probably not be
11680 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64   zero-terminated
11690 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a  .  But the .** z
116a0 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69 73  [n] character is
116b0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
116c0 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  e something that
116d0 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a   does not look.*
116e0 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69  * like the conti
116f0 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  nuation of the n
11700 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  umber..*/.static
11710 20 76 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56   void codeReal(V
11720 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68  dbe *v, const ch
11730 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74  ar *z, int negat
11740 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29  eFlag, int iMem)
11750 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a  {.  if( ALWAYS(z
11760 21 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f 75 62  !=0) ){.    doub
11770 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 68  le value;.    ch
11780 61 72 20 2a 7a 56 3b 0a 20 20 20 20 73 71 6c 69  ar *zV;.    sqli
11790 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75  te3AtoF(z, &valu
117a0 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
117b0 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54  30(z), SQLITE_UT
117c0 46 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  F8);.    assert(
117d0 20 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76   !sqlite3IsNaN(v
117e0 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68 65 20  alue) ); /* The 
117f0 6e 65 77 20 41 74 6f 46 20 6e 65 76 65 72 20 72  new AtoF never r
11800 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20  eturns NaN */.  
11810 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67    if( negateFlag
11820 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75   ) value = -valu
11830 65 3b 0a 20 20 20 20 7a 56 20 3d 20 64 75 70 38  e;.    zV = dup8
11840 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29  bytes(v, (char*)
11850 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 73 71 6c  &value);.    sql
11860 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
11870 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d  , OP_Real, 0, iM
11880 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 52 45  em, 0, zV, P4_RE
11890 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  AL);.  }.}.#endi
118a0 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  f.../*.** Genera
118b0 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  te an instructio
118c0 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20  n that will put 
118d0 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73 63  the integer desc
118e0 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20  ribe by.** text 
118f0 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72  z[0..n-1] into r
11900 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a  egister iMem..**
11910 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65  .** Expr.u.zToke
11920 6e 20 69 73 20 61 6c 77 61 79 73 20 55 54 46 38  n is always UTF8
11930 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e   and zero-termin
11940 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ated..*/.static 
11950 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72  void codeInteger
11960 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
11970 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
11980 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d   negFlag, int iM
11990 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  em){.  Vdbe *v =
119a0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
119b0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
119c0 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
119d0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20   ){.    int i = 
119e0 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b  pExpr->u.iValue;
119f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d  .    assert( i>=
11a00 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 67  0 );.    if( neg
11a10 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20  Flag ) i = -i;. 
11a20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11a30 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
11a40 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20  er, i, iMem);.  
11a50 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 63  }else{.    int c
11a60 3b 0a 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b  ;.    i64 value;
11a70 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
11a80 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54  *z = pExpr->u.zT
11a90 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74  oken;.    assert
11aa0 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63 20  ( z!=0 );.    c 
11ab0 3d 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28  = sqlite3Atoi64(
11ac0 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69 74  z, &value, sqlit
11ad0 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53  e3Strlen30(z), S
11ae0 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
11af0 20 69 66 28 20 63 3d 3d 30 20 7c 7c 20 28 63 3d   if( c==0 || (c=
11b00 3d 32 20 26 26 20 6e 65 67 46 6c 61 67 29 20 29  =2 && negFlag) )
11b10 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56  {.      char *zV
11b20 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67 46  ;.      if( negF
11b30 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20 63  lag ){ value = c
11b40 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49  ==2 ? SMALLEST_I
11b50 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d  NT64 : -value; }
11b60 0a 20 20 20 20 20 20 7a 56 20 3d 20 64 75 70 38  .      zV = dup8
11b70 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29  bytes(v, (char*)
11b80 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 73  &value);.      s
11b90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
11ba0 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c  (v, OP_Int64, 0,
11bb0 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34   iMem, 0, zV, P4
11bc0 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c  _INT64);.    }el
11bd0 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  se{.#ifdef SQLIT
11be0 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
11bf0 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69  POINT.      sqli
11c00 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
11c10 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69  se, "oversized i
11c20 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e  nteger: %s%s", n
11c30 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22  egFlag ? "-" : "
11c40 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 20  ", z);.#else.   
11c50 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a     codeReal(v, z
11c60 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29  , negFlag, iMem)
11c70 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
11c80 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61   }.}../*.** Clea
11c90 72 20 61 20 63 61 63 68 65 20 65 6e 74 72 79 2e  r a cache entry.
11ca0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11cb0 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28  cacheEntryClear(
11cc0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73  Parse *pParse, s
11cd0 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
11ce0 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74 65  *p){.  if( p->te
11cf0 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66 28  mpReg ){.    if(
11d00 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
11d10 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72  g<ArraySize(pPar
11d20 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b  se->aTempReg) ){
11d30 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61  .      pParse->a
11d40 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e  TempReg[pParse->
11d50 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 2d  nTempReg++] = p-
11d60 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20  >iReg;.    }.   
11d70 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b   p->tempReg = 0;
11d80 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  .  }.}.../*.** R
11d90 65 63 6f 72 64 20 69 6e 20 74 68 65 20 63 6f 6c  ecord in the col
11da0 75 6d 6e 20 63 61 63 68 65 20 74 68 61 74 20 61  umn cache that a
11db0 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6c 75   particular colu
11dc0 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72  mn from a.** par
11dd0 74 69 63 75 6c 61 72 20 74 61 62 6c 65 20 69 73  ticular table is
11de0 20 73 74 6f 72 65 64 20 69 6e 20 61 20 70 61 72   stored in a par
11df0 74 69 63 75 6c 61 72 20 72 65 67 69 73 74 65 72  ticular register
11e00 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
11e10 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
11e20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
11e30 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 69 43 6f  nt iTab, int iCo
11e40 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20  l, int iReg){.  
11e50 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e  int i;.  int min
11e60 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72  Lru;.  int idxLr
11e70 75 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  u;.  struct yCol
11e80 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 61 73 73  Cache *p;..  ass
11e90 65 72 74 28 20 69 52 65 67 3e 30 20 29 3b 20 20  ert( iReg>0 );  
11ea0 2f 2a 20 52 65 67 69 73 74 65 72 20 6e 75 6d 62  /* Register numb
11eb0 65 72 73 20 61 72 65 20 61 6c 77 61 79 73 20 70  ers are always p
11ec0 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 61 73 73  ositive */.  ass
11ed0 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26  ert( iCol>=-1 &&
11ee0 20 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20   iCol<32768 );  
11ef0 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e  /* Finite column
11f00 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f   numbers */..  /
11f10 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c  * The SQLITE_Col
11f20 75 6d 6e 43 61 63 68 65 20 66 6c 61 67 20 64 69  umnCache flag di
11f30 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d  sables the colum
11f40 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 69  n cache.  This i
11f50 73 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20  s used.  ** for 
11f60 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74  testing only - t
11f70 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 53 51  o verify that SQ
11f80 4c 69 74 65 20 61 6c 77 61 79 73 20 67 65 74 73  Lite always gets
11f90 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72   the same answer
11fa0 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 64 20 77  .  ** with and w
11fb0 69 74 68 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d  ithout the colum
11fc0 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20  n cache..  */.  
11fd0 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
11fe0 44 69 73 61 62 6c 65 64 28 70 50 61 72 73 65 2d  Disabled(pParse-
11ff0 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c 75  >db, SQLITE_Colu
12000 6d 6e 43 61 63 68 65 29 20 29 20 72 65 74 75 72  mnCache) ) retur
12010 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 72  n;..  /* First r
12020 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73 74  eplace any exist
12030 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a  ing entry..  **.
12040 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74    ** Actually, t
12050 68 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75 6d  he way the colum
12060 6e 20 63 61 63 68 65 20 69 73 20 63 75 72 72 65  n cache is curre
12070 6e 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61 72  ntly used, we ar
12080 65 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20 2a  e guaranteed.  *
12090 2a 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65 63  * that the objec
120a0 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72  t will never alr
120b0 65 61 64 79 20 62 65 20 69 6e 20 63 61 63 68 65  eady be in cache
120c0 2e 20 20 56 65 72 69 66 79 20 74 68 69 73 20 67  .  Verify this g
120d0 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23  uarantee..  */.#
120e0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
120f0 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
12100 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
12110 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
12120 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
12130 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 52 65    assert( p->iRe
12140 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61 62 6c  g==0 || p->iTabl
12150 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69 43  e!=iTab || p->iC
12160 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20  olumn!=iCol );. 
12170 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
12180 46 69 6e 64 20 61 6e 20 65 6d 70 74 79 20 73 6c  Find an empty sl
12190 6f 74 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69  ot and replace i
121a0 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20  t */.  for(i=0, 
121b0 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
121c0 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
121d0 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
121e0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
121f0 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iReg==0 ){.     
12200 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61   p->iLevel = pPa
12210 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
12220 3b 0a 20 20 20 20 20 20 70 2d 3e 69 54 61 62 6c  ;.      p->iTabl
12230 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20  e = iTab;.      
12240 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f  p->iColumn = iCo
12250 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67  l;.      p->iReg
12260 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 20 20 70   = iReg;.      p
12270 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  ->tempReg = 0;. 
12280 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50       p->lru = pP
12290 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b  arse->iCacheCnt+
122a0 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  +;.      return;
122b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
122c0 20 52 65 70 6c 61 63 65 20 74 68 65 20 6c 61 73   Replace the las
122d0 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64 20  t recently used 
122e0 2a 2f 0a 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78  */.  minLru = 0x
122f0 37 66 66 66 66 66 66 66 3b 0a 20 20 69 64 78 4c  7fffffff;.  idxL
12300 72 75 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69  ru = -1;.  for(i
12310 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
12320 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
12330 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
12340 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
12350 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29   p->lru<minLru )
12360 7b 0a 20 20 20 20 20 20 69 64 78 4c 72 75 20 3d  {.      idxLru =
12370 20 69 3b 0a 20 20 20 20 20 20 6d 69 6e 4c 72 75   i;.      minLru
12380 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d   = p->lru;.    }
12390 0a 20 20 7d 0a 20 20 69 66 28 20 41 4c 57 41 59  .  }.  if( ALWAY
123a0 53 28 69 64 78 4c 72 75 3e 3d 30 29 20 29 7b 0a  S(idxLru>=0) ){.
123b0 20 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d      p = &pParse-
123c0 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72  >aColCache[idxLr
123d0 75 5d 3b 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65  u];.    p->iLeve
123e0 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
123f0 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 70 2d 3e  heLevel;.    p->
12400 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20  iTable = iTab;. 
12410 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20     p->iColumn = 
12420 69 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 52 65  iCol;.    p->iRe
12430 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 70 2d  g = iReg;.    p-
12440 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
12450 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73    p->lru = pPars
12460 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a  e->iCacheCnt++;.
12470 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
12480 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74  }../*.** Indicat
12490 65 20 74 68 61 74 20 72 65 67 69 73 74 65 72 73  e that registers
124a0 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e 2e 69   between iReg..i
124b0 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65 20 62  Reg+nReg-1 are b
124c0 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
124d0 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 72  ..** Purge the r
124e0 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
124f0 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d  s from the colum
12500 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64  n cache..*/.void
12510 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
12520 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20 2a 70  eRemove(Parse *p
12530 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c  Parse, int iReg,
12540 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
12550 74 20 69 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74  t i;.  int iLast
12560 20 3d 20 69 52 65 67 20 2b 20 6e 52 65 67 20 2d   = iReg + nReg -
12570 20 31 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   1;.  struct yCo
12580 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72  lCache *p;.  for
12590 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
125a0 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
125b0 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
125c0 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
125d0 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a  nt r = p->iReg;.
125e0 20 20 20 20 69 66 28 20 72 3e 3d 69 52 65 67 20      if( r>=iReg 
125f0 26 26 20 72 3c 3d 69 4c 61 73 74 20 29 7b 0a 20  && r<=iLast ){. 
12600 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43       cacheEntryC
12610 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b  lear(pParse, p);
12620 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d  .      p->iReg =
12630 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
12640 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20  ./*.** Remember 
12650 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75  the current colu
12660 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65 78 74  mn cache context
12670 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74 72 69  .  Any new entri
12680 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64 64 65  es added.** adde
12690 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d to the column 
126a0 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
126b0 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76 65   call are remove
126c0 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f  d when the.** co
126d0 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70 20  rresponding pop 
126e0 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20  occurs..*/.void 
126f0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
12700 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72  Push(Parse *pPar
12710 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 69  se){.  pParse->i
12720 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 23 69  CacheLevel++;.#i
12730 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
12740 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  G.  if( pParse->
12750 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
12760 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
12770 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  e ){.    printf(
12780 22 50 55 53 48 20 74 6f 20 25 64 5c 6e 22 2c 20  "PUSH to %d\n", 
12790 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
127a0 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  vel);.  }.#endif
127b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
127c0 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e   from the column
127d0 20 63 61 63 68 65 20 61 6e 79 20 65 6e 74 72 69   cache any entri
127e0 65 73 20 74 68 61 74 20 77 65 72 65 20 61 64 64  es that were add
127f0 65 64 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20  ed since the.** 
12800 74 68 65 20 70 72 65 76 69 6f 75 73 20 4e 20 50  the previous N P
12810 75 73 68 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20  ush operations. 
12820 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
12830 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 61 63   restore the cac
12840 68 65 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61  he.** to the sta
12850 74 65 20 69 74 20 77 61 73 20 69 6e 20 4e 20 50  te it was in N P
12860 75 73 68 65 73 20 61 67 6f 2e 0a 2a 2f 0a 76 6f  ushes ago..*/.vo
12870 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
12880 63 68 65 50 6f 70 28 50 61 72 73 65 20 2a 70 50  chePop(Parse *pP
12890 61 72 73 65 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  arse, int N){.  
128a0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
128b0 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
128c0 61 73 73 65 72 74 28 20 4e 3e 30 20 29 3b 0a 20  assert( N>0 );. 
128d0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
128e0 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e 3d 4e 20  >iCacheLevel>=N 
128f0 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61  );.  pParse->iCa
12900 63 68 65 4c 65 76 65 6c 20 2d 3d 20 4e 3b 0a 23  cheLevel -= N;.#
12910 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
12920 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  UG.  if( pParse-
12930 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
12940 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
12950 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ce ){.    printf
12960 28 22 50 4f 50 20 20 74 6f 20 25 64 5c 6e 22 2c  ("POP  to %d\n",
12970 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
12980 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  evel);.  }.#endi
12990 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  f.  for(i=0, p=p
129a0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
129b0 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
129c0 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
129d0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
129e0 67 20 26 26 20 70 2d 3e 69 4c 65 76 65 6c 3e 70  g && p->iLevel>p
129f0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
12a00 65 6c 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68  el ){.      cach
12a10 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72  eEntryClear(pPar
12a20 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d  se, p);.      p-
12a30 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  >iReg = 0;.    }
12a40 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  .  }.}../*.** Wh
12a50 65 6e 20 61 20 63 61 63 68 65 64 20 63 6f 6c 75  en a cached colu
12a60 6d 6e 20 69 73 20 72 65 75 73 65 64 2c 20 6d 61  mn is reused, ma
12a70 6b 65 20 73 75 72 65 20 74 68 61 74 20 69 74 73  ke sure that its
12a80 20 72 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20   register is.** 
12a90 6e 6f 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61  no longer availa
12aa0 62 6c 65 20 61 73 20 61 20 74 65 6d 70 20 72 65  ble as a temp re
12ab0 67 69 73 74 65 72 2e 20 20 74 69 63 6b 65 74 20  gister.  ticket 
12ac0 23 33 38 37 39 3a 20 20 74 68 61 74 20 73 61 6d  #3879:  that sam
12ad0 65 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 6d 69  e.** register mi
12ae0 67 68 74 20 62 65 20 69 6e 20 74 68 65 20 63 61  ght be in the ca
12af0 63 68 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20  che in multiple 
12b00 70 6c 61 63 65 73 2c 20 73 6f 20 62 65 20 73 75  places, so be su
12b10 72 65 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65  re to.** get the
12b20 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  m all..*/.static
12b30 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70   void sqlite3Exp
12b40 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65  rCachePinRegiste
12b50 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
12b60 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e   int iReg){.  in
12b70 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
12b80 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f  olCache *p;.  fo
12b90 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
12ba0 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
12bb0 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
12bc0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
12bd0 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65  if( p->iReg==iRe
12be0 67 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65  g ){.      p->te
12bf0 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  mpReg = 0;.    }
12c00 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
12c10 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
12c20 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
12c30 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20   of the iCol-th 
12c40 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c  column of a tabl
12c50 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
12c60 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
12c70 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56 64  umnOfTable(.  Vd
12c80 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a  be *v,        /*
12c90 20 54 68 65 20 56 44 42 45 20 75 6e 64 65 72 20   The VDBE under 
12ca0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
12cb0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
12cc0 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63    /* The table c
12cd0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61  ontaining the va
12ce0 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  lue */.  int iTa
12cf0 62 43 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20  bCur,    /* The 
12d00 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f  table cursor.  O
12d10 72 20 74 68 65 20 50 4b 20 63 75 72 73 6f 72 20  r the PK cursor 
12d20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  for WITHOUT ROWI
12d30 44 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  D */.  int iCol,
12d40 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
12d50 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f  of the column to
12d60 20 65 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e   extract */.  in
12d70 74 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a  t regOut      /*
12d80 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
12d90 75 65 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67  ue into this reg
12da0 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66  ister */.){.  if
12db0 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c  ( iCol<0 || iCol
12dc0 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b  ==pTab->iPKey ){
12dd0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12de0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
12df0 69 64 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67  id, iTabCur, reg
12e00 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Out);.  }else{. 
12e10 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69     int op = IsVi
12e20 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50  rtual(pTab) ? OP
12e30 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f  _VColumn : OP_Co
12e40 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20  lumn;.    int x 
12e50 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20  = iCol;.    if( 
12e60 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
12e70 29 7b 0a 20 20 20 20 20 20 78 20 3d 20 73 71 6c  ){.      x = sql
12e80 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65  ite3ColumnOfInde
12e90 78 28 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  x(sqlite3Primary
12ea0 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 2c 20  KeyIndex(pTab), 
12eb0 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  iCol);.    }.   
12ec0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12ed0 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 43 75  p3(v, op, iTabCu
12ee0 72 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a 20  r, x, regOut);. 
12ef0 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30   }.  if( iCol>=0
12f00 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
12f10 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20  olumnDefault(v, 
12f20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f  pTab, iCol, regO
12f30 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ut);.  }.}../*.*
12f40 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
12f50 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63  that will extrac
12f60 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68  t the iColumn-th
12f70 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20   column from.** 
12f80 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73  table pTab and s
12f90 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  tore the column 
12fa0 76 61 6c 75 65 20 69 6e 20 61 20 72 65 67 69 73  value in a regis
12fb0 74 65 72 2e 20 20 41 6e 20 65 66 66 6f 72 74 0a  ter.  An effort.
12fc0 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 73 74  ** is made to st
12fd0 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76  ore the column v
12fe0 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
12ff0 20 69 52 65 67 2c 20 62 75 74 20 74 68 69 73 20   iReg, but this 
13000 69 73 0a 2a 2a 20 6e 6f 74 20 67 75 61 72 61 6e  is.** not guaran
13010 74 65 65 64 2e 20 20 54 68 65 20 6c 6f 63 61 74  teed.  The locat
13020 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ion of the colum
13030 6e 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72  n value is retur
13040 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  ned..**.** There
13050 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e   must be an open
13060 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20   cursor to pTab 
13070 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74  in iTable when t
13080 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
13090 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43  s called.  If iC
130a0 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64  olumn<0 then cod
130b0 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74  e is generated t
130c0 68 61 74 20 65 78 74 72 61 63 74 73 20 74 68 65  hat extracts the
130d0 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73   rowid..*/.int s
130e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
130f0 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65  tColumn(.  Parse
13100 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
13110 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
13120 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
13130 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
13140 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63  Tab,     /* Desc
13150 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  ription of the t
13160 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61 64  able we are read
13170 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ing from */.  in
13180 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f  t iColumn,     /
13190 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74  * Index of the t
131a0 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  able column */. 
131b0 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
131c0 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
131d0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
131e0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
131f0 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53  Reg,        /* S
13200 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65 72  tore results her
13210 65 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20  e */.  u8 p5    
13220 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20 76 61          /* P5 va
13230 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d  lue for OP_Colum
13240 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  n */.){.  Vdbe *
13250 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
13260 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
13270 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
13280 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  p;..  for(i=0, p
13290 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
132a0 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
132b0 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
132c0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
132d0 52 65 67 3e 30 20 26 26 20 70 2d 3e 69 54 61 62  Reg>0 && p->iTab
132e0 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 2d  le==iTable && p-
132f0 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  >iColumn==iColum
13300 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72  n ){.      p->lr
13310 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  u = pParse->iCac
13320 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73  heCnt++;.      s
13330 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
13340 69 6e 52 65 67 69 73 74 65 72 28 70 50 61 72 73  inRegister(pPars
13350 65 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20  e, p->iReg);.   
13360 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 52 65     return p->iRe
13370 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20  g;.    }.  }  . 
13380 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
13390 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
133a0 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
133b0 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62  le(v, pTab, iTab
133c0 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65  le, iColumn, iRe
133d0 67 29 3b 0a 20 20 69 66 28 20 70 35 20 29 7b 0a  g);.  if( p5 ){.
133e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
133f0 68 61 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a  hangeP5(v, p5);.
13400 20 20 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20 20    }else{   .    
13410 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
13420 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 54  Store(pParse, iT
13430 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69  able, iColumn, i
13440 52 65 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Reg);.  }.  retu
13450 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn iReg;.}../*.*
13460 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c 75  * Clear all colu
13470 6d 6e 20 63 61 63 68 65 20 65 6e 74 72 69 65 73  mn cache entries
13480 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
13490 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
134a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
134b0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
134c0 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
134d0 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55  .#if SQLITE_DEBU
134e0 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  G.  if( pParse->
134f0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
13500 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
13510 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  e ){.    printf(
13520 22 43 4c 45 41 52 5c 6e 22 29 3b 0a 20 20 7d 0a  "CLEAR\n");.  }.
13530 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30  #endif.  for(i=0
13540 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
13550 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
13560 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
13570 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
13580 2d 3e 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20  ->iReg ){.      
13590 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28  cacheEntryClear(
135a0 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
135b0 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20    p->iReg = 0;. 
135c0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
135d0 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63  * Record the fac
135e0 74 20 74 68 61 74 20 61 6e 20 61 66 66 69 6e 69  t that an affini
135f0 74 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63  ty change has oc
13600 63 75 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74  curred on iCount
13610 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73 74  .** registers st
13620 61 72 74 69 6e 67 20 77 69 74 68 20 69 53 74 61  arting with iSta
13630 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rt..*/.void sqli
13640 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
13650 6e 69 74 79 43 68 61 6e 67 65 28 50 61 72 73 65  nityChange(Parse
13660 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 53   *pParse, int iS
13670 74 61 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74  tart, int iCount
13680 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  ){.  sqlite3Expr
13690 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72  CacheRemove(pPar
136a0 73 65 2c 20 69 53 74 61 72 74 2c 20 69 43 6f 75  se, iStart, iCou
136b0 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  nt);.}../*.** Ge
136c0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d  nerate code to m
136d0 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ove content from
136e0 20 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d   registers iFrom
136f0 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a  ...iFrom+nReg-1.
13700 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e  ** over to iTo..
13710 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70  iTo+nReg-1. Keep
13720 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
13730 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f  e up-to-date..*/
13740 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
13750 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20  rCodeMove(Parse 
13760 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72  *pParse, int iFr
13770 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74  om, int iTo, int
13780 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b   nReg){.  int i;
13790 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
137a0 63 68 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  che *p;.  assert
137b0 28 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65  ( iFrom>=iTo+nRe
137c0 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c  g || iFrom+nReg<
137d0 3d 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65  =iTo );.  sqlite
137e0 33 56 64 62 65 41 64 64 4f 70 33 28 70 50 61 72  3VdbeAddOp3(pPar
137f0 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f  se->pVdbe, OP_Mo
13800 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20  ve, iFrom, iTo, 
13810 6e 52 65 67 2d 31 29 3b 0a 20 20 66 6f 72 28 69  nReg-1);.  for(i
13820 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
13830 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
13840 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
13850 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  +, p++){.    int
13860 20 78 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20   x = p->iReg;.  
13870 20 20 69 66 28 20 78 3e 3d 69 46 72 6f 6d 20 26    if( x>=iFrom &
13880 26 20 78 3c 69 46 72 6f 6d 2b 6e 52 65 67 20 29  & x<iFrom+nReg )
13890 7b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  {.      p->iReg 
138a0 2b 3d 20 69 54 6f 2d 69 46 72 6f 6d 3b 0a 20 20  += iTo-iFrom;.  
138b0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64    }.  }.}..#if d
138c0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
138d0 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
138e0 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f  SQLITE_COVERAGE_
138f0 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  TEST)./*.** Retu
13900 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20 72  rn true if any r
13910 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 72  egister in the r
13920 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20  ange iFrom..iTo 
13930 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69  (inclusive).** i
13940 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  s used as part o
13950 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  f the column cac
13960 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  he..**.** This r
13970 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 77  outine is used w
13980 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 61  ithin assert() a
13990 6e 64 20 74 65 73 74 63 61 73 65 28 29 20 6d 61  nd testcase() ma
139a0 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64  cros only.** and
139b0 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72   does not appear
139c0 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69   in a normal bui
139d0 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ld..*/.static in
139e0 74 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61  t usedAsColumnCa
139f0 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  che(Parse *pPars
13a00 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  e, int iFrom, in
13a10 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  t iTo){.  int i;
13a20 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
13a30 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d  che *p;.  for(i=
13a40 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
13a50 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
13a60 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
13a70 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  , p++){.    int 
13a80 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20  r = p->iReg;.   
13a90 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26   if( r>=iFrom &&
13aa0 20 72 3c 3d 69 54 6f 20 29 20 72 65 74 75 72 6e   r<=iTo ) return
13ab0 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54   1;    /*NO_TEST
13ac0 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
13ad0 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  0;.}.#endif /* S
13ae0 51 4c 49 54 45 5f 44 45 42 55 47 20 7c 7c 20 53  QLITE_DEBUG || S
13af0 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54  QLITE_COVERAGE_T
13b00 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f  EST */../*.** Co
13b10 6e 76 65 72 74 20 61 6e 20 65 78 70 72 65 73 73  nvert an express
13b20 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 61 20 54 4b  ion node to a TK
13b30 5f 52 45 47 49 53 54 45 52 0a 2a 2f 0a 73 74 61  _REGISTER.*/.sta
13b40 74 69 63 20 76 6f 69 64 20 65 78 70 72 54 6f 52  tic void exprToR
13b50 65 67 69 73 74 65 72 28 45 78 70 72 20 2a 70 2c  egister(Expr *p,
13b60 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 70 2d   int iReg){.  p-
13b70 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20  >op2 = p->op;.  
13b80 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53  p->op = TK_REGIS
13b90 54 45 52 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65  TER;.  p->iTable
13ba0 20 3d 20 69 52 65 67 3b 0a 20 20 45 78 70 72 43   = iReg;.  ExprC
13bb0 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70 2c 20  learProperty(p, 
13bc0 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a  EP_Skip);.}../*.
13bd0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
13be0 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e   into the curren
13bf0 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61  t Vdbe to evalua
13c00 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  te the given.** 
13c10 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74 74  expression.  Att
13c20 65 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74 68  empt to store th
13c30 65 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67  e results in reg
13c40 69 73 74 65 72 20 22 74 61 72 67 65 74 22 2e 0a  ister "target"..
13c50 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  ** Return the re
13c60 67 69 73 74 65 72 20 77 68 65 72 65 20 72 65 73  gister where res
13c70 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 2e  ults are stored.
13c80 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69 73  .**.** With this
13c90 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65 20   routine, there 
13ca0 69 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 20  is no guarantee 
13cb0 74 68 61 74 20 72 65 73 75 6c 74 73 20 77 69 6c  that results wil
13cc0 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69  l.** be stored i
13cd0 6e 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  n target.  The r
13ce0 65 73 75 6c 74 20 6d 69 67 68 74 20 62 65 20 73  esult might be s
13cf0 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74  tored in some ot
13d00 68 65 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  her.** register 
13d10 69 66 20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69  if it is conveni
13d20 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54  ent to do so.  T
13d30 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
13d40 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63  ion.** must chec
13d50 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  k the return cod
13d60 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72  e and move the r
13d70 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20 64 65  esults to the de
13d80 73 69 72 65 64 0a 2a 2a 20 72 65 67 69 73 74 65  sired.** registe
13d90 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
13da0 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
13db0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
13dc0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
13dd0 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20  target){.  Vdbe 
13de0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
13df0 62 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75  be;  /* The VM u
13e00 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
13e10 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  n */.  int op;  
13e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e30 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62   /* The opcode b
13e40 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
13e50 69 6e 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67  int inReg = targ
13e60 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  et;       /* Res
13e70 75 6c 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72  ults stored in r
13e80 65 67 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f  egister inReg */
13e90 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
13ea0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
13eb0 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65  If non-zero free
13ec0 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
13ed0 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
13ee0 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20  t regFree2 = 0; 
13ef0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
13f00 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73  n-zero free this
13f10 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
13f20 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c  ter */.  int r1,
13f30 20 72 32 2c 20 72 33 2c 20 72 34 3b 20 20 20 20   r2, r3, r4;    
13f40 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65     /* Various re
13f50 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a  gister numbers *
13f60 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
13f70 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a  = pParse->db; /*
13f80 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
13f90 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78  nnection */.  Ex
13fa0 70 72 20 74 65 6d 70 58 3b 20 20 20 20 20 20 20  pr tempX;       
13fb0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
13fc0 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  rary expression 
13fd0 6e 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  node */..  asser
13fe0 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74  t( target>0 && t
13ff0 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e  arget<=pParse->n
14000 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d  Mem );.  if( v==
14010 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
14020 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
14030 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
14040 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
14050 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
14060 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55  {.    op = TK_NU
14070 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
14080 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
14090 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f  .  }.  switch( o
140a0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
140b0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  _AGG_COLUMN: {. 
140c0 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41       AggInfo *pA
140d0 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  ggInfo = pExpr->
140e0 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
140f0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
14100 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67  ol *pCol = &pAgg
14110 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72  Info->aCol[pExpr
14120 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69  ->iAgg];.      i
14130 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69  f( !pAggInfo->di
14140 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20  rectMode ){.    
14150 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
14160 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20  ->iMem>0 );.    
14170 20 20 20 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c      inReg = pCol
14180 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->iMem;.        
14190 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
141a0 73 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d  se if( pAggInfo-
141b0 3e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29  >useSortingIdx )
141c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
141d0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
141e0 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e  P_Column, pAggIn
141f0 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50 54  fo->sortingIdxPT
14200 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab,.            
14210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14220 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
14230 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a  olumn, target);.
14240 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
14250 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
14260 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20  Otherwise, fall 
14270 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b  thru into the TK
14280 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a  _COLUMN case */.
14290 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
142a0 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
142b0 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 45 78    int iTab = pEx
142c0 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
142d0 20 20 69 66 28 20 69 54 61 62 3c 30 20 29 7b 0a    if( iTab<0 ){.
142e0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72          if( pPar
142f0 73 65 2d 3e 63 6b 42 61 73 65 3e 30 20 29 7b 0a  se->ckBase>0 ){.
14300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
14310 65 72 61 74 69 6e 67 20 43 48 45 43 4b 20 63 6f  erating CHECK co
14320 6e 73 74 72 61 69 6e 74 73 20 6f 72 20 69 6e 73  nstraints or ins
14330 65 72 74 69 6e 67 20 69 6e 74 6f 20 70 61 72 74  erting into part
14340 69 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ial index */.   
14350 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70         inReg = p
14360 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20  Expr->iColumn + 
14370 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3b 0a  pParse->ckBase;.
14380 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
14390 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
143a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c            /* Del
143b0 65 74 69 6e 67 20 66 72 6f 6d 20 61 20 70 61 72  eting from a par
143c0 74 69 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20  tial index */.  
143d0 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70          iTab = p
143e0 50 61 72 73 65 2d 3e 69 50 61 72 74 49 64 78 54  Parse->iPartIdxT
143f0 61 62 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ab;.        }.  
14400 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65      }.      inRe
14410 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
14420 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
14430 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62  rse, pExpr->pTab
14440 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14460 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
14470 20 69 54 61 62 2c 20 74 61 72 67 65 74 2c 0a 20   iTab, target,. 
14480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
144a0 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 20  xpr->op2);.     
144b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
144c0 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
144d0 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49  R: {.      codeI
144e0 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70  nteger(pParse, p
144f0 45 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74 29  Expr, 0, target)
14500 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14510 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
14520 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
14530 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65  G_POINT.    case
14540 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20   TK_FLOAT: {.   
14550 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
14560 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
14570 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
14580 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61  );.      codeRea
14590 6c 28 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  l(v, pExpr->u.zT
145a0 6f 6b 65 6e 2c 20 30 2c 20 74 61 72 67 65 74 29  oken, 0, target)
145b0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
145c0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
145d0 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
145e0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
145f0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
14600 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
14610 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71  lue) );.      sq
14620 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
14630 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
14640 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 70 45 78  , target, 0, pEx
14650 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29  pr->u.zToken, 0)
14660 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14670 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
14680 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73  _NULL: {.      s
14690 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
146a0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
146b0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
146c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
146d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
146e0 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20  BLOB_LITERAL.   
146f0 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b   case TK_BLOB: {
14700 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
14710 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
14720 7a 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  z;.      char *z
14730 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65  Blob;.      asse
14740 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
14750 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
14760 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
14770 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
14780 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78  >u.zToken[0]=='x
14790 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ' || pExpr->u.zT
147a0 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a  oken[0]=='X' );.
147b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
147c0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d  xpr->u.zToken[1]
147d0 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20  =='\'' );.      
147e0 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54  z = &pExpr->u.zT
147f0 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e  oken[2];.      n
14800 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
14810 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20  30(z) - 1;.     
14820 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27   assert( z[n]=='
14830 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c  \'' );.      zBl
14840 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54  ob = sqlite3HexT
14850 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62  oBlob(sqlite3Vdb
14860 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20  eDb(v), z, n);. 
14870 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14880 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f  AddOp4(v, OP_Blo
14890 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20  b, n/2, target, 
148a0 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e  0, zBlob, P4_DYN
148b0 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65  AMIC);.      bre
148c0 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
148d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
148e0 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 61  IABLE: {.      a
148f0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
14900 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
14910 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
14920 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
14930 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20  pr->u.zToken!=0 
14940 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14950 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
14960 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  [0]!=0 );.      
14970 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14980 32 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65  2(v, OP_Variable
14990 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
149a0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
149b0 20 69 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54   if( pExpr->u.zT
149c0 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20  oken[1]!=0 ){.  
149d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
149e0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d  xpr->u.zToken[0]
149f0 3d 3d 27 3f 27 20 0a 20 20 20 20 20 20 20 20 20  =='?' .         
14a00 20 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 70 45      || strcmp(pE
14a10 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70  xpr->u.zToken, p
14a20 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78  Parse->azVar[pEx
14a30 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 29 3d  pr->iColumn-1])=
14a40 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =0 );.        sq
14a50 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
14a60 34 28 76 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d  4(v, -1, pParse-
14a70 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69 43  >azVar[pExpr->iC
14a80 6f 6c 75 6d 6e 2d 31 5d 2c 20 50 34 5f 53 54 41  olumn-1], P4_STA
14a90 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TIC);.      }.  
14aa0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14ab0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
14ac0 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 69  ISTER: {.      i
14ad0 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 54  nReg = pExpr->iT
14ae0 61 62 6c 65 3b 0a 20 20 20 20 20 20 62 72 65 61  able;.      brea
14af0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
14b00 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20  e TK_AS: {.     
14b10 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
14b20 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
14b30 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
14b40 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  eft, target);.  
14b50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14b60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14b70 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61  OMIT_CAST.    ca
14b80 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20  se TK_CAST: {.  
14b90 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
14ba0 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20  ns of the form: 
14bb0 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53 20    CAST(pLeft AS 
14bc0 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20  token) */.      
14bd0 69 6e 74 20 61 66 66 2c 20 74 6f 5f 6f 70 3b 0a  int aff, to_op;.
14be0 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
14bf0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
14c00 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
14c10 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
14c20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14c30 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
14c40 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
14c50 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61  alue) );.      a
14c60 66 66 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69  ff = sqlite3Affi
14c70 6e 69 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e  nityType(pExpr->
14c80 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20  u.zToken, 0);.  
14c90 20 20 20 20 74 6f 5f 6f 70 20 3d 20 61 66 66 20      to_op = aff 
14ca0 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  - SQLITE_AFF_TEX
14cb0 54 20 2b 20 4f 50 5f 54 6f 54 65 78 74 3b 0a 20  T + OP_ToText;. 
14cc0 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f       assert( to_
14cd0 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 20 20  op==OP_ToText   
14ce0 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f   || aff!=SQLITE_
14cf0 41 46 46 5f 54 45 58 54 20 20 20 20 29 3b 0a 20  AFF_TEXT    );. 
14d00 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f       assert( to_
14d10 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 20 20  op==OP_ToBlob   
14d20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f   || aff!=SQLITE_
14d30 41 46 46 5f 4e 4f 4e 45 20 20 20 20 29 3b 0a 20  AFF_NONE    );. 
14d40 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f       assert( to_
14d50 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63  op==OP_ToNumeric
14d60 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f   || aff!=SQLITE_
14d70 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20  AFF_NUMERIC );. 
14d80 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f       assert( to_
14d90 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 20 20 20  op==OP_ToInt    
14da0 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f   || aff!=SQLITE_
14db0 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20  AFF_INTEGER );. 
14dc0 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f       assert( to_
14dd0 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 20 20  op==OP_ToReal   
14de0 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f   || aff!=SQLITE_
14df0 41 46 46 5f 52 45 41 4c 20 20 20 20 29 3b 0a 20  AFF_REAL    );. 
14e00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74       testcase( t
14e10 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20  o_op==OP_ToText 
14e20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14e30 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42  e( to_op==OP_ToB
14e40 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 74 65 73  lob );.      tes
14e50 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50  tcase( to_op==OP
14e60 5f 54 6f 4e 75 6d 65 72 69 63 20 29 3b 0a 20 20  _ToNumeric );.  
14e70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f      testcase( to
14e80 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 29 3b  _op==OP_ToInt );
14e90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14ea0 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61   to_op==OP_ToRea
14eb0 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  l );.      if( i
14ec0 6e 52 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a  nReg!=target ){.
14ed0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14ee0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14ef0 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61  SCopy, inReg, ta
14f00 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69  rget);.        i
14f10 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20  nReg = target;. 
14f20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
14f30 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
14f40 2c 20 74 6f 5f 6f 70 2c 20 69 6e 52 65 67 29 3b  , to_op, inReg);
14f50 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14f60 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63   usedAsColumnCac
14f70 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67  he(pParse, inReg
14f80 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20 20 20  , inReg) );.    
14f90 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
14fa0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
14fb0 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20  (pParse, inReg, 
14fc0 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
14fd0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
14fe0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
14ff0 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  T */.    case TK
15000 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
15010 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
15020 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
15030 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
15040 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
15050 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 72 31 20  _EQ: {.      r1 
15060 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
15070 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
15080 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
15090 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
150a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
150b0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
150c0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
150d0 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
150e0 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
150f0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
15100 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
15110 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
15120 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69         r1, r2, i
15130 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f  nReg, SQLITE_STO
15140 52 45 50 32 29 3b 0a 20 20 20 20 20 20 61 73 73  REP2);.      ass
15150 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  ert(TK_LT==OP_Lt
15160 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
15170 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Lt); VdbeCove
15180 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
15190 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Lt);.      asser
151a0 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b  t(TK_LE==OP_Le);
151b0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
151c0 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Le); VdbeCovera
151d0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65  geIf(v,op==OP_Le
151e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
151f0 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74  TK_GT==OP_Gt); t
15200 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
15210 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
15220 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b  If(v,op==OP_Gt);
15230 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
15240 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73  _GE==OP_Ge); tes
15250 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29  tcase(op==OP_Ge)
15260 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
15270 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20  (v,op==OP_Ge);. 
15280 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45       assert(TK_E
15290 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63  Q==OP_Eq); testc
152a0 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20  ase(op==OP_Eq); 
152b0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
152c0 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20  ,op==OP_Eq);.   
152d0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d     assert(TK_NE=
152e0 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ne); testcas
152f0 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64  e(op==OP_Ne); Vd
15300 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
15310 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20  p==OP_Ne);.     
15320 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
15330 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
15340 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
15350 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
15360 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
15370 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
15380 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b  case TK_ISNOT: {
15390 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
153a0 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20   op==TK_IS );.  
153b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
153c0 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20  ==TK_ISNOT );.  
153d0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
153e0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
153f0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
15400 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
15410 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
15420 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
15430 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
15440 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
15450 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d  .      op = (op=
15460 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20  =TK_IS) ? TK_EQ 
15470 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 63  : TK_NE;.      c
15480 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
15490 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
154a0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
154b0 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
154c0 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e        r1, r2, in
154d0 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52  Reg, SQLITE_STOR
154e0 45 50 32 20 7c 20 53 51 4c 49 54 45 5f 4e 55 4c  EP2 | SQLITE_NUL
154f0 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  LEQ);.      Vdbe
15500 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
15510 3d 3d 54 4b 5f 45 51 29 3b 0a 20 20 20 20 20 20  ==TK_EQ);.      
15520 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
15530 2c 20 6f 70 3d 3d 54 4b 5f 4e 45 29 3b 0a 20 20  , op==TK_NE);.  
15540 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
15550 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
15560 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
15570 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
15580 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
15590 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a     case TK_AND:.
155a0 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a      case TK_OR:.
155b0 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53      case TK_PLUS
155c0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
155d0 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AR:.    case TK_
155e0 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20  MINUS:.    case 
155f0 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65  TK_REM:.    case
15600 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20   TK_BITAND:.    
15610 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20  case TK_BITOR:. 
15620 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48     case TK_SLASH
15630 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  :.    case TK_LS
15640 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54  HIFT:.    case T
15650 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63  K_RSHIFT: .    c
15660 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b  ase TK_CONCAT: {
15670 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
15680 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b  K_AND==OP_And );
15690 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
156a0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44  case( op==TK_AND
156b0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
156c0 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29  ( TK_OR==OP_Or )
156d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ;              t
156e0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
156f0 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OR );.      asse
15700 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f  rt( TK_PLUS==OP_
15710 41 64 64 20 29 3b 20 20 20 20 20 20 20 20 20 20  Add );          
15720 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
15730 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20 20  K_PLUS );.      
15740 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53  assert( TK_MINUS
15750 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b  ==OP_Subtract );
15760 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
15770 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20  p==TK_MINUS );. 
15780 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
15790 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65  REM==OP_Remainde
157a0 72 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61  r );      testca
157b0 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29  se( op==TK_REM )
157c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
157d0 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69  TK_BITAND==OP_Bi
157e0 74 41 6e 64 20 29 3b 20 20 20 20 20 20 74 65 73  tAnd );      tes
157f0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49  tcase( op==TK_BI
15800 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73  TAND );.      as
15810 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d  sert( TK_BITOR==
15820 4f 50 5f 42 69 74 4f 72 20 29 3b 20 20 20 20 20  OP_BitOr );     
15830 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
15840 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20  =TK_BITOR );.   
15850 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c     assert( TK_SL
15860 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29  ASH==OP_Divide )
15870 3b 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;       testcase
15880 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29  ( op==TK_SLASH )
15890 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
158a0 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68  TK_LSHIFT==OP_Sh
158b0 69 66 74 4c 65 66 74 20 29 3b 20 20 20 74 65 73  iftLeft );   tes
158c0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53  tcase( op==TK_LS
158d0 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73  HIFT );.      as
158e0 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d  sert( TK_RSHIFT=
158f0 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20 29  =OP_ShiftRight )
15900 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ;  testcase( op=
15910 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20  =TK_RSHIFT );.  
15920 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43      assert( TK_C
15930 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74  ONCAT==OP_Concat
15940 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73   );      testcas
15950 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54  e( op==TK_CONCAT
15960 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
15970 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
15980 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
15990 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
159a0 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
159b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
159c0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
159d0 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
159e0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree2);.      sql
159f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
15a00 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61  , op, r2, r1, ta
15a10 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73  rget);.      tes
15a20 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
15a30 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
15a40 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
15a50 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
15a60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
15a70 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20   TK_UMINUS: {.  
15a80 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
15a90 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
15aa0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
15ab0 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  eft );.      if(
15ac0 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49   pLeft->op==TK_I
15ad0 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20  NTEGER ){.      
15ae0 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50    codeInteger(pP
15af0 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20  arse, pLeft, 1, 
15b00 74 61 72 67 65 74 29 3b 0a 23 69 66 6e 64 65 66  target);.#ifndef
15b10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
15b20 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
15b30 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66    }else if( pLef
15b40 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
15b50 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
15b60 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
15b70 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
15b80 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
15b90 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70     codeReal(v, p
15ba0 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Left->u.zToken, 
15bb0 31 2c 20 74 61 72 67 65 74 29 3b 0a 23 65 6e 64  1, target);.#end
15bc0 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  if.      }else{.
15bd0 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 6f 70          tempX.op
15be0 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20   = TK_INTEGER;. 
15bf0 20 20 20 20 20 20 20 74 65 6d 70 58 2e 66 6c 61         tempX.fla
15c00 67 73 20 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs = EP_IntValue
15c10 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20  |EP_TokenOnly;. 
15c20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 75 2e 69         tempX.u.i
15c30 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 20  Value = 0;.     
15c40 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
15c50 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
15c60 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67  se, &tempX, &reg
15c70 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
15c80 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
15c90 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
15ca0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
15cb0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
15cc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15cd0 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72  dOp3(v, OP_Subtr
15ce0 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72  act, r2, r1, tar
15cf0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65  get);.        te
15d00 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
15d10 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ==0 );.      }. 
15d20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72       inReg = tar
15d30 67 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  get;.      break
15d40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
15d50 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20   TK_BITNOT:.    
15d60 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
15d70 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
15d80 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f  BITNOT==OP_BitNo
15d90 74 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28  t );   testcase(
15da0 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29   op==TK_BITNOT )
15db0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15dc0 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29  TK_NOT==OP_Not )
15dd0 3b 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;         testca
15de0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29  se( op==TK_NOT )
15df0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
15e00 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
15e10 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
15e20 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
15e30 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
15e40 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
15e50 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  ;.      inReg = 
15e60 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 73 71  target;.      sq
15e70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15e80 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65 67  v, op, r1, inReg
15e90 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15ea0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
15eb0 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
15ec0 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
15ed0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
15ee0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
15ef0 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e  K_ISNULL==OP_IsN
15f00 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73  ull );   testcas
15f10 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  e( op==TK_ISNULL
15f20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
15f30 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50  ( TK_NOTNULL==OP
15f40 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74  _NotNull ); test
15f50 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
15f60 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71  NULL );.      sq
15f70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15f80 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
15f90 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
15fa0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
15fb0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
15fc0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
15fd0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
15fe0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
15ff0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
16000 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
16010 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c  dbeAddOp1(v, op,
16020 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65   r1);.      Vdbe
16030 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
16040 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20  ==TK_ISNULL);.  
16050 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
16060 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  If(v, op==TK_NOT
16070 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
16080 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16090 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72  , OP_AddImm, tar
160a0 67 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  get, -1);.      
160b0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
160c0 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
160d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
160e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
160f0 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
16100 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66     AggInfo *pInf
16110 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49  o = pExpr->pAggI
16120 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nfo;.      if( p
16130 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Info==0 ){.     
16140 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
16150 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
16160 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
16170 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
16180 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
16190 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67  e, "misuse of ag
161a0 67 72 65 67 61 74 65 3a 20 25 73 28 29 22 2c 20  gregate: %s()", 
161b0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
161c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
161d0 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70         inReg = p
161e0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70  Info->aFunc[pExp
161f0 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20  r->iAgg].iMem;. 
16200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
16210 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
16220 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
16230 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
16240 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f   *pFarg;       /
16250 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69  * List of functi
16260 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
16270 20 20 20 20 20 20 69 6e 74 20 6e 46 61 72 67 3b        int nFarg;
16280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16290 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e 63 74 69  Number of functi
162a0 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
162b0 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
162c0 44 65 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Def;         /* 
162d0 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66  The function def
162e0 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a  inition object *
162f0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b  /.      int nId;
16300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16310 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  * Length of the 
16320 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 69 6e  function name in
16330 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20   bytes */.      
16340 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b  const char *zId;
16350 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75         /* The fu
16360 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
16370 20 20 20 20 20 75 33 32 20 63 6f 6e 73 74 4d 61       u32 constMa
16380 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d  sk = 0;     /* M
16390 61 73 6b 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ask of function 
163a0 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74 20 61  arguments that a
163b0 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20  re constant */. 
163c0 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
163d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
163e0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
163f0 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e       u8 enc = EN
16400 43 28 64 62 29 3b 20 20 20 20 20 20 2f 2a 20 54  C(db);      /* T
16410 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  he text encoding
16420 20 75 73 65 64 20 62 79 20 74 68 69 73 20 64 61   used by this da
16430 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  tabase */.      
16440 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
16450 20 30 3b 20 20 20 20 2f 2a 20 41 20 63 6f 6c 6c   0;    /* A coll
16460 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a  ating sequence *
16470 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  /..      assert(
16480 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
16490 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
164a0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
164b0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
164c0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
164d0 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  kenOnly) ){.    
164e0 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b 0a 20      pFarg = 0;. 
164f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16500 20 20 20 20 70 46 61 72 67 20 3d 20 70 45 78 70      pFarg = pExp
16510 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
16520 20 20 7d 0a 20 20 20 20 20 20 6e 46 61 72 67 20    }.      nFarg 
16530 3d 20 70 46 61 72 67 20 3f 20 70 46 61 72 67 2d  = pFarg ? pFarg-
16540 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20  >nExpr : 0;.    
16550 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
16560 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
16570 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
16580 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 70 45  ;.      zId = pE
16590 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
165a0 20 20 20 20 20 6e 49 64 20 3d 20 73 71 6c 69 74       nId = sqlit
165b0 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 64 29 3b  e3Strlen30(zId);
165c0 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71  .      pDef = sq
165d0 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
165e0 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20  n(db, zId, nId, 
165f0 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a  nFarg, enc, 0);.
16600 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d        if( pDef==
16610 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
16620 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
16630 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75  rse, "unknown fu
16640 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 28 29 22 2c  nction: %.*s()",
16650 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20   nId, zId);.    
16660 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
16670 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74   }..      /* Att
16680 65 6d 70 74 20 61 20 64 69 72 65 63 74 20 69 6d  empt a direct im
16690 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
166a0 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41  the built-in COA
166b0 4c 45 53 43 45 28 29 20 61 6e 64 0a 20 20 20 20  LESCE() and.    
166c0 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75    ** IFNULL() fu
166d0 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 61  nctions.  This a
166e0 76 6f 69 64 73 20 75 6e 6e 65 63 65 73 73 61 72  voids unnecessar
166f0 79 20 65 76 61 6c 61 74 69 6f 6e 20 6f 66 0a 20  y evalation of. 
16700 20 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74       ** argument
16710 73 20 70 61 73 74 20 74 68 65 20 66 69 72 73 74  s past the first
16720 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65   non-NULL argume
16730 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
16740 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e     if( pDef->fun
16750 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
16760 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b  FUNC_COALESCE ){
16770 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 6e 64  .        int end
16780 43 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c 69 74  Coalesce = sqlit
16790 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
167a0 76 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  v);.        asse
167b0 72 74 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a  rt( nFarg>=2 );.
167c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
167d0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
167e0 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
167f0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
16800 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
16810 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Farg; i++){.    
16820 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16830 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f  eAddOp2(v, OP_No
16840 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65  tNull, target, e
16850 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20  ndCoalesce);.   
16860 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
16870 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
16880 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
16890 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
168a0 20 74 61 72 67 65 74 2c 20 31 29 3b 0a 20 20 20   target, 1);.   
168b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
168c0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
168d0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  se);.          s
168e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
168f0 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
16900 69 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  i].pExpr, target
16910 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
16920 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
16930 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20  (pParse, 1);.   
16940 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
16950 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
16960 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61  eLabel(v, endCoa
16970 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20  lesce);.        
16980 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
16990 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 4e 4c        /* The UNL
169a0 49 4b 45 4c 59 28 29 20 66 75 6e 63 74 69 6f 6e  IKELY() function
169b0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68   is a no-op.  Th
169c0 65 20 72 65 73 75 6c 74 20 69 73 20 74 68 65 20  e result is the 
169d0 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 6f  value.      ** o
169e0 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  f the first argu
169f0 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ment..      */. 
16a00 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
16a10 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
16a20 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20  E_FUNC_UNLIKELY 
16a30 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
16a40 74 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b 0a 20  t( nFarg>=1 );. 
16a50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
16a60 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
16a70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
16a80 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
16a90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
16aa0 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  }..      for(i=0
16ab0 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b  ; i<nFarg; i++){
16ac0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 33  .        if( i<3
16ad0 32 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  2 && sqlite3Expr
16ae0 49 73 43 6f 6e 73 74 61 6e 74 28 70 46 61 72 67  IsConstant(pFarg
16af0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
16b00 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
16b10 61 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a 20 20  ase( i==31 );.  
16b20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73          constMas
16b30 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 33 32 28 69  k |= MASKBIT32(i
16b40 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
16b50 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e       if( (pDef->
16b60 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
16b70 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
16b80 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20 29  )!=0 && !pColl )
16b90 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  {.          pCol
16ba0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
16bb0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
16bc0 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  Farg->a[i].pExpr
16bd0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
16be0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
16bf0 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Farg ){.        
16c00 69 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20 29 7b  if( constMask ){
16c10 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20  .          r1 = 
16c20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
16c30 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
16c40 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72 67 3b  ->nMem += nFarg;
16c50 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
16c60 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 73            r1 = s
16c70 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
16c80 67 65 28 70 50 61 72 73 65 2c 20 6e 46 61 72 67  ge(pParse, nFarg
16c90 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
16ca0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e        /* For len
16cb0 67 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f 66  gth() and typeof
16cc0 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74  () functions wit
16cd0 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d  h a column argum
16ce0 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ent,.        ** 
16cf0 73 65 74 20 74 68 65 20 50 35 20 70 61 72 61 6d  set the P5 param
16d00 65 74 65 72 20 74 6f 20 74 68 65 20 4f 50 5f 43  eter to the OP_C
16d10 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20  olumn opcode to 
16d20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
16d30 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f  .        ** or O
16d40 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20  PFLAG_TYPEOFARG 
16d50 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 74 6f  respectively, to
16d60 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61   avoid unnecessa
16d70 72 79 20 64 61 74 61 0a 20 20 20 20 20 20 20 20  ry data.        
16d80 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20  ** loading..    
16d90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
16da0 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  f( (pDef->funcFl
16db0 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46 55  ags & (SQLITE_FU
16dc0 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45  NC_LENGTH|SQLITE
16dd0 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d  _FUNC_TYPEOF))!=
16de0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
16df0 38 20 65 78 70 72 4f 70 3b 0a 20 20 20 20 20 20  8 exprOp;.      
16e00 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72      assert( nFar
16e10 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  g==1 );.        
16e20 20 20 61 73 73 65 72 74 28 20 70 46 61 72 67 2d    assert( pFarg-
16e30 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29  >a[0].pExpr!=0 )
16e40 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 72  ;.          expr
16e50 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d  Op = pFarg->a[0]
16e60 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20  .pExpr->op;.    
16e70 20 20 20 20 20 20 69 66 28 20 65 78 70 72 4f 70        if( exprOp
16e80 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65  ==TK_COLUMN || e
16e90 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  xprOp==TK_AGG_CO
16ea0 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
16eb0 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49      assert( SQLI
16ec0 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d  TE_FUNC_LENGTH==
16ed0 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
16ee0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
16ef0 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46  assert( SQLITE_F
16f00 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c  UNC_TYPEOF==OPFL
16f10 41 47 5f 54 59 50 45 4f 46 41 52 47 20 29 3b 0a  AG_TYPEOFARG );.
16f20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
16f30 63 61 73 65 28 20 70 44 65 66 2d 3e 66 75 6e 63  case( pDef->func
16f40 46 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 4c  Flags & OPFLAG_L
16f50 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20  ENGTHARG );.    
16f60 20 20 20 20 20 20 20 20 70 46 61 72 67 2d 3e 61          pFarg->a
16f70 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d  [0].pExpr->op2 =
16f80 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
16f90 20 20 20 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c      pDef->funcFl
16fa0 61 67 73 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45  ags & (OPFLAG_LE
16fb0 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54  NGTHARG|OPFLAG_T
16fc0 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20  YPEOFARG);.     
16fd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
16fe0 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
16ff0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
17000 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 54  Parse);     /* T
17010 69 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34  icket 2ea2425d34
17020 62 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  be */.        sq
17030 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
17040 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 46  rList(pParse, pF
17050 61 72 67 2c 20 72 31 2c 20 0a 20 20 20 20 20 20  arg, r1, .      
17060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17070 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
17080 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49 54 45  _ECEL_DUP|SQLITE
17090 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b 0a 20  _ECEL_FACTOR);. 
170a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
170b0 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
170c0 65 2c 20 31 29 3b 20 20 20 2f 2a 20 54 69 63 6b  e, 1);   /* Tick
170d0 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65 20  et 2ea2425d34be 
170e0 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  */.      }else{.
170f0 20 20 20 20 20 20 20 20 72 31 20 3d 20 30 3b 0a          r1 = 0;.
17100 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
17110 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
17120 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f  UALTABLE.      /
17130 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c  * Possibly overl
17140 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  oad the function
17150 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72   if the first ar
17160 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20  gument is.      
17170 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ** a virtual tab
17180 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  le column..     
17190 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72   **.      ** For
171a0 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
171b0 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45   (LIKE, GLOB, RE
171c0 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29  GEXP, and MATCH)
171d0 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a   use the.      *
171e0 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  * second argumen
171f0 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74  t, not the first
17200 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e  , as the argumen
17210 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20  t to test to.   
17220 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
17230 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61  is a column in a
17240 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
17250 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
17260 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74  cause.      ** t
17270 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
17280 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  of infix functio
17290 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20  ns (the operand 
172a0 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20  we want to.     
172b0 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72   ** control over
172c0 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70  loading) ends up
172d0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
172e0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  rgument to the. 
172f0 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
17300 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  .  The expressio
17310 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20  n "A glob B" is 
17320 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20  equivalent to . 
17330 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c       ** "glob(B,
17340 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20  A).  We want to 
17350 75 73 65 20 74 68 65 20 41 20 69 6e 20 22 41 20  use the A in "A 
17360 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a  glob B" to test.
17370 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e        ** for fun
17380 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e  ction overloadin
17390 67 2e 20 20 42 75 74 20 77 65 20 75 73 65 20 74  g.  But we use t
173a0 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c  he B term in "gl
173b0 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20  ob(B,A)"..      
173c0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61  */.      if( nFa
173d0 72 67 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d  rg>=2 && (pExpr-
173e0 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69  >flags & EP_Infi
173f0 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  xFunc) ){.      
17400 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
17410 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
17420 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
17430 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31  Farg, pFarg->a[1
17440 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
17450 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72 67 3e  }else if( nFarg>
17460 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
17470 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
17480 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
17490 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c  db, pDef, nFarg,
174a0 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
174b0 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  pr);.      }.#en
174c0 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 44  dif.      if( pD
174d0 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
174e0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
174f0 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  COLL ){.        
17500 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
17510 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
17520 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c  ll; .        sql
17530 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
17540 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c  , OP_CollSeq, 0,
17550 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
17560 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
17570 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17580 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17590 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f  p4(v, OP_Functio
175a0 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31  n, constMask, r1
175b0 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20  , target,.      
175c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175d0 20 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50    (char*)pDef, P
175e0 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
175f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
17600 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61  ngeP5(v, (u8)nFa
17610 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  rg);.      if( n
17620 46 61 72 67 20 26 26 20 63 6f 6e 73 74 4d 61 73  Farg && constMas
17630 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
17640 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
17650 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
17660 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20  r1, nFarg);.    
17670 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
17680 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
17690 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
176a0 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
176b0 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65  EXISTS:.    case
176c0 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
176d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
176e0 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20  ==TK_EXISTS );. 
176f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
17700 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
17710 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
17720 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
17730 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
17740 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
17750 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
17760 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
17770 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61      int destIfFa
17780 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lse = sqlite3Vdb
17790 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
177a0 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
177b0 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
177c0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
177d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
177e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
177f0 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
17800 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17810 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
17820 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73  Expr, destIfFals
17830 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  e, destIfNull);.
17840 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17850 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
17860 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74  teger, 1, target
17870 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17880 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
17890 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  (v, destIfFalse)
178a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
178b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
178c0 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20  AddImm, target, 
178d0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
178e0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
178f0 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  l(v, destIfNull)
17900 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
17910 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
17920 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
17930 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a  ERY */...    /*.
17940 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57      **    x BETW
17950 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20  EEN y AND z.    
17960 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  **.    ** This i
17970 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a  s equivalent to.
17980 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
17990 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20   x>=y AND x<=z. 
179a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69     **.    ** X i
179b0 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  s stored in pExp
179c0 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a  r->pLeft..    **
179d0 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   Y is stored in 
179e0 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
179f0 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a  0].pExpr..    **
17a00 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   Z is stored in 
17a10 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
17a20 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f  1].pExpr..    */
17a30 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
17a40 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  WEEN: {.      Ex
17a50 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
17a60 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
17a70 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
17a80 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70  item *pLItem = p
17a90 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
17aa0 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  ;.      Expr *pR
17ab0 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70  ight = pLItem->p
17ac0 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 72 31 20  Expr;..      r1 
17ad0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
17ae0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c  eTemp(pParse, pL
17af0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
17b00 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
17b10 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
17b20 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
17b30 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
17b40 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
17b50 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
17b60 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
17b70 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
17b80 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r3 = sqlite3GetT
17b90 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
17ba0 20 20 20 20 20 20 72 34 20 3d 20 73 71 6c 69 74        r4 = sqlit
17bb0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
17bc0 72 73 65 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  rse);.      code
17bd0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
17be0 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
17bf0 50 5f 47 65 2c 0a 20 20 20 20 20 20 20 20 20 20  P_Ge,.          
17c00 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
17c10 72 33 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  r3, SQLITE_STORE
17c20 50 32 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61  P2);  VdbeCovera
17c30 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 4c 49  ge(v);.      pLI
17c40 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69  tem++;.      pRi
17c50 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45  ght = pLItem->pE
17c60 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
17c70 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
17c80 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
17c90 32 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  2);.      r2 = s
17ca0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
17cb0 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  mp(pParse, pRigh
17cc0 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
17cd0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
17ce0 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
17cf0 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
17d00 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
17d10 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 72 31  Right, OP_Le, r1
17d20 2c 20 72 32 2c 20 72 34 2c 20 53 51 4c 49 54 45  , r2, r4, SQLITE
17d30 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20  _STOREP2);.     
17d40 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
17d50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
17d60 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
17d70 41 6e 64 2c 20 72 33 2c 20 72 34 2c 20 74 61 72  And, r3, r4, tar
17d80 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  get);.      sqli
17d90 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
17da0 67 28 70 50 61 72 73 65 2c 20 72 33 29 3b 0a 20  g(pParse, r3);. 
17db0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
17dc0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
17dd0 65 2c 20 72 34 29 3b 0a 20 20 20 20 20 20 62 72  e, r4);.      br
17de0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
17df0 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20  ase TK_COLLATE: 
17e00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
17e10 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65  US: {.      inRe
17e20 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
17e30 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
17e40 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
17e50 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
17e60 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
17e70 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52   case TK_TRIGGER
17e80 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  : {.      /* If 
17e90 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b  the opcode is TK
17ea0 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74  _TRIGGER, then t
17eb0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
17ec0 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20   a reference.   
17ed0 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d     ** to a colum
17ee0 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f  n in the new.* o
17ef0 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  r old.* pseudo-t
17f00 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20  ables available 
17f10 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67  to.      ** trig
17f20 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e  ger programs. In
17f30 20 74 68 69 73 20 63 61 73 65 20 45 78 70 72 2e   this case Expr.
17f40 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  iTable is set to
17f50 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20   1 for the.     
17f60 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f   ** new.* pseudo
17f70 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72  -table, or 0 for
17f80 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64   the old.* pseud
17f90 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43  o-table. Expr.iC
17fa0 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69  olumn.      ** i
17fb0 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c  s set to the col
17fc0 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64  umn of the pseud
17fd0 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c  o-table to read,
17fe0 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20   or to -1 to.   
17ff0 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72     ** read the r
18000 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20  owid field..    
18010 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
18020 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
18030 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
18040 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70  g an OP_Param op
18050 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20 20  code. The p1.   
18060 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20     ** parameter 
18070 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72 20  is set to 0 for 
18080 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66  an old.rowid ref
18090 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69  erence, or to (i
180a0 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  +1).      ** to 
180b0 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68 65  reference anothe
180c0 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  r column of the 
180d0 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
180e0 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20 20  le, where .     
180f0 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64   ** i is the ind
18100 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
18110 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69  . For a new.rowi
18120 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31 20  d reference, p1 
18130 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20  is.      ** set 
18140 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65 20  to (n+1), where 
18150 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
18160 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61  of columns in ea
18170 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e  ch pseudo-table.
18180 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20  .      ** For a 
18190 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79  reference to any
181a0 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e   other column in
181b0 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75 64   the new.* pseud
181c0 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20 20  o-table, p1.    
181d0 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 28    ** is set to (
181e0 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e 20  n+2+i), where n 
181f0 61 6e 64 20 69 20 61 72 65 20 61 73 20 64 65 66  and i are as def
18200 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79 2e  ined previously.
18210 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65 78   For.      ** ex
18220 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61  ample, if the ta
18230 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72 69  ble on which tri
18240 67 67 65 72 73 20 61 72 65 20 62 65 69 6e 67 20  ggers are being 
18250 66 69 72 65 64 20 69 73 0a 20 20 20 20 20 20 2a  fired is.      *
18260 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a 20  * declared as:. 
18270 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
18280 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
18290 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t1(a, b);.      
182a0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e  **.      ** Then
182b0 20 70 31 20 69 73 20 69 6e 74 65 72 70 72 65 74   p1 is interpret
182c0 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  ed as follows:. 
182d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
182e0 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20     p1==0   ->   
182f0 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20 70   old.rowid     p
18300 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==3   ->    new
18310 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20  .rowid.      ** 
18320 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20    p1==1   ->    
18330 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70 31  old.a         p1
18340 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e  ==4   ->    new.
18350 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d  a.      **   p1=
18360 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62  =2   ->    old.b
18370 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20 20           p1==5  
18380 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20 20   ->    new.b    
18390 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20     .      */.   
183a0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
183b0 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20   pExpr->pTab;.  
183c0 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78      int p1 = pEx
183d0 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54  pr->iTable * (pT
183e0 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20  ab->nCol+1) + 1 
183f0 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  + pExpr->iColumn
18400 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
18410 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
18420 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  0 || pExpr->iTab
18430 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61  le==1 );.      a
18440 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43  ssert( pExpr->iC
18450 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78  olumn>=-1 && pEx
18460 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62  pr->iColumn<pTab
18470 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ->nCol );.      
18480 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50  assert( pTab->iP
18490 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e  Key<0 || pExpr->
184a0 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69  iColumn!=pTab->i
184b0 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73  PKey );.      as
184c0 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70  sert( p1>=0 && p
184d0 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b  1<(pTab->nCol*2+
184e0 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  2) );..      sql
184f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18500 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20  , OP_Param, p1, 
18510 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56  target);.      V
18520 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
18530 25 73 2e 25 73 20 2d 3e 20 24 25 64 22 2c 0a 20  %s.%s -> $%d",. 
18540 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69         (pExpr->i
18550 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20  Table ? "new" : 
18560 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20 20 20  "old"),.        
18570 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c  (pExpr->iColumn<
18580 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70 45  0 ? "rowid" : pE
18590 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  xpr->pTab->aCol[
185a0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
185b0 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  zName),.        
185c0 74 61 72 67 65 74 0a 20 20 20 20 20 20 29 29 3b  target.      ));
185d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
185e0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
185f0 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49 66  OINT.      /* If
18600 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20   the column has 
18610 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69  REAL affinity, i
18620 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20  t may currently 
18630 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 6e 0a  be stored as an.
18640 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72        ** integer
18650 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41 66 66  . Use OP_RealAff
18660 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 73 75  inity to make su
18670 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20  re it is really 
18680 72 65 61 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20  real.  */.      
18690 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
186a0 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26  mn>=0 .       &&
186b0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70   pTab->aCol[pExp
186c0 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  r->iColumn].affi
186d0 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
186e0 5f 52 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20  _REAL.      ){. 
186f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18700 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
18710 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74 61 72  ealAffinity, tar
18720 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  get);.      }.#e
18730 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b  ndif.      break
18740 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a  ;.    }...    /*
18750 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a  .    ** Form A:.
18760 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20      **   CASE x 
18770 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20  WHEN e1 THEN r1 
18780 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20  WHEN e2 THEN r2 
18790 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e  ... WHEN eN THEN
187a0 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
187b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
187c0 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  m B:.    **   CA
187d0 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20  SE WHEN e1 THEN 
187e0 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
187f0 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
18800 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
18810 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
18820 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65  Form A is can be
18830 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   transformed int
18840 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  o the equivalent
18850 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f   form B as follo
18860 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53  ws:.    **   CAS
18870 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e  E WHEN x=e1 THEN
18880 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48   r1 WHEN x=e2 TH
18890 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a  EN r2 ....    **
188a0 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65          WHEN x=e
188b0 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
188c0 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
188d0 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69 73  ** X (if it exis
188e0 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d  ts) is in pExpr-
188f0 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
18900 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73 74 20   is in the last 
18910 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78 70 72  element of pExpr
18920 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70 45 78  ->x.pList if pEx
18930 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
18940 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64 64  pr is.    ** odd
18950 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f  .  The Y is also
18960 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74   optional.  If t
18970 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
18980 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73 74  ments in x.pList
18990 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65 6e 2c  .    ** is even,
189a0 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69 74 74   then Y is omitt
189b0 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74 68 65  ed and the "othe
189c0 72 77 69 73 65 22 20 72 65 73 75 6c 74 20 69 73  rwise" result is
189d0 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69   NULL..    ** Ei
189e0 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c   is in pExpr->pL
189f0 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20  ist->a[i*2] and 
18a00 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69  Ri is pExpr->pLi
18a10 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20  st->a[i*2+1]..  
18a20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
18a30 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78  result of the ex
18a40 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
18a50 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  Ri for the first
18a60 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20   matching Ei,.  
18a70 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65    ** or if there
18a80 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20   is no matching 
18a90 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72  Ei, the ELSE ter
18aa0 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65  m Y, or if there
18ab0 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c   is.    ** no EL
18ac0 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20  SE term, NULL.. 
18ad0 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
18ae0 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  t: assert( op==T
18af0 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20 20  K_CASE ); {.    
18b00 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20    int endLabel; 
18b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65      /* GOTO labe
18b30 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53  l for end of CAS
18b40 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20  E stmt */.      
18b50 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20  int nextCase;   
18b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b70 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20    /* GOTO label 
18b80 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c  for next WHEN cl
18b90 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
18ba0 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20  t nExpr;        
18bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bc0 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20  /* 2x number of 
18bd0 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
18be0 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
18bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c00 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
18c10 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45  unter */.      E
18c20 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
18c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c40 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e   /* List of WHEN
18c50 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
18c60 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
18c70 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b  item *aListelem;
18c80 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48    /* Array of WH
18c90 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
18ca0 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65    Expr opCompare
18cb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18cc0 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69      /* The X==Ei
18cd0 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
18ce0 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20       Expr *pX;  
18cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20         /* The X 
18d10 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
18d20 20 20 20 20 45 78 70 72 20 2a 70 54 65 73 74 20      Expr *pTest 
18d30 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
18d40 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28        /* X==Ei (
18d50 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20  form A) or just 
18d60 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20  Ei (form B) */. 
18d70 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69       VVA_ONLY( i
18d80 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c 20 3d  nt iCacheLevel =
18d90 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
18da0 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61  evel; )..      a
18db0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
18dc0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
18dd0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26 20  P_xIsSelect) && 
18de0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29  pExpr->x.pList )
18df0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
18e00 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
18e10 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20  Expr > 0);.     
18e20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   pEList = pExpr-
18e30 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
18e40 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69  aListelem = pELi
18e50 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78  st->a;.      nEx
18e60 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  pr = pEList->nEx
18e70 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62  pr;.      endLab
18e80 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  el = sqlite3Vdbe
18e90 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
18ea0 20 20 20 20 69 66 28 20 28 70 58 20 3d 20 70 45      if( (pX = pE
18eb0 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29  xpr->pLeft)!=0 )
18ec0 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 20  {.        tempX 
18ed0 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74  = *pX;.        t
18ee0 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d  estcase( pX->op=
18ef0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
18f00 20 20 20 20 20 20 65 78 70 72 54 6f 52 65 67 69        exprToRegi
18f10 73 74 65 72 28 26 74 65 6d 70 58 2c 20 73 71 6c  ster(&tempX, sql
18f20 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
18f30 28 70 50 61 72 73 65 2c 20 70 58 2c 20 26 72 65  (pParse, pX, &re
18f40 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20 20 20  gFree1));.      
18f50 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
18f60 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
18f70 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20     opCompare.op 
18f80 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20  = TK_EQ;.       
18f90 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74   opCompare.pLeft
18fa0 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20 20 20 20   = &tempX;.     
18fb0 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f     pTest = &opCo
18fc0 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20 20 2f  mpare;.        /
18fd0 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64 39 35  * Ticket b351d95
18fe0 66 39 63 64 35 65 66 31 37 65 39 64 39 64 62 61  f9cd5ef17e9d9dba
18ff0 65 31 38 66 35 63 61 38 36 31 31 31 39 30 30 30  e18f5ca861119000
19000 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  1:.        ** Th
19010 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 46 72  e value in regFr
19020 65 65 31 20 6d 69 67 68 74 20 67 65 74 20 53 43  ee1 might get SC
19030 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68 65 20  opy-ed into the 
19040 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20 20  file result..   
19050 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20       ** So make 
19060 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65  sure that the re
19070 67 46 72 65 65 31 20 72 65 67 69 73 74 65 72 20  gFree1 register 
19080 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20 66 6f  is not reused fo
19090 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20  r other.        
190a0 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e 64 20  ** purposes and 
190b0 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77 72 69  possibly overwri
190c0 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20  tten.  */.      
190d0 20 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a    regFree1 = 0;.
190e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
190f0 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 2d 31  r(i=0; i<nExpr-1
19100 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20  ; i=i+2){.      
19110 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
19120 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
19130 20 20 20 20 20 20 20 20 69 66 28 20 70 58 20 29          if( pX )
19140 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
19150 72 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a  rt( pTest!=0 );.
19160 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70            opComp
19170 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69  are.pRight = aLi
19180 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b  stelem[i].pExpr;
19190 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
191a0 20 20 20 20 20 20 20 20 20 20 70 54 65 73 74 20            pTest 
191b0 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  = aListelem[i].p
191c0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Expr;.        }.
191d0 20 20 20 20 20 20 20 20 6e 65 78 74 43 61 73 65          nextCase
191e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
191f0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
19200 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
19210 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  est->op==TK_COLU
19220 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  MN );.        sq
19230 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
19240 28 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20  (pParse, pTest, 
19250 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45  nextCase, SQLITE
19260 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
19270 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19280 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
19290 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
192a0 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73  UMN );.        s
192b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
192c0 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d  Parse, aListelem
192d0 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72  [i+1].pExpr, tar
192e0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  get);.        sq
192f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19300 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65  v, OP_Goto, 0, e
19310 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
19320 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
19330 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
19340 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
19350 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
19360 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a  l(v, nextCase);.
19370 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
19380 28 20 28 6e 45 78 70 72 26 31 29 21 3d 30 20 29  ( (nExpr&1)!=0 )
19390 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
193a0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
193b0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
193c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
193d0 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e  pParse, pEList->
193e0 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45 78 70 72  a[nExpr-1].pExpr
193f0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
19400 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
19410 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31  chePop(pParse, 1
19420 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
19430 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
19440 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19450 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
19460 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19470 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
19480 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
19490 73 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20  se->nErr>0 .    
194a0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
194b0 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69  ->iCacheLevel==i
194c0 43 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20  CacheLevel );.  
194d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
194e0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
194f0 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
19500 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
19510 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19520 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61 73  _TRIGGER.    cas
19530 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20  e TK_RAISE: {.  
19540 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
19550 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
19560 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20  Rollback .      
19570 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61       || pExpr->a
19580 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72  ffinity==OE_Abor
19590 74 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  t.           || 
195a0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
195b0 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20  =OE_Fail.       
195c0 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66      || pExpr->af
195d0 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72  finity==OE_Ignor
195e0 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  e.      );.     
195f0 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70 54   if( !pParse->pT
19600 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20  riggerTab ){.   
19610 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
19620 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
19630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19640 20 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79      "RAISE() may
19650 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69   only be used wi
19660 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70  thin a trigger-p
19670 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20  rogram");.      
19680 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
19690 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
196a0 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
196b0 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20  E_Abort ){.     
196c0 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
196d0 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  rt(pParse);.    
196e0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
196f0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
19700 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
19710 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
19720 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  if( pExpr->affin
19730 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29  ity==OE_Ignore )
19740 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
19750 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20  3VdbeAddOp4(.   
19760 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 48           v, OP_H
19770 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  alt, SQLITE_OK, 
19780 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45  OE_Ignore, 0, pE
19790 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29  xpr->u.zToken,0)
197a0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
197b0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
197c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
197d0 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
197e0 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 53 51  raint(pParse, SQ
197f0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
19800 54 52 49 47 47 45 52 2c 0a 20 20 20 20 20 20 20  TRIGGER,.       
19810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19820 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66         pExpr->af
19830 66 69 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e 75  finity, pExpr->u
19840 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a  .zToken, 0, 0);.
19850 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62        }..      b
19860 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
19870 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  if.  }.  sqlite3
19880 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
19890 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
198a0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
198b0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
198c0 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72  , regFree2);.  r
198d0 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a  eturn inReg;.}..
198e0 2f 2a 0a 2a 2a 20 46 61 63 74 6f 72 20 6f 75 74  /*.** Factor out
198f0 20 74 68 65 20 63 6f 64 65 20 6f 66 20 74 68 65   the code of the
19900 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
19910 6e 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74  n to initializat
19920 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69  ion time..*/.voi
19930 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
19940 65 41 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65  eAtInit(.  Parse
19950 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
19960 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
19970 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
19980 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  ,      /* The ex
19990 70 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65  pression to code
199a0 20 77 68 65 6e 20 74 68 65 20 56 44 42 45 20 69   when the VDBE i
199b0 6e 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20  nitializes */.  
199c0 69 6e 74 20 72 65 67 44 65 73 74 2c 20 20 20 20  int regDest,    
199d0 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76    /* Store the v
199e0 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67  alue in this reg
199f0 69 73 74 65 72 20 2a 2f 0a 20 20 75 38 20 72 65  ister */.  u8 re
19a00 75 73 61 62 6c 65 20 20 20 20 20 20 20 2f 2a 20  usable       /* 
19a10 54 72 75 65 20 69 66 20 74 68 69 73 20 65 78 70  True if this exp
19a20 72 65 73 73 69 6f 6e 20 69 73 20 72 65 75 73 61  ression is reusa
19a30 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ble */.){.  Expr
19a40 4c 69 73 74 20 2a 70 3b 0a 20 20 61 73 73 65 72  List *p;.  asser
19a50 74 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b  t( ConstFactorOk
19a60 28 70 50 61 72 73 65 29 20 29 3b 0a 20 20 70 20  (pParse) );.  p 
19a70 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74  = pParse->pConst
19a80 45 78 70 72 3b 0a 20 20 70 45 78 70 72 20 3d 20  Expr;.  pExpr = 
19a90 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
19aa0 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
19ab0 2c 20 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69  , 0);.  p = sqli
19ac0 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
19ad0 64 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78  d(pParse, p, pEx
19ae0 70 72 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  pr);.  if( p ){.
19af0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
19b00 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
19b10 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70   = &p->a[p->nExp
19b20 72 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d  r-1];.     pItem
19b30 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65  ->u.iConstExprRe
19b40 67 20 3d 20 72 65 67 44 65 73 74 3b 0a 20 20 20  g = regDest;.   
19b50 20 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c    pItem->reusabl
19b60 65 20 3d 20 72 65 75 73 61 62 6c 65 3b 0a 20 20  e = reusable;.  
19b70 7d 0a 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e  }.  pParse->pCon
19b80 73 74 45 78 70 72 20 3d 20 70 3b 0a 7d 0a 0a 2f  stExpr = p;.}../
19b90 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
19ba0 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
19bb0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  n expression and
19bc0 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
19bd0 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67  ts.** into a reg
19be0 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74  ister.  Return t
19bf0 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
19c00 65 72 20 77 68 65 72 65 20 74 68 65 20 72 65 73  er where the res
19c10 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72  ults.** are stor
19c20 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
19c30 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74   register is a t
19c40 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
19c50 72 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 65  r that can be de
19c60 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68  allocated,.** th
19c70 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d  en write its num
19c80 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20  ber into *pReg. 
19c90 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72   If the result r
19ca0 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a  egister is not.*
19cb0 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74  * a temporary, t
19cc0 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f  hen set *pReg to
19cd0 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   zero..**.** If 
19ce0 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74  pExpr is a const
19cf0 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ant, then this r
19d00 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 67 65 6e  outine might gen
19d10 65 72 61 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f  erate this.** co
19d20 64 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 72  de to fill the r
19d30 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 69  egister in the i
19d40 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65  nitialization se
19d50 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ction of the.** 
19d60 56 44 42 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e  VDBE program, in
19d70 20 6f 72 64 65 72 20 74 6f 20 66 61 63 74 6f 72   order to factor
19d80 20 69 74 20 6f 75 74 20 6f 66 20 74 68 65 20 65   it out of the e
19d90 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a  valuation loop..
19da0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
19db0 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65  prCodeTemp(Parse
19dc0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
19dd0 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67  pExpr, int *pReg
19de0 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20 70  ){.  int r2;.  p
19df0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
19e00 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
19e10 78 70 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73  xpr);.  if( Cons
19e20 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
19e30 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 6f  ).   && pExpr->o
19e40 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a 20  p!=TK_REGISTER. 
19e50 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
19e60 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
19e70 6e 28 70 45 78 70 72 29 0a 20 20 29 7b 0a 20 20  n(pExpr).  ){.  
19e80 20 20 45 78 70 72 4c 69 73 74 20 2a 70 20 3d 20    ExprList *p = 
19e90 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
19ea0 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  pr;.    int i;. 
19eb0 20 20 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20     *pReg  = 0;. 
19ec0 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
19ed0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
19ee0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
19ef0 20 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70       for(pItem=p
19f00 2d 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b  ->a, i=p->nExpr;
19f10 20 69 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69   i>0; pItem++, i
19f20 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  --){.        if(
19f30 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65   pItem->reusable
19f40 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
19f50 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45  ompare(pItem->pE
19f60 78 70 72 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30  xpr,pExpr,-1)==0
19f70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
19f80 74 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e 69 43  turn pItem->u.iC
19f90 6f 6e 73 74 45 78 70 72 52 65 67 3b 0a 20 20 20  onstExprReg;.   
19fa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
19fb0 20 20 20 7d 0a 20 20 20 20 72 32 20 3d 20 2b 2b     }.    r2 = ++
19fc0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
19fd0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
19fe0 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20  eAtInit(pParse, 
19ff0 70 45 78 70 72 2c 20 72 32 2c 20 31 29 3b 0a 20  pExpr, r2, 1);. 
1a000 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1a010 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
1a020 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
1a030 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1a040 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
1a050 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31  Parse, pExpr, r1
1a060 29 3b 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72  );.    if( r2==r
1a070 31 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67  1 ){.      *pReg
1a080 20 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = r1;.    }else
1a090 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
1a0a0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1a0b0 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
1a0c0 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20   *pReg = 0;.    
1a0d0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1a0e0 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  2;.}../*.** Gene
1a0f0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
1a100 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70  ill evaluate exp
1a110 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e  ression pExpr an
1a120 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72  d store the.** r
1a130 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
1a140 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  er target.  The 
1a150 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72  results are guar
1a160 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72  anteed to appear
1a170 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20  .** in register 
1a180 74 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  target..*/.void 
1a190 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1a1a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
1a1b0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
1a1c0 74 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69  target){.  int i
1a1d0 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  nReg;..  assert(
1a1e0 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72   target>0 && tar
1a1f0 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65  get<=pParse->nMe
1a200 6d 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  m );.  if( pExpr
1a210 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   && pExpr->op==T
1a220 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20  K_REGISTER ){.  
1a230 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a240 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
1a250 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70  e, OP_Copy, pExp
1a260 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65  r->iTable, targe
1a270 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
1a280 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
1a290 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
1a2a0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
1a2b0 72 67 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72  rget);.    asser
1a2c0 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  t( pParse->pVdbe
1a2d0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
1a2e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1a2f0 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74      if( inReg!=t
1a300 61 72 67 65 74 20 26 26 20 70 50 61 72 73 65 2d  arget && pParse-
1a310 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 20 20  >pVdbe ){.      
1a320 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a330 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  2(pParse->pVdbe,
1a340 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67   OP_SCopy, inReg
1a350 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d  , target);.    }
1a360 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1a370 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
1a380 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65   will evaluate e
1a390 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
1a3a0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a  and store the.**
1a3b0 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
1a3c0 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68  ster target.  Th
1a3d0 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75  e results are gu
1a3e0 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65  aranteed to appe
1a3f0 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  ar.** in registe
1a400 72 20 74 61 72 67 65 74 2e 20 20 49 66 20 74 68  r target.  If th
1a410 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1a420 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74  constant, then t
1a430 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d  his routine.** m
1a440 69 67 68 74 20 63 68 6f 6f 73 65 20 74 6f 20 63  ight choose to c
1a450 6f 64 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ode the expressi
1a460 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c 69 7a 61  on at initializa
1a470 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f  tion time..*/.vo
1a480 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
1a490 64 65 46 61 63 74 6f 72 61 62 6c 65 28 50 61 72  deFactorable(Par
1a4a0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1a4b0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
1a4c0 67 65 74 29 7b 0a 20 20 69 66 28 20 70 50 61 72  get){.  if( pPar
1a4d0 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
1a4e0 72 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  r && sqlite3Expr
1a4f0 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72  IsConstant(pExpr
1a500 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
1a510 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70  ExprCodeAtInit(p
1a520 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
1a530 72 67 65 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  rget, 0);.  }els
1a540 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
1a550 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1a560 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
1a570 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
1a580 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 65  rate code that e
1a590 76 61 6c 75 74 65 73 20 74 68 65 20 67 69 76 65  valutes the give
1a5a0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  n expression and
1a5b0 20 70 75 74 73 20 74 68 65 20 72 65 73 75 6c 74   puts the result
1a5c0 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20  .** in register 
1a5d0 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c  target..**.** Al
1a5e0 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  so make a copy o
1a5f0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1a600 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e   results into an
1a610 6f 74 68 65 72 20 22 63 61 63 68 65 22 20 72 65  other "cache" re
1a620 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f  gister.** and mo
1a630 64 69 66 79 20 74 68 65 20 65 78 70 72 65 73 73  dify the express
1a640 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20  ion so that the 
1a650 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73 20  next time it is 
1a660 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68  evaluated,.** th
1a670 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f  e result is a co
1a680 70 79 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  py of the cache 
1a690 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  register..**.** 
1a6a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1a6b0 75 73 65 64 20 66 6f 72 20 65 78 70 72 65 73 73  used for express
1a6c0 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75 73  ions that are us
1a6d0 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20  ed multiple .** 
1a6e0 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72 65  times.  They are
1a6f0 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20   evaluated once 
1a700 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73 20  and the results 
1a710 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
1a720 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64 2e  n.** are reused.
1a730 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1a740 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65  ExprCodeAndCache
1a750 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1a760 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
1a770 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65   target){.  Vdbe
1a780 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1a790 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b  dbe;.  int iMem;
1a7a0 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ..  assert( targ
1a7b0 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  et>0 );.  assert
1a7c0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1a7d0 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 73 71  REGISTER );.  sq
1a7e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1a7f0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
1a800 67 65 74 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b  get);.  iMem = +
1a810 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1a820 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a830 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 74  p2(v, OP_Copy, t
1a840 61 72 67 65 74 2c 20 69 4d 65 6d 29 3b 0a 20 20  arget, iMem);.  
1a850 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 70  exprToRegister(p
1a860 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a  Expr, iMem);.}..
1a870 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1a880 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
1a890 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65  XPLAIN)./*.** Ge
1a8a0 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d 72  nerate a human-r
1a8b0 65 61 64 61 62 6c 65 20 65 78 70 6c 61 6e 61 74  eadable explanat
1a8c0 69 6f 6e 20 6f 66 20 61 6e 20 65 78 70 72 65 73  ion of an expres
1a8d0 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f  sion tree..*/.vo
1a8e0 69 64 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69  id sqlite3Explai
1a8f0 6e 45 78 70 72 28 56 64 62 65 20 2a 70 4f 75 74  nExpr(Vdbe *pOut
1a900 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
1a910 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
1a920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1a930 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20  he opcode being 
1a940 63 6f 64 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  coded */.  const
1a950 20 63 68 61 72 20 2a 7a 42 69 6e 4f 70 20 3d 20   char *zBinOp = 
1a960 30 3b 20 20 20 2f 2a 20 42 69 6e 61 72 79 20 6f  0;   /* Binary o
1a970 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 63 6f 6e  perator */.  con
1a980 73 74 20 63 68 61 72 20 2a 7a 55 6e 69 4f 70 20  st char *zUniOp 
1a990 3d 20 30 3b 20 20 20 2f 2a 20 55 6e 61 72 79 20  = 0;   /* Unary 
1a9a0 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 66  operator */.  if
1a9b0 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ( pExpr==0 ){.  
1a9c0 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a    op = TK_NULL;.
1a9d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20    }else{.    op 
1a9e0 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d  = pExpr->op;.  }
1a9f0 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
1aa00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
1aa10 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
1aa20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1aa30 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 41 47 47  rintf(pOut, "AGG
1aa40 7b 25 64 3a 25 64 7d 22 2c 0a 20 20 20 20 20 20  {%d:%d}",.      
1aa50 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
1aa60 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ble, pExpr->iCol
1aa70 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  umn);.      brea
1aa80 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1aa90 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
1aaa0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
1aab0 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20  iTable<0 ){.    
1aac0 20 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79      /* This only
1aad0 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f   happens when co
1aae0 64 69 6e 67 20 63 68 65 63 6b 20 63 6f 6e 73 74  ding check const
1aaf0 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  raints */.      
1ab00 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1ab10 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 43 4f  Printf(pOut, "CO
1ab20 4c 55 4d 4e 28 25 64 29 22 2c 20 70 45 78 70 72  LUMN(%d)", pExpr
1ab30 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
1ab40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1ab50 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1ab60 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 7b 25 64  rintf(pOut, "{%d
1ab70 3a 25 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 20  :%d}",.         
1ab80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab90 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
1aba0 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  e, pExpr->iColum
1abb0 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
1abc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1abd0 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
1abe0 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ER: {.      if( 
1abf0 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
1ac00 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20  P_IntValue ){.  
1ac10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1ac20 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1ac30 20 22 25 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e   "%d", pExpr->u.
1ac40 69 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d  iValue);.      }
1ac50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
1ac60 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1ac70 74 66 28 70 4f 75 74 2c 20 22 25 73 22 2c 20 70  tf(pOut, "%s", p
1ac80 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
1ac90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1aca0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
1acb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1acc0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
1acd0 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
1ace0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1acf0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1ad00 4f 75 74 2c 22 25 73 22 2c 20 70 45 78 70 72 2d  Out,"%s", pExpr-
1ad10 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
1ad20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1ad30 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
1ad40 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
1ad50 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1ad60 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25 51 22  Printf(pOut,"%Q"
1ad70 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1ad80 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
1ad90 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1ada0 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  TK_NULL: {.     
1adb0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1adc0 72 69 6e 74 66 28 70 4f 75 74 2c 22 4e 55 4c 4c  rintf(pOut,"NULL
1add0 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
1ade0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1adf0 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f  QLITE_OMIT_BLOB_
1ae00 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65  LITERAL.    case
1ae10 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20   TK_BLOB: {.    
1ae20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1ae30 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25 73 22  Printf(pOut,"%s"
1ae40 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1ae50 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
1ae60 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1ae70 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
1ae80 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LE: {.      sqli
1ae90 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1aea0 28 70 4f 75 74 2c 22 56 41 52 49 41 42 4c 45 28  (pOut,"VARIABLE(
1aeb0 25 73 2c 25 64 29 22 2c 0a 20 20 20 20 20 20 20  %s,%d)",.       
1aec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aed0 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f      pExpr->u.zTo
1aee0 6b 65 6e 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ken, pExpr->iCol
1aef0 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  umn);.      brea
1af00 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1af10 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b  e TK_REGISTER: {
1af20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1af30 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1af40 2c 22 52 45 47 49 53 54 45 52 28 25 64 29 22 2c  ,"REGISTER(%d)",
1af50 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b   pExpr->iTable);
1af60 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1af70 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1af80 41 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AS: {.      sqli
1af90 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
1afa0 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  Out, pExpr->pLef
1afb0 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
1afc0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1afd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a  QLITE_OMIT_CAST.
1afe0 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54      case TK_CAST
1aff0 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70  : {.      /* Exp
1b000 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
1b010 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65  form:   CAST(pLe
1b020 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a  ft AS token) */.
1b030 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1b040 20 2a 7a 41 66 66 20 3d 20 22 75 6e 6b 22 3b 0a   *zAff = "unk";.
1b050 20 20 20 20 20 20 73 77 69 74 63 68 28 20 73 71        switch( sq
1b060 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
1b070 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  e(pExpr->u.zToke
1b080 6e 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  n, 0) ){.       
1b090 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
1b0a0 5f 54 45 58 54 3a 20 20 20 20 7a 41 66 66 20 3d  _TEXT:    zAff =
1b0b0 20 22 54 45 58 54 22 3b 20 20 20 20 20 62 72 65   "TEXT";     bre
1b0c0 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
1b0d0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
1b0e0 3a 20 20 20 20 7a 41 66 66 20 3d 20 22 4e 4f 4e  :    zAff = "NON
1b0f0 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  E";     break;. 
1b100 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
1b110 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3a 20  TE_AFF_NUMERIC: 
1b120 7a 41 66 66 20 3d 20 22 4e 55 4d 45 52 49 43 22  zAff = "NUMERIC"
1b130 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
1b140 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
1b150 46 5f 49 4e 54 45 47 45 52 3a 20 7a 41 66 66 20  F_INTEGER: zAff 
1b160 3d 20 22 49 4e 54 45 47 45 52 22 3b 20 20 62 72  = "INTEGER";  br
1b170 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
1b180 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  e SQLITE_AFF_REA
1b190 4c 3a 20 20 20 20 7a 41 66 66 20 3d 20 22 52 45  L:    zAff = "RE
1b1a0 41 4c 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  AL";     break;.
1b1b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1b1c0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1b1d0 74 66 28 70 4f 75 74 2c 20 22 43 41 53 54 2d 25  tf(pOut, "CAST-%
1b1e0 73 28 22 2c 20 7a 41 66 66 29 3b 0a 20 20 20 20  s(", zAff);.    
1b1f0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b200 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72  Expr(pOut, pExpr
1b210 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
1b220 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1b230 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b  intf(pOut, ")");
1b240 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1b250 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
1b260 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a  LITE_OMIT_CAST *
1b270 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  /.    case TK_LT
1b280 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  :      zBinOp = 
1b290 22 4c 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  "LT";     break;
1b2a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
1b2b0 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22        zBinOp = "
1b2c0 4c 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  LE";     break;.
1b2d0 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20      case TK_GT: 
1b2e0 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 47       zBinOp = "G
1b2f0 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  T";     break;. 
1b300 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 20     case TK_GE:  
1b310 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 47 45      zBinOp = "GE
1b320 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
1b330 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20    case TK_NE:   
1b340 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4e 45 22     zBinOp = "NE"
1b350 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
1b360 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20   case TK_EQ:    
1b370 20 20 7a 42 69 6e 4f 70 20 3d 20 22 45 51 22 3b    zBinOp = "EQ";
1b380 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b390 63 61 73 65 20 54 4b 5f 49 53 3a 20 20 20 20 20  case TK_IS:     
1b3a0 20 7a 42 69 6e 4f 70 20 3d 20 22 49 53 22 3b 20   zBinOp = "IS"; 
1b3b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1b3c0 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 20 20  ase TK_ISNOT:   
1b3d0 7a 42 69 6e 4f 70 20 3d 20 22 49 53 4e 4f 54 22  zBinOp = "ISNOT"
1b3e0 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
1b3f0 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20 7a  se TK_AND:     z
1b400 42 69 6e 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20  BinOp = "AND";  
1b410 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1b420 65 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 42  e TK_OR:      zB
1b430 69 6e 4f 70 20 3d 20 22 4f 52 22 3b 20 20 20 20  inOp = "OR";    
1b440 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1b450 20 54 4b 5f 50 4c 55 53 3a 20 20 20 20 7a 42 69   TK_PLUS:    zBi
1b460 6e 4f 70 20 3d 20 22 41 44 44 22 3b 20 20 20 20  nOp = "ADD";    
1b470 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1b480 54 4b 5f 53 54 41 52 3a 20 20 20 20 7a 42 69 6e  TK_STAR:    zBin
1b490 4f 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20 62  Op = "MUL";    b
1b4a0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1b4b0 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a 42 69 6e 4f  K_MINUS:   zBinO
1b4c0 70 20 3d 20 22 53 55 42 22 3b 20 20 20 20 62 72  p = "SUB";    br
1b4d0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1b4e0 5f 52 45 4d 3a 20 20 20 20 20 7a 42 69 6e 4f 70  _REM:     zBinOp
1b4f0 20 3d 20 22 52 45 4d 22 3b 20 20 20 20 62 72 65   = "REM";    bre
1b500 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1b510 42 49 54 41 4e 44 3a 20 20 7a 42 69 6e 4f 70 20  BITAND:  zBinOp 
1b520 3d 20 22 42 49 54 41 4e 44 22 3b 20 62 72 65 61  = "BITAND"; brea
1b530 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
1b540 49 54 4f 52 3a 20 20 20 7a 42 69 6e 4f 70 20 3d  ITOR:   zBinOp =
1b550 20 22 42 49 54 4f 52 22 3b 20 20 62 72 65 61 6b   "BITOR";  break
1b560 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c  ;.    case TK_SL
1b570 41 53 48 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20  ASH:   zBinOp = 
1b580 22 44 49 56 22 3b 20 20 20 20 62 72 65 61 6b 3b  "DIV";    break;
1b590 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48  .    case TK_LSH
1b5a0 49 46 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22  IFT:  zBinOp = "
1b5b0 4c 53 48 49 46 54 22 3b 20 62 72 65 61 6b 3b 0a  LSHIFT"; break;.
1b5c0 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49      case TK_RSHI
1b5d0 46 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 52  FT:  zBinOp = "R
1b5e0 53 48 49 46 54 22 3b 20 62 72 65 61 6b 3b 0a 20  SHIFT"; break;. 
1b5f0 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41     case TK_CONCA
1b600 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 43 4f  T:  zBinOp = "CO
1b610 4e 43 41 54 22 3b 20 62 72 65 61 6b 3b 0a 0a 20  NCAT"; break;.. 
1b620 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
1b630 53 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22 55 4d  S:  zUniOp = "UM
1b640 49 4e 55 53 22 3b 20 62 72 65 61 6b 3b 0a 20 20  INUS"; break;.  
1b650 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
1b660 20 20 20 7a 55 6e 69 4f 70 20 3d 20 22 55 50 4c     zUniOp = "UPL
1b670 55 53 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  US";  break;.   
1b680 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a   case TK_BITNOT:
1b690 20 20 7a 55 6e 69 4f 70 20 3d 20 22 42 49 54 4e    zUniOp = "BITN
1b6a0 4f 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  OT"; break;.    
1b6b0 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20 20  case TK_NOT:    
1b6c0 20 7a 55 6e 69 4f 70 20 3d 20 22 4e 4f 54 22 3b   zUniOp = "NOT";
1b6d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1b6e0 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20  ase TK_ISNULL:  
1b6f0 7a 55 6e 69 4f 70 20 3d 20 22 49 53 4e 55 4c 4c  zUniOp = "ISNULL
1b700 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
1b710 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a  se TK_NOTNULL: z
1b720 55 6e 69 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c  UniOp = "NOTNULL
1b730 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63  "; break;..    c
1b740 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20  ase TK_COLLATE: 
1b750 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1b760 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c  xplainExpr(pOut,
1b770 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
1b780 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b790 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1b7a0 22 2e 43 4f 4c 4c 41 54 45 28 25 73 29 22 2c 70  ".COLLATE(%s)",p
1b7b0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
1b7c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1b7d0 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
1b7e0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  _AGG_FUNCTION:. 
1b7f0 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
1b800 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  ION: {.      Exp
1b810 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20  rList *pFarg;   
1b820 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
1b830 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
1b840 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45  s */.      if( E
1b850 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1b860 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
1b870 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ly) ){.        p
1b880 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  Farg = 0;.      
1b890 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
1b8a0 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Farg = pExpr->x.
1b8b0 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pList;.      }. 
1b8c0 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f       if( op==TK_
1b8d0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a  AGG_FUNCTION ){.
1b8e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1b8f0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1b900 74 2c 20 22 41 47 47 5f 46 55 4e 43 54 49 4f 4e  t, "AGG_FUNCTION
1b910 25 64 3a 25 73 28 22 2c 0a 20 20 20 20 20 20 20  %d:%s(",.       
1b920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b930 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32        pExpr->op2
1b940 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1b950 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
1b960 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b970 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1b980 75 74 2c 20 22 46 55 4e 43 54 49 4f 4e 3a 25 73  ut, "FUNCTION:%s
1b990 28 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  (", pExpr->u.zTo
1b9a0 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ken);.      }.  
1b9b0 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b      if( pFarg ){
1b9c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b9d0 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28  ExplainExprList(
1b9e0 70 4f 75 74 2c 20 70 46 61 72 67 29 3b 0a 20 20  pOut, pFarg);.  
1b9f0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1ba00 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1ba10 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20 20  (pOut, ")");.   
1ba20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ba30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ba40 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
1ba50 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
1ba60 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1ba70 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1ba80 75 74 2c 20 22 45 58 49 53 54 53 28 22 29 3b 0a  ut, "EXISTS(");.
1ba90 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1baa0 6c 61 69 6e 53 65 6c 65 63 74 28 70 4f 75 74 2c  lainSelect(pOut,
1bab0 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
1bac0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1bad0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1bae0 4f 75 74 2c 22 29 22 29 3b 0a 20 20 20 20 20 20  Out,")");.      
1baf0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1bb00 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
1bb10 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1bb20 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1bb30 75 74 2c 20 22 28 22 29 3b 0a 20 20 20 20 20 20  ut, "(");.      
1bb40 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65  sqlite3ExplainSe
1bb50 6c 65 63 74 28 70 4f 75 74 2c 20 70 45 78 70 72  lect(pOut, pExpr
1bb60 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
1bb70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1bb80 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1bb90 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  )");.      break
1bba0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1bbb0 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
1bbc0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1bbd0 69 6e 74 66 28 70 4f 75 74 2c 20 22 49 4e 28 22  intf(pOut, "IN("
1bbe0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1bbf0 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74  ExplainExpr(pOut
1bc00 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
1bc10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1bc20 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1bc30 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 69 66  , ",");.      if
1bc40 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1bc50 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
1bc60 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
1bc70 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1bc80 53 65 6c 65 63 74 28 70 4f 75 74 2c 20 70 45 78  Select(pOut, pEx
1bc90 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a  pr->x.pSelect);.
1bca0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1bcb0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1bcc0 61 69 6e 45 78 70 72 4c 69 73 74 28 70 4f 75 74  ainExprList(pOut
1bcd0 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
1bce0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1bcf0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1bd00 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29  rintf(pOut, ")")
1bd10 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1bd20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
1bd30 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1bd40 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20  ERY */..    /*. 
1bd50 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45     **    x BETWE
1bd60 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a  EN y AND z.    *
1bd70 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73  *.    ** This is
1bd80 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20   equivalent to. 
1bd90 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1bda0 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20  x>=y AND x<=z.  
1bdb0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73    **.    ** X is
1bdc0 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
1bdd0 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20  ->pLeft..    ** 
1bde0 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  Y is stored in p
1bdf0 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30  Expr->pList->a[0
1be00 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20  ].pExpr..    ** 
1be10 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  Z is stored in p
1be20 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31  Expr->pList->a[1
1be30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a  ].pExpr..    */.
1be40 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
1be50 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  EEN: {.      Exp
1be60 72 20 2a 70 58 20 3d 20 70 45 78 70 72 2d 3e 70  r *pX = pExpr->p
1be70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72  Left;.      Expr
1be80 20 2a 70 59 20 3d 20 70 45 78 70 72 2d 3e 78 2e   *pY = pExpr->x.
1be90 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
1bea0 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  r;.      Expr *p
1beb0 5a 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  Z = pExpr->x.pLi
1bec0 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
1bed0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1bee0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1bef0 20 22 42 45 54 57 45 45 4e 28 22 29 3b 0a 20 20   "BETWEEN(");.  
1bf00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1bf10 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 58 29  inExpr(pOut, pX)
1bf20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1bf30 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1bf40 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 73  t, ",");.      s
1bf50 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1bf60 72 28 70 4f 75 74 2c 20 70 59 29 3b 0a 20 20 20  r(pOut, pY);.   
1bf70 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1bf80 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c  nPrintf(pOut, ",
1bf90 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
1bfa0 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75  3ExplainExpr(pOu
1bfb0 74 2c 20 70 5a 29 3b 0a 20 20 20 20 20 20 73 71  t, pZ);.      sq
1bfc0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1bfd0 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20  tf(pOut, ")");. 
1bfe0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bff0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52  }.    case TK_TR
1c000 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f  IGGER: {.      /
1c010 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20  * If the opcode 
1c020 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74  is TK_TRIGGER, t
1c030 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
1c040 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  on is a referenc
1c050 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20  e.      ** to a 
1c060 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65  column in the ne
1c070 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65  w.* or old.* pse
1c080 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c  udo-tables avail
1c090 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  able to.      **
1c0a0 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
1c0b0 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
1c0c0 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73  Expr.iTable is s
1c0d0 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a  et to 1 for the.
1c0e0 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70        ** new.* p
1c0f0 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20  seudo-table, or 
1c100 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20  0 for the old.* 
1c110 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78  pseudo-table. Ex
1c120 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20  pr.iColumn.     
1c130 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68   ** is set to th
1c140 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
1c150 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20  pseudo-table to 
1c160 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74  read, or to -1 t
1c170 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20  o.      ** read 
1c180 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e  the rowid field.
1c190 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1c1a0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1c1b0 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 73 28 25  intf(pOut, "%s(%
1c1c0 64 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  d)", .          
1c1d0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20  pExpr->iTable ? 
1c1e0 22 4e 45 57 22 20 3a 20 22 4f 4c 44 22 2c 20 70  "NEW" : "OLD", p
1c1f0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
1c200 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c210 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
1c220 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ASE: {.      sql
1c230 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1c240 66 28 70 4f 75 74 2c 20 22 43 41 53 45 28 22 29  f(pOut, "CASE(")
1c250 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1c260 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c  xplainExpr(pOut,
1c270 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
1c280 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1c290 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1c2a0 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 73 71 6c   ",");.      sql
1c2b0 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c  ite3ExplainExprL
1c2c0 69 73 74 28 70 4f 75 74 2c 20 70 45 78 70 72 2d  ist(pOut, pExpr-
1c2d0 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  >x.pList);.     
1c2e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
1c2f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c300 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61  T_TRIGGER.    ca
1c310 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20  se TK_RAISE: {. 
1c320 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1c330 2a 7a 54 79 70 65 20 3d 20 22 75 6e 6b 22 3b 0a  *zType = "unk";.
1c340 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70 45        switch( pE
1c350 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 29 7b  xpr->affinity ){
1c360 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 45  .        case OE
1c370 5f 52 6f 6c 6c 62 61 63 6b 3a 20 20 20 7a 54 79  _Rollback:   zTy
1c380 70 65 20 3d 20 22 72 6f 6c 6c 62 61 63 6b 22 3b  pe = "rollback";
1c390 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1c3a0 20 63 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a 20   case OE_Abort: 
1c3b0 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 61 62       zType = "ab
1c3c0 6f 72 74 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  ort";     break;
1c3d0 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 45  .        case OE
1c3e0 5f 46 61 69 6c 3a 20 20 20 20 20 20 20 7a 54 79  _Fail:       zTy
1c3f0 70 65 20 3d 20 22 66 61 69 6c 22 3b 20 20 20 20  pe = "fail";    
1c400 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1c410 20 63 61 73 65 20 4f 45 5f 49 67 6e 6f 72 65 3a   case OE_Ignore:
1c420 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 69 67       zType = "ig
1c430 6e 6f 72 65 22 3b 20 20 20 20 62 72 65 61 6b 3b  nore";    break;
1c440 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1c450 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1c460 6e 74 66 28 70 4f 75 74 2c 20 22 52 41 49 53 45  ntf(pOut, "RAISE
1c470 2d 25 73 28 25 73 29 22 2c 20 7a 54 79 70 65 2c  -%s(%s)", zType,
1c480 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1c490 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1c4a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
1c4b0 0a 20 20 69 66 28 20 7a 42 69 6e 4f 70 20 29 7b  .  if( zBinOp ){
1c4c0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
1c4d0 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22  ainPrintf(pOut,"
1c4e0 25 73 28 22 2c 20 7a 42 69 6e 4f 70 29 3b 0a 20  %s(", zBinOp);. 
1c4f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1c500 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70  nExpr(pOut, pExp
1c510 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  r->pLeft);.    s
1c520 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1c530 6e 74 66 28 70 4f 75 74 2c 22 2c 22 29 3b 0a 20  ntf(pOut,",");. 
1c540 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1c550 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70  nExpr(pOut, pExp
1c560 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
1c570 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1c580 69 6e 74 66 28 70 4f 75 74 2c 22 29 22 29 3b 0a  intf(pOut,")");.
1c590 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 55 6e 69    }else if( zUni
1c5a0 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Op ){.    sqlite
1c5b0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1c5c0 4f 75 74 2c 22 25 73 28 22 2c 20 7a 55 6e 69 4f  Out,"%s(", zUniO
1c5d0 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  p);.    sqlite3E
1c5e0 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c  xplainExpr(pOut,
1c5f0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
1c600 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1c610 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 29  inPrintf(pOut,")
1c620 22 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  ");.  }.}.#endif
1c630 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
1c640 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
1c650 58 50 4c 41 49 4e 29 20 2a 2f 0a 0a 23 69 66 20  XPLAIN) */..#if 
1c660 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1c670 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41  NABLE_TREE_EXPLA
1c680 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  IN)./*.** Genera
1c690 74 65 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61  te a human-reada
1c6a0 62 6c 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20  ble explanation 
1c6b0 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
1c6c0 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73   list..*/.void s
1c6d0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1c6e0 72 4c 69 73 74 28 56 64 62 65 20 2a 70 4f 75 74  rList(Vdbe *pOut
1c6f0 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
1c700 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
1c710 66 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  f( pList==0 || p
1c720 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29  List->nExpr==0 )
1c730 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
1c740 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1c750 20 22 28 65 6d 70 74 79 2d 6c 69 73 74 29 22 29   "(empty-list)")
1c760 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1c770 7d 65 6c 73 65 20 69 66 28 20 70 4c 69 73 74 2d  }else if( pList-
1c780 3e 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20  >nExpr==1 ){.   
1c790 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1c7a0 78 70 72 28 70 4f 75 74 2c 20 70 4c 69 73 74 2d  xpr(pOut, pList-
1c7b0 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
1c7c0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
1c7d0 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70 4f  e3ExplainPush(pO
1c7e0 75 74 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ut);.    for(i=0
1c7f0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
1c800 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
1c810 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1c820 74 66 28 70 4f 75 74 2c 20 22 69 74 65 6d 5b 25  tf(pOut, "item[%
1c830 64 5d 20 3d 20 22 2c 20 69 29 3b 0a 20 20 20 20  d] = ", i);.    
1c840 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1c850 50 75 73 68 28 70 4f 75 74 29 3b 0a 20 20 20 20  Push(pOut);.    
1c860 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1c870 45 78 70 72 28 70 4f 75 74 2c 20 70 4c 69 73 74  Expr(pOut, pList
1c880 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
1c890 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1c8a0 61 69 6e 50 6f 70 28 70 4f 75 74 29 3b 0a 20 20  ainPop(pOut);.  
1c8b0 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
1c8c0 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  [i].zName ){.   
1c8d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1c8e0 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1c8f0 22 20 41 53 20 25 73 22 2c 20 70 4c 69 73 74 2d  " AS %s", pList-
1c900 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
1c910 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1c920 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 62 53 70 61  pList->a[i].bSpa
1c930 6e 49 73 54 61 62 20 29 7b 0a 20 20 20 20 20 20  nIsTab ){.      
1c940 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1c950 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 20 28  Printf(pOut, " (
1c960 25 73 29 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  %s)", pList->a[i
1c970 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20  ].zSpan);.      
1c980 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c 70 4c  }.      if( i<pL
1c990 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a  ist->nExpr-1 ){.
1c9a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1c9b0 78 70 6c 61 69 6e 4e 4c 28 70 4f 75 74 29 3b 0a  xplainNL(pOut);.
1c9c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1c9d0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1c9e0 50 6f 70 28 70 4f 75 74 29 3b 0a 20 20 7d 0a 7d  Pop(pOut);.  }.}
1c9f0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1ca00 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a  E_DEBUG */../*.*
1ca10 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1ca20 74 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20  that pushes the 
1ca30 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65  value of every e
1ca40 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69  lement of the gi
1ca50 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
1ca60 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65  n list into a se
1ca70 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
1ca80 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ers beginning at
1ca90 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52   target..**.** R
1caa0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1cab0 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61   of elements eva
1cac0 6c 75 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  luated..**.** Th
1cad0 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  e SQLITE_ECEL_DU
1cae0 50 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20  P flag prevents 
1caf0 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72  the arguments fr
1cb00 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c  om being.** fill
1cb10 65 64 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70  ed using OP_SCop
1cb20 79 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74  y.  OP_Copy must
1cb30 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64   be used instead
1cb40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
1cb50 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20 61  TE_ECEL_FACTOR a
1cb60 72 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63  rgument allows c
1cb70 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
1cb80 73 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f  s to be.** facto
1cb90 72 65 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69  red out into ini
1cba0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65  tialization code
1cbb0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1cbc0 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
1cbd0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1cbe0 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
1cbf0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
1cc00 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
1cc10 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
1cc20 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63  ion list to be c
1cc30 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61  oded */.  int ta
1cc40 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  rget,        /* 
1cc50 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 72  Where to write r
1cc60 65 73 75 6c 74 73 20 2a 2f 0a 20 20 75 38 20 66  esults */.  u8 f
1cc70 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
1cc80 2a 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20  * SQLITE_ECEL_* 
1cc90 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74  flags */.){.  st
1cca0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
1ccb0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
1ccc0 20 69 2c 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79   i, n;.  u8 copy
1ccd0 4f 70 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  Op = (flags & SQ
1cce0 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f  LITE_ECEL_DUP) ?
1ccf0 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43   OP_Copy : OP_SC
1cd00 6f 70 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70  opy;.  assert( p
1cd10 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  List!=0 );.  ass
1cd20 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b  ert( target>0 );
1cd30 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1cd40 65 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b 20 20  e->pVdbe!=0 );  
1cd50 2f 2a 20 4e 65 76 65 72 20 67 65 74 73 20 74 68  /* Never gets th
1cd60 69 73 20 66 61 72 20 6f 74 68 65 72 77 69 73 65  is far otherwise
1cd70 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d   */.  n = pList-
1cd80 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 21 43  >nExpr;.  if( !C
1cd90 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61  onstFactorOk(pPa
1cda0 72 73 65 29 20 29 20 66 6c 61 67 73 20 26 3d 20  rse) ) flags &= 
1cdb0 7e 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43  ~SQLITE_ECEL_FAC
1cdc0 54 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  TOR;.  for(pItem
1cdd0 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
1cde0 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  i<n; i++, pItem+
1cdf0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
1ce00 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  xpr = pItem->pEx
1ce10 70 72 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61  pr;.    if( (fla
1ce20 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs & SQLITE_ECEL
1ce30 5f 46 41 43 54 4f 52 29 21 3d 30 20 26 26 20 73  _FACTOR)!=0 && s
1ce40 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
1ce50 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20  tant(pExpr) ){. 
1ce60 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1ce70 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73  CodeAtInit(pPars
1ce80 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
1ce90 2b 69 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  +i, 0);.    }els
1cea0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 52  e{.      int inR
1ceb0 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
1cec0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
1ced0 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
1cee0 2b 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  +i);.      if( i
1cef0 6e 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29  nReg!=target+i )
1cf00 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70  {.        VdbeOp
1cf10 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 56   *pOp;.        V
1cf20 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1cf30 3e 70 56 64 62 65 3b 0a 20 20 20 20 20 20 20 20  >pVdbe;.        
1cf40 69 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43  if( copyOp==OP_C
1cf50 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26 26 20  opy.         && 
1cf60 28 70 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65  (pOp=sqlite3Vdbe
1cf70 47 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f  GetOp(v, -1))->o
1cf80 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20  pcode==OP_Copy. 
1cf90 20 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e          && pOp->
1cfa0 70 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e  p1+pOp->p3+1==in
1cfb0 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20  Reg.         && 
1cfc0 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b  pOp->p2+pOp->p3+
1cfd0 31 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20  1==target+i.    
1cfe0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
1cff0 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20   pOp->p3++;.    
1d000 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d010 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d020 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70  AddOp2(v, copyOp
1d030 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b  , inReg, target+
1d040 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i);.        }.  
1d050 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1d060 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
1d070 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1d080 64 65 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e  de for a BETWEEN
1d090 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a   operator..**.**
1d0a0 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20      x BETWEEN y 
1d0b0 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  AND z.**.** The 
1d0c0 61 62 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c  above is equival
1d0d0 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20  ent to .**.**   
1d0e0 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a   x>=y AND x<=z.*
1d0f0 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20  *.** Code it as 
1d100 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72  such, taking car
1d110 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d  e to do the comm
1d120 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  on subexpression
1d130 0a 2a 2a 20 65 6c 65 6d 65 6e 74 61 74 69 6f 6e  .** elementation
1d140 20 6f 66 20 78 2e 0a 2a 2f 0a 73 74 61 74 69 63   of x..*/.static
1d150 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65 42 65   void exprCodeBe
1d160 74 77 65 65 6e 28 0a 20 20 50 61 72 73 65 20 2a  tween(.  Parse *
1d170 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
1d180 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
1d190 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
1d1a0 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
1d1b0 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  pr,      /* The 
1d1c0 42 45 54 57 45 45 4e 20 65 78 70 72 65 73 73 69  BETWEEN expressi
1d1d0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  on */.  int dest
1d1e0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d  ,         /* Jum
1d1f0 70 20 68 65 72 65 20 69 66 20 74 68 65 20 6a 75  p here if the ju
1d200 6d 70 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20  mp is taken */. 
1d210 20 69 6e 74 20 6a 75 6d 70 49 66 54 72 75 65 2c   int jumpIfTrue,
1d220 20 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a     /* Take the j
1d230 75 6d 70 20 69 66 20 74 68 65 20 42 45 54 57 45  ump if the BETWE
1d240 45 4e 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20  EN is true */.  
1d250 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20  int jumpIfNull  
1d260 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75    /* Take the ju
1d270 6d 70 20 69 66 20 74 68 65 20 42 45 54 57 45 45  mp if the BETWEE
1d280 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  N is NULL */.){.
1d290 20 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b 20    Expr exprAnd; 
1d2a0 20 20 20 20 2f 2a 20 54 68 65 20 41 4e 44 20 6f      /* The AND o
1d2b0 70 65 72 61 74 6f 72 20 69 6e 20 20 78 3e 3d 79  perator in  x>=y
1d2c0 20 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20   AND x<=z  */.  
1d2d0 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 20 20  Expr compLeft;  
1d2e0 20 20 2f 2a 20 54 68 65 20 20 78 3e 3d 79 20 20    /* The  x>=y  
1d2f0 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 63  term */.  Expr c
1d300 6f 6d 70 52 69 67 68 74 3b 20 20 20 2f 2a 20 54  ompRight;   /* T
1d310 68 65 20 20 78 3c 3d 7a 20 20 74 65 72 6d 20 2a  he  x<=z  term *
1d320 2f 0a 20 20 45 78 70 72 20 65 78 70 72 58 3b 20  /.  Expr exprX; 
1d330 20 20 20 20 20 20 2f 2a 20 54 68 65 20 20 78 20        /* The  x 
1d340 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a   subexpression *
1d350 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  /.  int regFree1
1d360 20 3d 20 30 3b 20 2f 2a 20 54 65 6d 70 6f 72 61   = 0; /* Tempora
1d370 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72 20  ry use register 
1d380 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45  */..  assert( !E
1d390 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1d3a0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1d3b0 63 74 29 20 29 3b 0a 20 20 65 78 70 72 58 20 3d  ct) );.  exprX =
1d3c0 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a   *pExpr->pLeft;.
1d3d0 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54    exprAnd.op = T
1d3e0 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64  K_AND;.  exprAnd
1d3f0 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65  .pLeft = &compLe
1d400 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 52  ft;.  exprAnd.pR
1d410 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68  ight = &compRigh
1d420 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70  t;.  compLeft.op
1d430 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70   = TK_GE;.  comp
1d440 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78  Left.pLeft = &ex
1d450 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e  prX;.  compLeft.
1d460 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
1d470 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  x.pList->a[0].pE
1d480 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  xpr;.  compRight
1d490 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63  .op = TK_LE;.  c
1d4a0 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d  ompRight.pLeft =
1d4b0 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52   &exprX;.  compR
1d4c0 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45  ight.pRight = pE
1d4d0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
1d4e0 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78 70 72  1].pExpr;.  expr
1d4f0 54 6f 52 65 67 69 73 74 65 72 28 26 65 78 70 72  ToRegister(&expr
1d500 58 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  X, sqlite3ExprCo
1d510 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26  deTemp(pParse, &
1d520 65 78 70 72 58 2c 20 26 72 65 67 46 72 65 65 31  exprX, &regFree1
1d530 29 29 3b 0a 20 20 69 66 28 20 6a 75 6d 70 49 66  ));.  if( jumpIf
1d540 54 72 75 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  True ){.    sqli
1d550 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
1d560 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20  arse, &exprAnd, 
1d570 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1d580 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1d590 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1d5a0 73 65 28 70 50 61 72 73 65 2c 20 26 65 78 70 72  se(pParse, &expr
1d5b0 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  And, dest, jumpI
1d5c0 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71  fNull);.  }.  sq
1d5d0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1d5e0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
1d5f0 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73  ree1);..  /* Ens
1d600 75 72 65 20 61 64 65 71 75 61 74 65 20 74 65 73  ure adequate tes
1d610 74 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20  t coverage */.  
1d620 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1d630 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49  True==0 && jumpI
1d640 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46  fNull==0 && regF
1d650 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
1d660 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
1d670 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e==0 && jumpIfNu
1d680 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
1d690 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1!=0 );.  testca
1d6a0 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d  se( jumpIfTrue==
1d6b0 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  0 && jumpIfNull!
1d6c0 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
1d6d0 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
1d6e0 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26   jumpIfTrue==0 &
1d6f0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
1d700 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
1d710 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
1d720 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a  mpIfTrue!=0 && j
1d730 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
1d740 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1d750 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1d760 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70  fTrue!=0 && jump
1d770 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
1d780 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
1d790 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
1d7a0 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue!=0 && jumpIfN
1d7b0 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
1d7c0 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
1d7d0 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21  ase( jumpIfTrue!
1d7e0 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
1d7f0 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  !=0 && regFree1!
1d800 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  =0 );.}../*.** G
1d810 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1d820 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
1d830 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
1d840 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
1d850 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
1d860 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
1d870 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20  ression is true 
1d880 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
1d890 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
1d8a0 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
1d8b0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
1d8c0 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  lse..**.** If th
1d8d0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
1d8e0 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
1d8f0 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
1d900 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a   false), then.**
1d910 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   take the jump i
1d920 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c  f the jumpIfNull
1d930 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f   flag is SQLITE_
1d940 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  JUMPIFNULL..**.*
1d950 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65  * This code depe
1d960 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20  nds on the fact 
1d970 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b  that certain tok
1d980 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54  en values (ex: T
1d990 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65  K_EQ).** are the
1d9a0 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20   same as opcode 
1d9b0 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45  values (ex: OP_E
1d9c0 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  q) that implemen
1d9d0 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  t the correspond
1d9e0 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ing.** operation
1d9f0 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65  .  Special comme
1da00 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e  nts in vdbe.c an
1da10 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  d the mkopcodeh.
1da20 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a  awk script in.**
1da30 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73   the make proces
1da40 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61  s cause these va
1da50 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20  lues to align.  
1da60 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65  Assert()s in the
1da70 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76   code.** below v
1da80 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e  erify that the n
1da90 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e  umbers are align
1daa0 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f  ed correctly..*/
1dab0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1dac0 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70  rIfTrue(Parse *p
1dad0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
1dae0 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
1daf0 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
1db00 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1db10 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
1db20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  op = 0;.  int re
1db30 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e  gFree1 = 0;.  in
1db40 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  t regFree2 = 0;.
1db50 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20    int r1, r2;.. 
1db60 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e   assert( jumpIfN
1db70 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50  ull==SQLITE_JUMP
1db80 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66  IFNULL || jumpIf
1db90 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Null==0 );.  if(
1dba0 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 20   NEVER(v==0) )  
1dbb0 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45     return;  /* E
1dbc0 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45  xistence of VDBE
1dbd0 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c   checked by call
1dbe0 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  er */.  if( NEVE
1dbf0 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72 65  R(pExpr==0) ) re
1dc00 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79  turn;  /* No way
1dc10 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
1dc20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70 72   */.  op = pExpr
1dc30 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20  ->op;.  switch( 
1dc40 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
1dc50 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69  K_AND: {.      i
1dc60 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
1dc70 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1dc80 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1dc90 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1dca0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1dcb0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1dcc0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1dcd0 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53   d2,jumpIfNull^S
1dce0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1dcf0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1dd00 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
1dd10 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
1dd20 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
1dd30 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1dd40 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
1dd50 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
1dd60 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1dd70 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
1dd80 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1dd90 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c  CachePop(pParse,
1dda0 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   1);.      break
1ddb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1ddc0 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
1ddd0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1dde0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1ddf0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
1de00 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
1de10 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
1de20 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1de30 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1de40 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
1de50 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1de60 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
1de70 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
1de80 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1de90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1dea0 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
1deb0 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72  se, 1);.      br
1dec0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1ded0 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
1dee0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1def0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1df00 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1df10 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1df20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
1df30 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1df40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1df50 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1df60 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
1df70 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
1df80 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
1df90 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
1dfa0 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
1dfb0 45 51 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  EQ: {.      test
1dfc0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1dfd0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ==0 );.      r1 
1dfe0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1dff0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1e000 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1e010 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
1e020 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1e030 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1e040 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
1e050 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1e060 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
1e070 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1e080 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1e090 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
1e0a0 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64         r1, r2, d
1e0b0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1e0c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
1e0d0 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65  K_LT==OP_Lt); te
1e0e0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
1e0f0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1e100 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
1e110 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1e120 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74  LE==OP_Le); test
1e130 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  case(op==OP_Le);
1e140 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1e150 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20  v,op==OP_Le);.  
1e160 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54      assert(TK_GT
1e170 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61  ==OP_Gt); testca
1e180 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
1e190 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1e1a0 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
1e1b0 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d    assert(TK_GE==
1e1c0 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ge); testcase
1e1d0 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62  (op==OP_Ge); Vdb
1e1e0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1e1f0 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ge);.      
1e200 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50  assert(TK_EQ==OP
1e210 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Eq); testcase(o
1e220 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43  p==OP_Eq); VdbeC
1e230 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1e240 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 61 73  OP_Eq);.      as
1e250 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  sert(TK_NE==OP_N
1e260 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
1e270 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ne); VdbeCov
1e280 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1e290 5f 4e 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  _Ne);.      test
1e2a0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1e2b0 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1e2c0 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1e2d0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1e2e0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1e2f0 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20  TK_IS:.    case 
1e300 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20  TK_ISNOT: {.    
1e310 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1e320 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74  TK_IS );.      t
1e330 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1e340 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72  ISNOT );.      r
1e350 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1e360 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1e370 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1e380 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1e390 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
1e3a0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1e3b0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1e3c0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
1e3d0 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49    op = (op==TK_I
1e3e0 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f  S) ? TK_EQ : TK_
1e3f0 4e 45 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  NE;.      codeCo
1e400 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
1e410 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
1e420 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
1e430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e440 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 53   r1, r2, dest, S
1e450 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
1e460 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1e470 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51  eIf(v, op==TK_EQ
1e480 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1e490 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
1e4a0 4b 5f 4e 45 29 3b 0a 20 20 20 20 20 20 74 65 73  K_NE);.      tes
1e4b0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1e4c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1e4d0 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1e4e0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1e4f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e500 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
1e510 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
1e520 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1e530 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
1e540 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63  sNull );   testc
1e550 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
1e560 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LL );.      asse
1e570 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d  rt( TK_NOTNULL==
1e580 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65  OP_NotNull ); te
1e590 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
1e5a0 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
1e5b0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1e5c0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1e5d0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1e5e0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1e5f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e600 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65  p2(v, op, r1, de
1e610 73 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  st);.      VdbeC
1e620 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
1e630 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20  =TK_ISNULL);.   
1e640 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1e650 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  f(v, op==TK_NOTN
1e660 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ULL);.      test
1e670 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1e680 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1e690 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e6a0 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
1e6b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1e6c0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1e6d0 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65        exprCodeBe
1e6e0 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45  tween(pParse, pE
1e6f0 78 70 72 2c 20 64 65 73 74 2c 20 31 2c 20 6a 75  xpr, dest, 1, ju
1e700 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1e710 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
1e720 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e730 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
1e740 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
1e750 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c     int destIfFal
1e760 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
1e770 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1e780 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
1e790 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  ll = jumpIfNull 
1e7a0 3f 20 64 65 73 74 20 3a 20 64 65 73 74 49 66 46  ? dest : destIfF
1e7b0 61 6c 73 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  alse;.      sqli
1e7c0 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
1e7d0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
1e7e0 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66  tIfFalse, destIf
1e7f0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
1e800 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1e810 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65  , OP_Goto, 0, de
1e820 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
1e830 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1e840 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  el(v, destIfFals
1e850 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
1e860 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1e870 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
1e880 20 20 20 69 66 28 20 65 78 70 72 41 6c 77 61 79     if( exprAlway
1e890 73 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a  sTrue(pExpr) ){.
1e8a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1e8b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1e8c0 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a  Goto, 0, dest);.
1e8d0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1e8e0 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
1e8f0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
1e900 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* No-op */.  
1e910 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e920 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1e930 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1e940 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46  se, pExpr, &regF
1e950 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73  ree1);.        s
1e960 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1e970 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64  (v, OP_If, r1, d
1e980 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  est, jumpIfNull!
1e990 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  =0);.        Vdb
1e9a0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1e9b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e9c0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1e9d0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1e9e0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1e9f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ea00 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1ea10 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
1ea20 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1ea30 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
1ea40 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1ea50 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
1ea60 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  ree2);  .}../*.*
1ea70 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1ea80 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
1ea90 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
1eaa0 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
1eab0 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
1eac0 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
1ead0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
1eae0 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  lse but executio
1eaf0 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
1eb00 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
1eb10 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
1eb20 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
1eb30 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1eb40 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
1eb50 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
1eb60 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a  nor false) then.
1eb70 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49  ** jump if jumpI
1eb80 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f  fNull is SQLITE_
1eb90 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61  JUMPIFNULL or fa
1eba0 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75  ll through if ju
1ebb0 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30  mpIfNull.** is 0
1ebc0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1ebd0 33 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72  3ExprIfFalse(Par
1ebe0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1ebf0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
1ec00 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
1ec10 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
1ec20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1ec30 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
1ec40 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
1ec50 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
1ec60 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72  = 0;.  int r1, r
1ec70 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75  2;..  assert( ju
1ec80 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
1ec90 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a  _JUMPIFNULL || j
1eca0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1ecb0 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
1ecc0 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45  ) ) return; /* E
1ecd0 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45  xistence of VDBE
1ece0 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c   checked by call
1ecf0 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  er */.  if( pExp
1ed00 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e  r==0 )    return
1ed10 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  ;..  /* The valu
1ed20 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61  e of pExpr->op a
1ed30 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65  nd op are relate
1ed40 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
1ed50 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45  **.  **       pE
1ed60 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20  xpr->op         
1ed70 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20     op.  **      
1ed80 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20   ---------      
1ed90 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20      ----------. 
1eda0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e   **       TK_ISN
1edb0 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f  ULL          OP_
1edc0 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20  NotNull.  **    
1edd0 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20     TK_NOTNULL   
1ede0 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a        OP_IsNull.
1edf0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45    **       TK_NE
1ee00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
1ee10 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Eq.  **       T
1ee20 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20  K_EQ            
1ee30 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20    OP_Ne.  **    
1ee40 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20     TK_GT        
1ee50 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a        OP_Le.  **
1ee60 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20         TK_LE    
1ee70 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a            OP_Gt.
1ee80 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45    **       TK_GE
1ee90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
1eea0 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Lt.  **       T
1eeb0 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20  K_LT            
1eec0 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a    OP_Ge.  **.  *
1eed0 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75  * For other valu
1eee0 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c  es of pExpr->op,
1eef0 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64   op is undefined
1ef00 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a   and unused..  *
1ef10 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54  * The value of T
1ef20 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
1ef30 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65  ants are arrange
1ef40 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20  d such that we. 
1ef50 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20   ** can compute 
1ef60 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76  the mapping abov
1ef70 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c  e using the foll
1ef80 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  owing expression
1ef90 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73  ..  ** Assert()s
1efa0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
1efb0 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
1efc0 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20  correct..  */.  
1efd0 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70  op = ((pExpr->op
1efe0 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e  +(TK_ISNULL&1))^
1eff0 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29  1)-(TK_ISNULL&1)
1f000 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63  ;..  /* Verify c
1f010 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74  orrect alignment
1f020 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20   of TK_ and OP_ 
1f030 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20  constants.  */. 
1f040 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1f050 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c  op!=TK_ISNULL ||
1f060 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20   op==OP_NotNull 
1f070 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
1f080 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55  pr->op!=TK_NOTNU
1f090 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e  LL || op==OP_IsN
1f0a0 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ull );.  assert(
1f0b0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e   pExpr->op!=TK_N
1f0c0 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29  E || op==OP_Eq )
1f0d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1f0e0 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20  r->op!=TK_EQ || 
1f0f0 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61  op==OP_Ne );.  a
1f100 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1f110 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_LT || op==O
1f120 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ge );.  assert
1f130 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1f140 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20  LE || op==OP_Gt 
1f150 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
1f160 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c  pr->op!=TK_GT ||
1f170 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20   op==OP_Le );.  
1f180 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1f190 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_GE || op==
1f1a0 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74  OP_Lt );..  swit
1f1b0 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
1f1c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
1f1d0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1f1e0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1f1f0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1f200 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
1f210 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1f220 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
1f230 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
1f240 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
1f250 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
1f260 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
1f270 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
1f280 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
1f290 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1f2a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1f2b0 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20  achePop(pParse, 
1f2c0 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
1f2d0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1f2e0 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69  TK_OR: {.      i
1f2f0 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
1f300 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1f310 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f320 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1f330 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1f340 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
1f350 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1f360 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53  d2, jumpIfNull^S
1f370 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1f380 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f390 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
1f3a0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
1f3b0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1f3c0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f3d0 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
1f3e0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1f3f0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1f400 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
1f410 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f420 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
1f430 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 1);.      brea
1f440 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1f450 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
1f460 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1f470 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1f480 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1f490 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
1f4a0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
1f4b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1f4c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f4d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
1f4e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
1f4f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
1f500 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
1f510 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
1f520 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
1f530 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1f540 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1f550 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
1f560 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1f570 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1f580 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1f590 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
1f5a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1f5b0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1f5c0 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
1f5d0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
1f5e0 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
1f5f0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
1f600 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
1f610 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f620 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
1f630 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1f640 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
1f650 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63  T==OP_Lt); testc
1f660 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20  ase(op==OP_Lt); 
1f670 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1f680 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20  ,op==OP_Lt);.   
1f690 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d     assert(TK_LE=
1f6a0 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73  =OP_Le); testcas
1f6b0 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64  e(op==OP_Le); Vd
1f6c0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1f6d0 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20  p==OP_Le);.     
1f6e0 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f   assert(TK_GT==O
1f6f0 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Gt); testcase(
1f700 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65  op==OP_Gt); Vdbe
1f710 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
1f720 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Gt);.      a
1f730 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f  ssert(TK_GE==OP_
1f740 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ge); testcase(op
1f750 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ge); VdbeCo
1f760 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1f770 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Ge);.      ass
1f780 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  ert(TK_EQ==OP_Eq
1f790 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1f7a0 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65  OP_Eq); VdbeCove
1f7b0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1f7c0 45 71 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Eq);.      asser
1f7d0 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b  t(TK_NE==OP_Ne);
1f7e0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1f7f0 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ne); VdbeCovera
1f800 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65  geIf(v,op==OP_Ne
1f810 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f820 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1f830 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f840 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1f850 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f860 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1f870 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
1f880 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  ISNOT: {.      t
1f890 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
1f8a0 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
1f8b0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
1f8c0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
1f8d0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
1f8e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1f8f0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1f900 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1f910 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
1f920 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1f930 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1f940 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
1f950 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20  ree2);.      op 
1f960 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  = (pExpr->op==TK
1f970 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54  _IS) ? TK_NE : T
1f980 4b 5f 45 51 3b 0a 20 20 20 20 20 20 63 6f 64 65  K_EQ;.      code
1f990 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
1f9a0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
1f9b0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
1f9c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f9d0 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
1f9e0 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b   SQLITE_NULLEQ);
1f9f0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1fa00 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
1fa10 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  EQ);.      VdbeC
1fa20 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
1fa30 3d 54 4b 5f 4e 45 29 3b 0a 20 20 20 20 20 20 74  =TK_NE);.      t
1fa40 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1fa50 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
1fa60 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
1fa70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1fa80 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1fa90 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
1faa0 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
1fab0 4c 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20  L: {.      r1 = 
1fac0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1fad0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1fae0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1faf0 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
1fb00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1fb10 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a   op, r1, dest);.
1fb20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fb30 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
1fb40 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1fb50 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  f(v, op==TK_ISNU
1fb60 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  LL);.      testc
1fb70 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
1fb80 55 4c 4c 20 29 3b 20 20 56 64 62 65 43 6f 76 65  ULL );  VdbeCove
1fb90 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
1fba0 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  _NOTNULL);.     
1fbb0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1fbc0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1fbd0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1fbe0 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
1fbf0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1fc00 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1fc10 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43  0 );.      exprC
1fc20 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73  odeBetween(pPars
1fc30 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
1fc40 30 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  0, jumpIfNull);.
1fc50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1fc60 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1fc70 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1fc80 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
1fc90 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70  {.      if( jump
1fca0 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  IfNull ){.      
1fcb0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1fcc0 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  eIN(pParse, pExp
1fcd0 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a  r, dest, dest);.
1fce0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1fcf0 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
1fd00 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
1fd10 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1fd20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1fd30 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
1fd40 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65   pExpr, dest, de
1fd50 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
1fd60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1fd70 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
1fd80 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
1fd90 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
1fda0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1fdb0 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
1fdc0 20 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73    if( exprAlways
1fdd0 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a  False(pExpr) ){.
1fde0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1fdf0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1fe00 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a  Goto, 0, dest);.
1fe10 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1fe20 65 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 70  exprAlwaysTrue(p
1fe30 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
1fe40 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20   /* no-op */.   
1fe50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1fe60 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1fe70 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1fe80 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72  e, pExpr, &regFr
1fe90 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ee1);.        sq
1fea0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1feb0 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c  v, OP_IfNot, r1,
1fec0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1fed0 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56  l!=0);.        V
1fee0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1fef0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1ff00 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1ff10 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1ff20 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1ff30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
1ff40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1ff50 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
1ff60 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1ff70 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
1ff80 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1ff90 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1ffa0 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  gFree2);.}../*.*
1ffb0 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70  * Do a deep comp
1ffc0 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78  arison of two ex
1ffd0 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20  pression trees. 
1ffe0 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   Return 0 if the
1fff0 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69   two.** expressi
20000 6f 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65 74 65  ons are complete
20010 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 52  ly identical.  R
20020 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 79 20  eturn 1 if they 
20030 64 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62  differ only.** b
20040 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  y a COLLATE oper
20050 61 74 6f 72 20 61 74 20 74 68 65 20 74 6f 70 20  ator at the top 
20060 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 32  level.  Return 2
20070 20 69 66 20 74 68 65 72 65 20 61 72 65 20 64 69   if there are di
20080 66 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74 68  fferences.** oth
20090 65 72 20 74 68 61 6e 20 74 68 65 20 74 6f 70 2d  er than the top-
200a0 6c 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f 70  level COLLATE op
200b0 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  erator..**.** If
200c0 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20   any subelement 
200d0 6f 66 20 70 42 20 68 61 73 20 45 78 70 72 2e 69  of pB has Expr.i
200e0 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e  Table==(-1) then
200f0 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a   it is allowed.*
20100 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75  * to compare equ
20110 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c  al to an equival
20120 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70  ent element in p
20130 41 20 77 69 74 68 20 45 78 70 72 2e 69 54 61 62  A with Expr.iTab
20140 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20  le==iTab..**.** 
20150 54 68 65 20 70 41 20 73 69 64 65 20 6d 69 67 68  The pA side migh
20160 74 20 62 65 20 75 73 69 6e 67 20 54 4b 5f 52 45  t be using TK_RE
20170 47 49 53 54 45 52 2e 20 20 49 66 20 74 68 61 74  GISTER.  If that
20180 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64   is the case and
20190 20 70 42 20 69 73 0a 2a 2a 20 6e 6f 74 20 75 73   pB is.** not us
201a0 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52 20  ing TK_REGISTER 
201b0 62 75 74 20 69 73 20 6f 74 68 65 72 77 69 73 65  but is otherwise
201c0 20 65 71 75 69 76 61 6c 65 6e 74 2c 20 74 68 65   equivalent, the
201d0 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 20 30  n still return 0
201e0 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  ..**.** Sometime
201f0 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
20200 69 6c 6c 20 72 65 74 75 72 6e 20 32 20 65 76 65  ill return 2 eve
20210 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65 78 70  n if the two exp
20220 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c  ressions.** real
20230 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e  ly are equivalen
20240 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f 74  t.  If we cannot
20250 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20   prove that the 
20260 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a  expressions are.
20270 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77 65  ** identical, we
20280 20 72 65 74 75 72 6e 20 32 20 6a 75 73 74 20 74   return 2 just t
20290 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69  o be safe.  So i
202a0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  f this routine.*
202b0 2a 20 72 65 74 75 72 6e 73 20 32 2c 20 74 68 65  * returns 2, the
202c0 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61  n you do not rea
202d0 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72  lly know for cer
202e0 74 61 69 6e 20 69 66 20 74 68 65 20 74 77 6f 0a  tain if the two.
202f0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  ** expressions a
20300 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75  re the same.  Bu
20310 74 20 69 66 20 79 6f 75 20 67 65 74 20 61 20 30  t if you get a 0
20320 20 6f 72 20 31 20 72 65 74 75 72 6e 2c 20 74 68   or 1 return, th
20330 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65  en you.** can be
20340 20 73 75 72 65 20 74 68 65 20 65 78 70 72 65 73   sure the expres
20350 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61  sions are the sa
20360 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63  me.  In the plac
20370 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73  es where.** this
20380 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
20390 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75  , it does not hu
203a0 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74  rt to get an ext
203b0 72 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20 6a  ra 2 - that.** j
203c0 75 73 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74  ust might result
203d0 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c   in some slightl
203e0 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20  y slower code.  
203f0 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a  But returning.**
20400 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 30 20   an incorrect 0 
20410 6f 72 20 31 20 63 6f 75 6c 64 20 6c 65 61 64 20  or 1 could lead 
20420 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e  to a malfunction
20430 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
20440 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72  ExprCompare(Expr
20450 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 2c 20   *pA, Expr *pB, 
20460 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 75 33 32  int iTab){.  u32
20470 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 3b 0a   combinedFlags;.
20480 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70    if( pA==0 || p
20490 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  B==0 ){.    retu
204a0 72 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20  rn pB==pA ? 0 : 
204b0 32 3b 0a 20 20 7d 0a 20 20 63 6f 6d 62 69 6e 65  2;.  }.  combine
204c0 64 46 6c 61 67 73 20 3d 20 70 41 2d 3e 66 6c 61  dFlags = pA->fla
204d0 67 73 20 7c 20 70 42 2d 3e 66 6c 61 67 73 3b 0a  gs | pB->flags;.
204e0 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c    if( combinedFl
204f0 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
20500 65 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 41  e ){.    if( (pA
20510 2d 3e 66 6c 61 67 73 26 70 42 2d 3e 66 6c 61 67  ->flags&pB->flag
20520 73 26 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d  s&EP_IntValue)!=
20530 30 20 26 26 20 70 41 2d 3e 75 2e 69 56 61 6c 75  0 && pA->u.iValu
20540 65 3d 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20  e==pB->u.iValue 
20550 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
20560 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  0;.    }.    ret
20570 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 2;.  }.  if(
20580 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20   pA->op!=pB->op 
20590 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f  ){.    if( pA->o
205a0 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26  p==TK_COLLATE &&
205b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
205c0 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70  are(pA->pLeft, p
205d0 42 2c 20 69 54 61 62 29 3c 32 20 29 7b 0a 20 20  B, iTab)<2 ){.  
205e0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
205f0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 2d 3e    }.    if( pB->
20600 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26  op==TK_COLLATE &
20610 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
20620 70 61 72 65 28 70 41 2c 20 70 42 2d 3e 70 4c 65  pare(pA, pB->pLe
20630 66 74 2c 20 69 54 61 62 29 3c 32 20 29 7b 0a 20  ft, iTab)<2 ){. 
20640 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
20650 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
20660 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d  2;.  }.  if( pA-
20670 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op!=TK_COLUMN &
20680 26 20 41 4c 57 41 59 53 28 70 41 2d 3e 6f 70 21  & ALWAYS(pA->op!
20690 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20  =TK_AGG_COLUMN) 
206a0 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  && pA->u.zToken 
206b0 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
206c0 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70  p(pA->u.zToken,p
206d0 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20  B->u.zToken)!=0 
206e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
206f0 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41  pA->op==TK_COLLA
20700 54 45 20 3f 20 31 20 3a 20 32 3b 0a 20 20 20 20  TE ? 1 : 2;.    
20710 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 41 2d  }.  }.  if( (pA-
20720 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
20730 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67  inct)!=(pB->flag
20740 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29  s & EP_Distinct)
20750 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69   ) return 2;.  i
20760 66 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62 69  f( ALWAYS((combi
20770 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 54 6f  nedFlags & EP_To
20780 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 29 20 29 7b 0a  kenOnly)==0) ){.
20790 20 20 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64      if( combined
207a0 46 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  Flags & EP_xIsSe
207b0 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 32 3b  lect ) return 2;
207c0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
207d0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
207e0 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74  pLeft, pB->pLeft
207f0 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e  , iTab) ) return
20800 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   2;.    if( sqli
20810 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
20820 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70  A->pRight, pB->p
20830 52 69 67 68 74 2c 20 69 54 61 62 29 20 29 20 72  Right, iTab) ) r
20840 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
20850 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
20860 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c  Compare(pA->x.pL
20870 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74  ist, pB->x.pList
20880 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e  , iTab) ) return
20890 20 32 3b 0a 20 20 20 20 69 66 28 20 41 4c 57 41   2;.    if( ALWA
208a0 59 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67  YS((combinedFlag
208b0 73 20 26 20 45 50 5f 52 65 64 75 63 65 64 29 3d  s & EP_Reduced)=
208c0 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  =0) ){.      if(
208d0 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42   pA->iColumn!=pB
208e0 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75  ->iColumn ) retu
208f0 72 6e 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20  rn 2;.      if( 
20900 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e  pA->iTable!=pB->
20910 69 54 61 62 6c 65 20 0a 20 20 20 20 20 20 20 26  iTable .       &
20920 26 20 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69  & (pA->iTable!=i
20930 54 61 62 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d  Tab || NEVER(pB-
20940 3e 69 54 61 62 6c 65 3e 3d 30 29 29 20 29 20 72  >iTable>=0)) ) r
20950 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20  eturn 2;.    }. 
20960 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
20970 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
20980 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a  two ExprList obj
20990 65 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20  ects.  Return 0 
209a0 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e  if they are iden
209b0 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f  tical and .** no
209c0 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64  n-zero if they d
209d0 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79  iffer in any way
209e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73  ..**.** If any s
209f0 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20  ubelement of pB 
20a00 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  has Expr.iTable=
20a10 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73  =(-1) then it is
20a20 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63   allowed.** to c
20a30 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20  ompare equal to 
20a40 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c  an equivalent el
20a50 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68  ement in pA with
20a60 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54   Expr.iTable==iT
20a70 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ab..**.** This r
20a80 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74  outine might ret
20a90 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72  urn non-zero for
20aa0 20 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72   equivalent Expr
20ab0 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f  Lists.  The.** o
20ac0 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20  nly consequence 
20ad0 77 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64  will be disabled
20ae0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20   optimizations. 
20af0 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e   But this routin
20b00 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20  e.** must never 
20b10 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20  return 0 if the 
20b20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a  two ExprList obj
20b30 65 63 74 73 20 61 72 65 20 64 69 66 66 65 72 65  ects are differe
20b40 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66  nt, or.** a malf
20b50 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73  unction will res
20b60 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e  ult..**.** Two N
20b70 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65  ULL pointers are
20b80 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
20b90 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74  e the same.  But
20ba0 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a   a NULL pointer.
20bb0 2a 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65 72  ** always differ
20bc0 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c  s from a non-NUL
20bd0 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e  L pointer..*/.in
20be0 74 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  t sqlite3ExprLis
20bf0 74 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73  tCompare(ExprLis
20c00 74 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20  t *pA, ExprList 
20c10 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a  *pB, int iTab){.
20c20 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
20c30 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20  A==0 && pB==0 ) 
20c40 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
20c50 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29  pA==0 || pB==0 )
20c60 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
20c70 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e   pA->nExpr!=pB->
20c80 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 31  nExpr ) return 1
20c90 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
20ca0 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  A->nExpr; i++){.
20cb0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 41      Expr *pExprA
20cc0 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70   = pA->a[i].pExp
20cd0 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  r;.    Expr *pEx
20ce0 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70  prB = pB->a[i].p
20cf0 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41  Expr;.    if( pA
20d00 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
20d10 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  !=pB->a[i].sortO
20d20 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b  rder ) return 1;
20d30 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
20d40 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70  ExprCompare(pExp
20d50 72 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62  rA, pExprB, iTab
20d60 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
20d70 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
20d80 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
20d90 75 65 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f  ue if we can pro
20da0 76 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20  ve the pE2 will 
20db0 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 20 69  always be true i
20dc0 66 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65  f pE1 is.** true
20dd0 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  .  Return false 
20de0 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d  if we cannot com
20df0 70 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20  plete the proof 
20e00 6f 72 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a  or if pE2 might.
20e10 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78  ** be false.  Ex
20e20 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  amples:.**.**   
20e30 20 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20    pE1: x==5     
20e40 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20    pE2: x==5     
20e50 20 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20          Result: 
20e60 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
20e70 20 78 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a   x>0        pE2:
20e80 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20   x==5           
20e90 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a    Result: false.
20ea0 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31  **     pE1: x=21
20eb0 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31         pE2: x=21
20ec0 20 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65 73   OR y=43     Res
20ed0 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20  ult: true.**    
20ee0 20 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20   pE1: x!=123    
20ef0 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e   pE2: x IS NOT N
20f00 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74  ULL    Result: t
20f10 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  rue.**     pE1: 
20f20 78 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20  x!=?1      pE2: 
20f30 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  x IS NOT NULL   
20f40 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
20f50 20 20 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e       pE1: x IS N
20f60 55 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e  ULL  pE2: x IS N
20f70 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c  OT NULL    Resul
20f80 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20  t: false.**     
20f90 70 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20  pE1: x IS ?2    
20fa0 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
20fb0 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61  LL    Reuslt: fa
20fc0 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63  lse.**.** When c
20fd0 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55  omparing TK_COLU
20fe0 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e  MN nodes between
20ff0 20 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66   pE1 and pE2, if
21000 20 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72   pE2 has.** Expr
21010 2e 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61  .iTable<0 then a
21020 73 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75  ssume a table nu
21030 6d 62 65 72 20 67 69 76 65 6e 20 62 79 20 69 54  mber given by iT
21040 61 62 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69  ab..**.** When i
21050 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 20  n doubt, return 
21060 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69 6e  false.  Returnin
21070 67 20 74 72 75 65 20 6d 69 67 68 74 20 67 69 76  g true might giv
21080 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  e a performance.
21090 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 20  ** improvement. 
210a0 20 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73 65   Returning false
210b0 20 6d 69 67 68 74 20 63 61 75 73 65 20 61 20 70   might cause a p
210c0 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63  erformance reduc
210d0 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74 20  tion, but.** it 
210e0 77 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76 65  will always give
210f0 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73   the correct ans
21100 77 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63 65  wer and is hence
21110 20 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a 2f   always safe..*/
21120 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
21130 49 6d 70 6c 69 65 73 45 78 70 72 28 45 78 70 72  ImpliesExpr(Expr
21140 20 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32   *pE1, Expr *pE2
21150 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69  , int iTab){.  i
21160 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
21170 6d 70 61 72 65 28 70 45 31 2c 20 70 45 32 2c 20  mpare(pE1, pE2, 
21180 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20  iTab)==0 ){.    
21190 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
211a0 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f  if( pE2->op==TK_
211b0 4f 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65  OR.   && (sqlite
211c0 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72  3ExprImpliesExpr
211d0 28 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74  (pE1, pE2->pLeft
211e0 2c 20 69 54 61 62 29 0a 20 20 20 20 20 20 20 20  , iTab).        
211f0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45       || sqlite3E
21200 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70  xprImpliesExpr(p
21210 45 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74 2c  E1, pE2->pRight,
21220 20 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20   iTab) ).  ){.  
21230 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
21240 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54    if( pE2->op==T
21250 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20  K_NOTNULL.   && 
21260 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
21270 72 65 28 70 45 31 2d 3e 70 4c 65 66 74 2c 20 70  re(pE1->pLeft, p
21280 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29  E2->pLeft, iTab)
21290 3d 3d 30 0a 20 20 20 26 26 20 28 70 45 31 2d 3e  ==0.   && (pE1->
212a0 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26  op!=TK_ISNULL &&
212b0 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 29   pE1->op!=TK_IS)
212c0 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
212d0 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
212e0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20   0;.}../*.** An 
212f0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
21300 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
21310 75 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74  ure is used by t
21320 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a  he tree walker.*
21330 2a 20 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72  * to count refer
21340 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63  ences to table c
21350 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72  olumns in the ar
21360 67 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a  guments of an .*
21370 2a 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  * aggregate func
21380 74 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74  tion, in order t
21390 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a  o implement the.
213a0 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  ** sqlite3Functi
213b0 6f 6e 54 68 69 73 53 72 63 28 29 20 72 6f 75 74  onThisSrc() rout
213c0 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53  ine..*/.struct S
213d0 72 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c  rcCount {.  SrcL
213e0 69 73 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20  ist *pSrc;   /* 
213f0 4f 6e 65 20 70 61 72 74 69 63 75 6c 61 72 20 46  One particular F
21400 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20  ROM clause in a 
21410 6e 65 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a  nested query */.
21420 20 20 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20    int nThis;    
21430 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21440 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
21450 6c 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73  lumns in pSrcLis
21460 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65  t */.  int nOthe
21470 72 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  r;      /* Numbe
21480 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
21490 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74  to columns in ot
214a0 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73  her FROM clauses
214b0 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f   */.};../*.** Co
214c0 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
214d0 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
214e0 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74  columns..*/.stat
214f0 69 63 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f  ic int exprSrcCo
21500 75 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  unt(Walker *pWal
21510 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
21520 29 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45  ){.  /* The NEVE
21530 52 28 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e  R() on the secon
21540 64 20 74 65 72 6d 20 69 73 20 62 65 63 61 75 73  d term is becaus
21550 65 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  e sqlite3Functio
21560 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 0a 20  nUsesThisSrc(). 
21570 20 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61   ** is always ca
21580 6c 6c 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69  lled before sqli
21590 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
215a0 67 72 65 67 61 74 65 73 28 29 20 61 6e 64 20 73  gregates() and s
215b0 6f 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f  o the.  ** TK_CO
215c0 4c 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79  LUMNs have not y
215d0 65 74 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65  et been converte
215e0 64 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f  d into TK_AGG_CO
215f0 4c 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73  LUMN.  If.  ** s
21600 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73  qlite3FunctionUs
21610 65 73 54 68 69 73 53 72 63 28 29 20 69 73 20 75  esThisSrc() is u
21620 73 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  sed differently 
21630 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74  in the future, t
21640 68 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20  he.  ** NEVER() 
21650 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  will need to be 
21660 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66  removed. */.  if
21670 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
21680 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28  COLUMN || NEVER(
21690 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
216a0 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20  G_COLUMN) ){.   
216b0 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75   int i;.    stru
216c0 63 74 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d  ct SrcCount *p =
216d0 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63   pWalker->u.pSrc
216e0 43 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69  Count;.    SrcLi
216f0 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53  st *pSrc = p->pS
21700 72 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  rc;.    for(i=0;
21710 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69   i<pSrc->nSrc; i
21720 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
21730 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53  Expr->iTable==pS
21740 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  rc->a[i].iCursor
21750 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
21760 20 20 20 20 69 66 28 20 69 3c 70 53 72 63 2d 3e      if( i<pSrc->
21770 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d  nSrc ){.      p-
21780 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65  >nThis++;.    }e
21790 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f  lse{.      p->nO
217a0 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  ther++;.    }.  
217b0 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
217c0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
217d0 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61  * Determine if a
217e0 6e 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65  ny of the argume
217f0 6e 74 73 20 74 6f 20 74 68 65 20 70 45 78 70 72  nts to the pExpr
21800 20 46 75 6e 63 74 69 6f 6e 20 72 65 66 65 72 65   Function refere
21810 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74 2e  nce.** pSrcList.
21820 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
21830 20 74 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f 20   they do.  Also 
21840 72 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  return true if t
21850 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68  he function.** h
21860 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20  as no arguments 
21870 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73  or has only cons
21880 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20  tant arguments. 
21890 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
218a0 20 70 45 78 70 72 0a 2a 2a 20 72 65 66 65 72 65   pExpr.** refere
218b0 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75 74  nces columns but
218c0 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   not columns of 
218d0 74 61 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20  tables found in 
218e0 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74  pSrcList..*/.int
218f0 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
21900 55 73 65 73 54 68 69 73 53 72 63 28 45 78 70 72  UsesThisSrc(Expr
21910 20 2a 70 45 78 70 72 2c 20 53 72 63 4c 69 73 74   *pExpr, SrcList
21920 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a 20 20 57   *pSrcList){.  W
21930 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63  alker w;.  struc
21940 74 20 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b 0a  t SrcCount cnt;.
21950 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
21960 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
21970 54 49 4f 4e 20 29 3b 0a 20 20 6d 65 6d 73 65 74  TION );.  memset
21980 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
21990 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  ));.  w.xExprCal
219a0 6c 62 61 63 6b 20 3d 20 65 78 70 72 53 72 63 43  lback = exprSrcC
219b0 6f 75 6e 74 3b 0a 20 20 77 2e 75 2e 70 53 72 63  ount;.  w.u.pSrc
219c0 43 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20  Count = &cnt;.  
219d0 63 6e 74 2e 70 53 72 63 20 3d 20 70 53 72 63 4c  cnt.pSrc = pSrcL
219e0 69 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73  ist;.  cnt.nThis
219f0 20 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68   = 0;.  cnt.nOth
21a00 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  er = 0;.  sqlite
21a10 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 77  3WalkExprList(&w
21a20 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
21a30 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 2e  );.  return cnt.
21a40 6e 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e  nThis>0 || cnt.n
21a50 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  Other==0;.}../*.
21a60 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
21a70 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67  ment to the pAgg
21a80 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72  Info->aCol[] arr
21a90 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ay.  Return the 
21aa0 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
21ab0 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65  new element.  Re
21ac0 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
21ad0 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63  number if malloc
21ae0 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
21af0 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f  c int addAggInfo
21b00 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a  Column(sqlite3 *
21b10 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e  db, AggInfo *pIn
21b20 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  fo){.  int i;.  
21b30 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71  pInfo->aCol = sq
21b40 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
21b50 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a 20  te(.       db,. 
21b60 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f        pInfo->aCo
21b70 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66  l,.       sizeof
21b80 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29  (pInfo->aCol[0])
21b90 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d  ,.       &pInfo-
21ba0 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  >nColumn,.      
21bb0 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72   &i.  );.  retur
21bc0 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a  n i;.}    ../*.*
21bd0 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
21be0 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49  ent to the pAggI
21bf0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72  nfo->aFunc[] arr
21c00 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ay.  Return the 
21c10 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
21c20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65  new element.  Re
21c30 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
21c40 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63  number if malloc
21c50 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
21c60 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f  c int addAggInfo
21c70 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62  Func(sqlite3 *db
21c80 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f  , AggInfo *pInfo
21c90 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49  ){.  int i;.  pI
21ca0 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c  nfo->aFunc = sql
21cb0 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
21cc0 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20  e(.       db, . 
21cd0 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75        pInfo->aFu
21ce0 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f  nc,.       sizeo
21cf0 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  f(pInfo->aFunc[0
21d00 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66  ]),.       &pInf
21d10 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20  o->nFunc,.      
21d20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72   &i.  );.  retur
21d30 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a  n i;.}    ../*.*
21d40 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78 45  * This is the xE
21d50 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  xprCallback for 
21d60 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20  a tree walker.  
21d70 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a  It is used to.**
21d80 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74   implement sqlit
21d90 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
21da0 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20  regates().  See 
21db0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
21dc0 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20  zeAggregates.** 
21dd0 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
21de0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  nformation..*/.s
21df0 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a  tatic int analyz
21e00 65 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65  eAggregate(Walke
21e10 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
21e20 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
21e30 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
21e40 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d   *pNC = pWalker-
21e50 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20  >u.pNC;.  Parse 
21e60 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  *pParse = pNC->p
21e70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74  Parse;.  SrcList
21e80 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43   *pSrcList = pNC
21e90 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67  ->pSrcList;.  Ag
21ea0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20  gInfo *pAggInfo 
21eb0 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b  = pNC->pAggInfo;
21ec0 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
21ed0 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
21ee0 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
21ef0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
21f00 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  UMN: {.      tes
21f10 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
21f20 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
21f30 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
21f40 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
21f50 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
21f60 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
21f70 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   if the column i
21f80 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
21f90 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
21fa0 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75  OM.      ** clau
21fb0 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67  se of the aggreg
21fc0 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  ate query */.   
21fd0 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53     if( ALWAYS(pS
21fe0 72 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20  rcList!=0) ){.  
21ff0 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
22000 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
22010 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a   = pSrcList->a;.
22020 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
22030 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72   i<pSrcList->nSr
22040 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
22050 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
22060 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
22070 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  pCol;.          
22080 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
22090 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
220a0 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
220b0 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
220c0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
220d0 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e  >iTable==pItem->
220e0 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
220f0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
22100 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
22110 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
22120 70 45 78 70 72 20 72 65 66 65 72 73 20 74 6f 20  pExpr refers to 
22130 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20  a table.        
22140 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 69      ** that is i
22150 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
22160 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61  e of the aggrega
22170 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20 20 20  te query.  .    
22180 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
22190 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61         ** Make a
221a0 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
221b0 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e  column in pAggIn
221c0 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68  fo->aCol[] if th
221d0 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ere.            
221e0 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74  ** is not an ent
221f0 72 79 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ry there already
22200 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
22210 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
22220 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   k;.            
22230 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d  pCol = pAggInfo-
22240 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  >aCol;.         
22250 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41     for(k=0; k<pA
22260 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ggInfo->nColumn;
22270 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   k++, pCol++){. 
22280 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
22290 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70   pCol->iTable==p
222a0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a  Expr->iTable &&.
222b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222c0 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d    pCol->iColumn=
222d0 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
222e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
222f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
22300 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22310 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22320 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41 67 67      if( (k>=pAgg
22330 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20  Info->nColumn). 
22340 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
22350 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 43 6f  k = addAggInfoCo
22360 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  lumn(pParse->db,
22370 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a   pAggInfo))>=0 .
22380 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
22390 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
223a0 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  l = &pAggInfo->a
223b0 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  Col[k];.        
223c0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62        pCol->pTab
223d0 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a   = pExpr->pTab;.
223e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
223f0 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78  ol->iTable = pEx
22400 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
22410 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
22420 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d  iColumn = pExpr-
22430 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
22440 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d          pCol->iM
22450 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
22460 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Mem;.           
22470 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
22480 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
22490 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
224a0 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
224b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
224c0 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f  ( pAggInfo->pGro
224d0 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  upBy ){.        
224e0 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e          int j, n
224f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
22500 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20    ExprList *pGB 
22510 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f  = pAggInfo->pGro
22520 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20  upBy;.          
22530 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
22540 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72  rList_item *pTer
22550 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20  m = pGB->a;.    
22560 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
22570 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pGB->nExpr;.    
22580 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
22590 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70  j=0; j<n; j++, p
225a0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
225b0 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
225c0 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pE = pTerm->pEx
225d0 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
225e0 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
225f0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
22600 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72  E->iTable==pExpr
22610 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20  ->iTable &&.    
22620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22630 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70    pE->iColumn==p
22640 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  Expr->iColumn ){
22650 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22660 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
22670 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20  erColumn = j;.  
22680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22690 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
226a0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
226b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
226c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
226d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
226e0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
226f0 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
22700 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
22710 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20  iSorterColumn = 
22720 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69  pAggInfo->nSorti
22730 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20  ngColumn++;.    
22740 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22750 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22760 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69        /* There i
22770 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66  s now an entry f
22780 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41 67 67  or pExpr in pAgg
22790 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69  Info->aCol[] (ei
227a0 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 20  ther.           
227b0 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20 77   ** because it w
227c0 61 73 20 74 68 65 72 65 20 62 65 66 6f 72 65 20  as there before 
227d0 6f 72 20 62 65 63 61 75 73 65 20 77 65 20 6a 75  or because we ju
227e0 73 74 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a  st created it)..
227f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43              ** C
22800 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78 70 72  onvert the pExpr
22810 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f   to be a TK_AGG_
22820 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67  COLUMN referring
22830 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20   to that.       
22840 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f       ** pAggInfo
22850 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a  ->aCol[] entry..
22860 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
22870 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53             ExprS
22880 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45  etVVAProperty(pE
22890 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  xpr, EP_NoReduce
228a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
228b0 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d  Expr->pAggInfo =
228c0 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20   pAggInfo;.     
228d0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
228e0 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e   = TK_AGG_COLUMN
228f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
22900 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36  xpr->iAgg = (i16
22910 29 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  )k;.            
22920 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
22930 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70   } /* endif pExp
22940 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d  r->iTable==pItem
22950 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20  ->iCursor */.   
22960 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f       } /* end lo
22970 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74  op over pSrcList
22980 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
22990 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
229a0 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ne;.    }.    ca
229b0 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
229c0 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ON: {.      if( 
229d0 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20  (pNC->ncFlags & 
229e0 4e 43 5f 49 6e 41 67 67 46 75 6e 63 29 3d 3d 30  NC_InAggFunc)==0
229f0 0a 20 20 20 20 20 20 20 26 26 20 70 57 61 6c 6b  .       && pWalk
22a00 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 3d  er->walkerDepth=
22a10 3d 70 45 78 70 72 2d 3e 6f 70 32 0a 20 20 20 20  =pExpr->op2.    
22a20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
22a30 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
22a40 70 45 78 70 72 20 69 73 20 61 20 64 75 70 6c 69  pExpr is a dupli
22a50 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20  cate of another 
22a60 61 67 67 72 65 67 61 74 65 20 0a 20 20 20 20 20  aggregate .     
22a70 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74     ** function t
22a80 68 61 74 20 69 73 20 61 6c 72 65 61 64 79 20 69  hat is already i
22a90 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73  n the pAggInfo s
22aa0 74 72 75 63 74 75 72 65 0a 20 20 20 20 20 20 20  tructure.       
22ab0 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75   */.        stru
22ac0 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
22ad0 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66  *pItem = pAggInf
22ae0 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20  o->aFunc;.      
22af0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67    for(i=0; i<pAg
22b00 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
22b10 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
22b20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
22b30 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49  e3ExprCompare(pI
22b40 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70  tem->pExpr, pExp
22b50 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  r, -1)==0 ){.   
22b60 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
22b70 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22b80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
22b90 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e  ( i>=pAggInfo->n
22ba0 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Func ){.        
22bb0 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72    /* pExpr is or
22bc0 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20  iginal.  Make a 
22bd0 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67  new entry in pAg
22be0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20  gInfo->aFunc[]. 
22bf0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
22c00 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45        u8 enc = E
22c10 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  NC(pParse->db);.
22c20 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 61 64            i = ad
22c30 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61  dAggInfoFunc(pPa
22c40 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66  rse->db, pAggInf
22c50 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  o);.          if
22c60 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( i>=0 ){.      
22c70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
22c80 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
22c90 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
22ca0 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ct) );.         
22cb0 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67     pItem = &pAgg
22cc0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a  Info->aFunc[i];.
22cd0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
22ce0 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
22cf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
22d00 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50  tem->iMem = ++pP
22d10 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
22d20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
22d30 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
22d40 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
22d50 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
22d60 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63      pItem->pFunc
22d70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
22d80 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
22d90 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
22da0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a        pExpr->u.z
22db0 54 6f 6b 65 6e 2c 20 73 71 6c 69 74 65 33 53 74  Token, sqlite3St
22dc0 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e  rlen30(pExpr->u.
22dd0 7a 54 6f 6b 65 6e 29 2c 0a 20 20 20 20 20 20 20  zToken),.       
22de0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
22df0 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45 78  r->x.pList ? pEx
22e00 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
22e10 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b  pr : 0, enc, 0);
22e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
22e30 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
22e40 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  EP_Distinct ){. 
22e50 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
22e60 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  em->iDistinct = 
22e70 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
22e80 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
22e90 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
22ea0 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63   pItem->iDistinc
22eb0 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  t = -1;.        
22ec0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
22ed0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
22ee0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70      /* Make pExp
22ef0 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61  r point to the a
22f00 70 70 72 6f 70 72 69 61 74 65 20 70 41 67 67 49  ppropriate pAggI
22f10 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74  nfo->aFunc[] ent
22f20 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ry.        */.  
22f30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
22f40 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
22f50 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
22f60 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
22f70 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 53 65  ;.        ExprSe
22f80 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78  tVVAProperty(pEx
22f90 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29  pr, EP_NoReduce)
22fa0 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
22fb0 3e 69 41 67 67 20 3d 20 28 69 31 36 29 69 3b 0a  >iAgg = (i16)i;.
22fc0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
22fd0 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e  AggInfo = pAggIn
22fe0 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  fo;.        retu
22ff0 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
23000 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23010 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
23020 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
23030 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
23040 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
23050 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e  .}.static int an
23060 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49  alyzeAggregatesI
23070 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a  nSelect(Walker *
23080 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
23090 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55  *pSelect){.  UNU
230a0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 57  SED_PARAMETER(pW
230b0 61 6c 6b 65 72 29 3b 0a 20 20 55 4e 55 53 45 44  alker);.  UNUSED
230c0 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65  _PARAMETER(pSele
230d0 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52  ct);.  return WR
230e0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
230f0 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
23100 20 70 45 78 70 72 20 65 78 70 72 65 73 73 69 6f   pExpr expressio
23110 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67  n looking for ag
23120 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
23130 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72  s and.** for var
23140 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64  iables that need
23150 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
23160 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74  AggInfo object t
23170 68 61 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66  hat pNC->pAggInf
23180 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e 20  o.** points to. 
23190 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72   Additional entr
231a0 69 65 73 20 61 72 65 20 6d 61 64 65 20 6f 6e 20  ies are made on 
231b0 74 68 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65  the AggInfo obje
231c0 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73 61  ct as.** necessa
231d0 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
231e0 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
231f0 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  ly be called aft
23200 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  er the expressio
23210 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e  n has been.** an
23220 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65  alyzed by sqlite
23230 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
23240 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  s()..*/.void sql
23250 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
23260 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f  ggregates(NameCo
23270 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
23280 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b   *pExpr){.  Walk
23290 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26  er w;.  memset(&
232a0 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29  w, 0, sizeof(w))
232b0 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
232c0 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67  ack = analyzeAgg
232d0 72 65 67 61 74 65 3b 0a 20 20 77 2e 78 53 65 6c  regate;.  w.xSel
232e0 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e  ectCallback = an
232f0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49  alyzeAggregatesI
23300 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e 75 2e 70  nSelect;.  w.u.p
23310 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61 73 73 65  NC = pNC;.  asse
23320 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  rt( pNC->pSrcLis
23330 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  t!=0 );.  sqlite
23340 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45  3WalkExpr(&w, pE
23350 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  xpr);.}../*.** C
23360 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41  all sqlite3ExprA
23370 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
23380 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78 70  () for every exp
23390 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a  ression in an.**
233a0 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
233b0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
233c0 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a  mber of errors..
233d0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
233e0 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20  r is found, the 
233f0 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74 20  analysis is cut 
23400 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  short..*/.void s
23410 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
23420 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e  eAggList(NameCon
23430 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c  text *pNC, ExprL
23440 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73  ist *pList){.  s
23450 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
23460 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
23470 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
23480 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65   ){.    for(pIte
23490 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
234a0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
234b0 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
234c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
234d0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
234e0 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70  es(pNC, pItem->p
234f0 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Expr);.    }.  }
23500 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
23510 74 65 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20  te a single new 
23520 72 65 67 69 73 74 65 72 20 66 6f 72 20 75 73 65  register for use
23530 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e   to hold some in
23540 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
23550 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
23560 33 47 65 74 54 65 6d 70 52 65 67 28 50 61 72 73  3GetTempReg(Pars
23570 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66  e *pParse){.  if
23580 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  ( pParse->nTempR
23590 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  eg==0 ){.    ret
235a0 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  urn ++pParse->nM
235b0 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  em;.  }.  return
235c0 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
235d0 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d  g[--pParse->nTem
235e0 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pReg];.}../*.** 
235f0 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 72 65 67  Deallocate a reg
23600 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76  ister, making av
23610 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73  ailable for reus
23620 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  e for some other
23630 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a  .** purpose..**.
23640 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72  ** If a register
23650 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 62 65   is currently be
23660 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 65 20  ing used by the 
23670 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c 20 74 68  column cache, th
23680 65 6e 0a 2a 2a 20 74 68 65 20 64 61 6c 6c 6f 63  en.** the dalloc
23690 61 74 69 6f 6e 20 69 73 20 64 65 66 65 72 72 65  ation is deferre
236a0 64 20 75 6e 74 69 6c 20 74 68 65 20 63 6f 6c 75  d until the colu
236b0 6d 6e 20 63 61 63 68 65 20 6c 69 6e 65 20 74 68  mn cache line th
236c0 61 74 20 75 73 65 73 0a 2a 2a 20 74 68 65 20 72  at uses.** the r
236d0 65 67 69 73 74 65 72 20 62 65 63 6f 6d 65 73 20  egister becomes 
236e0 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  stale..*/.void s
236f0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
23700 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72  pReg(Parse *pPar
23710 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  se, int iReg){. 
23720 20 69 66 28 20 69 52 65 67 20 26 26 20 70 50 61   if( iReg && pPa
23730 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72  rse->nTempReg<Ar
23740 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e  raySize(pParse->
23750 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20  aTempReg) ){.   
23760 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75   int i;.    stru
23770 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
23780 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  .    for(i=0, p=
23790 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
237a0 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
237b0 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
237c0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
237d0 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20  iReg==iReg ){.  
237e0 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67        p->tempReg
237f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
23800 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
23810 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
23820 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d  aTempReg[pParse-
23830 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69  >nTempReg++] = i
23840 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  Reg;.  }.}../*.*
23850 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65  * Allocate or de
23860 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b  allocate a block
23870 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73 65 63 75   of nReg consecu
23880 74 69 76 65 20 72 65 67 69 73 74 65 72 73 0a 2a  tive registers.*
23890 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74  /.int sqlite3Get
238a0 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20  TempRange(Parse 
238b0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 52 65  *pParse, int nRe
238c0 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  g){.  int i, n;.
238d0 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52    i = pParse->iR
238e0 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70  angeReg;.  n = p
238f0 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
23900 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20  ;.  if( nReg<=n 
23910 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
23920 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68  usedAsColumnCach
23930 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e  e(pParse, i, i+n
23940 2d 31 29 20 29 3b 0a 20 20 20 20 70 50 61 72 73  -1) );.    pPars
23950 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d 20  e->iRangeReg += 
23960 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65  nReg;.    pParse
23970 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e  ->nRangeReg -= n
23980 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Reg;.  }else{.  
23990 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d    i = pParse->nM
239a0 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
239b0 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a  ->nMem += nReg;.
239c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
239d0 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  }.void sqlite3Re
239e0 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 50  leaseTempRange(P
239f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
23a00 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67  t iReg, int nReg
23a10 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  ){.  sqlite3Expr
23a20 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72  CacheRemove(pPar
23a30 73 65 2c 20 69 52 65 67 2c 20 6e 52 65 67 29 3b  se, iReg, nReg);
23a40 0a 20 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72  .  if( nReg>pPar
23a50 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b  se->nRangeReg ){
23a60 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61  .    pParse->nRa
23a70 6e 67 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20  ngeReg = nReg;. 
23a80 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67     pParse->iRang
23a90 65 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d  eReg = iReg;.  }
23aa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
23ab0 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  ll temporary reg
23ac0 69 73 74 65 72 73 20 61 73 20 62 65 69 6e 67 20  isters as being 
23ad0 75 6e 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  unavailable for 
23ae0 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  reuse..*/.void s
23af0 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52  qlite3ClearTempR
23b00 65 67 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  egCache(Parse *p
23b10 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65  Parse){.  pParse
23b20 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a  ->nTempReg = 0;.
23b30 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65    pParse->nRange
23b40 52 65 67 20 3d 20 30 3b 0a 7d 0a                 Reg = 0;.}.