/ Hex Artifact Content
Login

Artifact b77efad2426619473b7762146bc9036325c263f9:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 73   clause expresss
0370: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0380: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0390: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
03a0: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
03b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
03c0: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
03d0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
03e0: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
03f0: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0400: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
0410: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
0420: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
0430: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
0440: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
0450: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
0460: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0470: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0480: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0490: 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
04a0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c    if( op==TK_SEL
04b0: 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ECT ){.    asser
04c0: 74 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26  t( pExpr->flags&
04d0: 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b 0a  EP_xIsSelect );.
04e0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
04f0: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
0500: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  Expr->x.pSelect-
0510: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
0520: 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  xpr);.  }.#ifnde
0530: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  f SQLITE_OMIT_CA
0540: 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  ST.  if( op==TK_
0550: 43 41 53 54 20 29 7b 0a 20 20 20 20 61 73 73 65  CAST ){.    asse
0560: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
0570: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
0580: 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
0590: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41 66  return sqlite3Af
05a0: 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72  finityType(pExpr
05b0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a  ->u.zToken, 0);.
05c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
05d0: 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c   (op==TK_AGG_COL
05e0: 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f  UMN || op==TK_CO
05f0: 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52  LUMN || op==TK_R
0600: 45 47 49 53 54 45 52 29 20 0a 20 20 20 26 26 20  EGISTER) .   && 
0610: 70 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 0a 20  pExpr->pTab!=0. 
0620: 20 29 7b 0a 20 20 20 20 2f 2a 20 6f 70 3d 3d 54   ){.    /* op==T
0630: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 45  K_REGISTER && pE
0640: 78 70 72 2d 3e 70 54 61 62 21 3d 30 20 68 61 70  xpr->pTab!=0 hap
0650: 70 65 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20  pens when pExpr 
0660: 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  was originally. 
0670: 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d     ** a TK_COLUM
0680: 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f  N but was previo
0690: 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61  usly evaluated a
06a0: 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72  nd cached in a r
06b0: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 69  egister */.    i
06c0: 6e 74 20 6a 20 3d 20 70 45 78 70 72 2d 3e 69 43  nt j = pExpr->iC
06d0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6a  olumn;.    if( j
06e0: 3c 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  <0 ) return SQLI
06f0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a  TE_AFF_INTEGER;.
0700: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
0710: 72 2d 3e 70 54 61 62 20 26 26 20 6a 3c 70 45 78  r->pTab && j<pEx
0720: 70 72 2d 3e 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  pr->pTab->nCol )
0730: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 45 78  ;.    return pEx
0740: 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  pr->pTab->aCol[j
0750: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 7d 0a  ].affinity;.  }.
0760: 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
0770: 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a  affinity;.}../*.
0780: 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61  ** Set the colla
0790: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
07a0: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  r expression pEx
07b0: 70 72 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c  pr to be the col
07c0: 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
07d0: 63 65 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b  ce named by pTok
07e0: 65 6e 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70  en.   Return a p
07f0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20  ointer to a new 
0800: 45 78 70 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a  Expr node that.*
0810: 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  * implements the
0820: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
0830: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  r..**.** If a me
0840: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
0850: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
0860: 61 74 20 66 61 63 74 20 69 73 20 72 65 63 6f 72  at fact is recor
0870: 64 65 64 20 69 6e 20 70 50 61 72 73 65 2d 3e 64  ded in pParse->d
0880: 62 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 45 78  b.** and the pEx
0890: 70 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  pr parameter is 
08a0: 72 65 74 75 72 6e 65 64 20 75 6e 63 68 61 6e 67  returned unchang
08b0: 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ed..*/.Expr *sql
08c0: 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
08d0: 74 65 54 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70  teToken(Parse *p
08e0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
08f0: 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c  pr, Token *pColl
0900: 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 43 6f  Name){.  if( pCo
0910: 6c 6c 4e 61 6d 65 2d 3e 6e 3e 30 20 29 7b 0a 20  llName->n>0 ){. 
0920: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20     Expr *pNew = 
0930: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
0940: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f  (pParse->db, TK_
0950: 43 4f 4c 4c 41 54 45 2c 20 70 43 6f 6c 6c 4e 61  COLLATE, pCollNa
0960: 6d 65 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  me, 1);.    if( 
0970: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e  pNew ){.      pN
0980: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78 70  ew->pLeft = pExp
0990: 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  r;.      pNew->f
09a0: 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61  lags |= EP_Colla
09b0: 74 65 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20  te|EP_Skip;.    
09c0: 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a    pExpr = pNew;.
09d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
09e0: 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70 72  rn pExpr;.}.Expr
09f0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64 64   *sqlite3ExprAdd
0a00: 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 50 61  CollateString(Pa
0a10: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
0a20: 72 20 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20  r *pExpr, const 
0a30: 63 68 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f 6b  char *zC){.  Tok
0a40: 65 6e 20 73 3b 0a 20 20 61 73 73 65 72 74 28 20  en s;.  assert( 
0a50: 7a 43 21 3d 30 20 29 3b 0a 20 20 73 2e 7a 20 3d  zC!=0 );.  s.z =
0a60: 20 7a 43 3b 0a 20 20 73 2e 6e 20 3d 20 73 71 6c   zC;.  s.n = sql
0a70: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73 2e 7a  ite3Strlen30(s.z
0a80: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
0a90: 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
0aa0: 65 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 70  eToken(pParse, p
0ab0: 45 78 70 72 2c 20 26 73 29 3b 0a 7d 0a 0a 2f 2a  Expr, &s);.}../*
0ac0: 0a 2a 2a 20 53 6b 69 70 20 6f 76 65 72 20 61 6e  .** Skip over an
0ad0: 79 20 54 4b 5f 43 4f 4c 4c 41 54 45 20 6f 72 20  y TK_COLLATE or 
0ae0: 54 4b 5f 41 53 20 6f 70 65 72 61 74 6f 72 73 20  TK_AS operators 
0af0: 61 6e 64 20 61 6e 79 20 75 6e 6c 69 6b 65 6c 79  and any unlikely
0b00: 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c 69 68  ().** or likelih
0b10: 6f 6f 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 61  ood() function a
0b20: 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e  t the root of an
0b30: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a   expression..*/.
0b40: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
0b50: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 45 78 70  rSkipCollate(Exp
0b60: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 77 68 69  r *pExpr){.  whi
0b70: 6c 65 28 20 70 45 78 70 72 20 26 26 20 45 78 70  le( pExpr && Exp
0b80: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
0b90: 70 72 2c 20 45 50 5f 53 6b 69 70 29 20 29 7b 0a  pr, EP_Skip) ){.
0ba0: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
0bb0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
0bc0: 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20  P_Unlikely) ){. 
0bd0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
0be0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
0bf0: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
0c00: 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  t) );.      asse
0c10: 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  rt( pExpr->x.pLi
0c20: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
0c30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
0c40: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54  pr->op==TK_FUNCT
0c50: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 45 78  ION );.      pEx
0c60: 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  pr = pExpr->x.pL
0c70: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
0c80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
0c90: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
0ca0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
0cb0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
0cc0: 5f 41 53 20 29 3b 0a 20 20 20 20 20 20 70 45 78  _AS );.      pEx
0cd0: 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  pr = pExpr->pLef
0ce0: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a  t;.    }.  }   .
0cf0: 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a    return pExpr;.
0d00: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
0d10: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
0d20: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65  quence for the e
0d30: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
0d40: 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20   If.** there is 
0d50: 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61  no defined colla
0d60: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 72  ting sequence, r
0d70: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  eturn NULL..**.*
0d80: 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
0d90: 73 65 71 75 65 6e 63 65 20 6d 69 67 68 74 20 62  sequence might b
0da0: 65 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  e determined by 
0db0: 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  a COLLATE operat
0dc0: 6f 72 0a 2a 2a 20 6f 72 20 62 79 20 74 68 65 20  or.** or by the 
0dd0: 70 72 65 73 65 6e 63 65 20 6f 66 20 61 20 63 6f  presence of a co
0de0: 6c 75 6d 6e 20 77 69 74 68 20 61 20 64 65 66 69  lumn with a defi
0df0: 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ned collating se
0e00: 71 75 65 6e 63 65 2e 0a 2a 2a 20 43 4f 4c 4c 41  quence..** COLLA
0e10: 54 45 20 6f 70 65 72 61 74 6f 72 73 20 74 61 6b  TE operators tak
0e20: 65 20 66 69 72 73 74 20 70 72 65 63 65 64 65 6e  e first preceden
0e30: 63 65 2e 20 20 4c 65 66 74 20 6f 70 65 72 61 6e  ce.  Left operan
0e40: 64 73 20 74 61 6b 65 0a 2a 2a 20 70 72 65 63 65  ds take.** prece
0e50: 64 65 6e 63 65 20 6f 76 65 72 20 72 69 67 68 74  dence over right
0e60: 20 6f 70 65 72 61 6e 64 73 2e 0a 2a 2f 0a 43 6f   operands..*/.Co
0e70: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 45 78  llSeq *sqlite3Ex
0e80: 70 72 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  prCollSeq(Parse 
0e90: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
0ea0: 45 78 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  Expr){.  sqlite3
0eb0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
0ec0: 62 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  b;.  CollSeq *pC
0ed0: 6f 6c 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72 20  oll = 0;.  Expr 
0ee0: 2a 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 77 68  *p = pExpr;.  wh
0ef0: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 6e  ile( p ){.    in
0f00: 74 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20  t op = p->op;.  
0f10: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53    if( op==TK_CAS
0f20: 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c 55  T || op==TK_UPLU
0f30: 53 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 70  S ){.      p = p
0f40: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 63  ->pLeft;.      c
0f50: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
0f60: 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 4f     if( op==TK_CO
0f70: 4c 4c 41 54 45 20 7c 7c 20 28 6f 70 3d 3d 54 4b  LLATE || (op==TK
0f80: 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e  _REGISTER && p->
0f90: 6f 70 32 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 29  op2==TK_COLLATE)
0fa0: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20   ){.      pColl 
0fb0: 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c  = sqlite3GetColl
0fc0: 53 65 71 28 70 50 61 72 73 65 2c 20 45 4e 43 28  Seq(pParse, ENC(
0fd0: 64 62 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54 6f  db), 0, p->u.zTo
0fe0: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ken);.      brea
0ff0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
1000: 20 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20 20   p->pTab!=0.    
1010: 20 26 26 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f   && (op==TK_AGG_
1020: 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b  COLUMN || op==TK
1030: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20  _COLUMN.        
1040: 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49    || op==TK_REGI
1050: 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 54  STER || op==TK_T
1060: 52 49 47 47 45 52 29 0a 20 20 20 20 29 7b 0a 20  RIGGER).    ){. 
1070: 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52       /* op==TK_R
1080: 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e 70 54  EGISTER && p->pT
1090: 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20 77 68  ab!=0 happens wh
10a0: 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f 72 69  en pExpr was ori
10b0: 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a  ginally.      **
10c0: 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74   a TK_COLUMN but
10d0: 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
10e0: 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61  evaluated and ca
10f0: 63 68 65 64 20 69 6e 20 61 20 72 65 67 69 73 74  ched in a regist
1100: 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  er */.      int 
1110: 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  j = p->iColumn;.
1120: 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 30 20 29        if( j>=0 )
1130: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
1140: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 2d  char *zColl = p-
1150: 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  >pTab->aCol[j].z
1160: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43  Coll;.        pC
1170: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
1180: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
1190: 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b  (db), zColl, 0);
11a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
11b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
11c0: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45  if( p->flags & E
11d0: 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20  P_Collate ){.   
11e0: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 2d     if( ALWAYS(p-
11f0: 3e 70 4c 65 66 74 29 20 26 26 20 28 70 2d 3e 70  >pLeft) && (p->p
1200: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  Left->flags & EP
1210: 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a  _Collate)!=0 ){.
1220: 20 20 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70          p = p->p
1230: 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Left;.      }els
1240: 65 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70  e{.        p = p
1250: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
1260: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1270: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1280: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
1290: 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50  3CheckCollSeq(pP
12a0: 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20  arse, pColl) ){ 
12b0: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a  .    pColl = 0;.
12c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f    }.  return pCo
12d0: 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78  ll;.}../*.** pEx
12e0: 70 72 20 69 73 20 61 6e 20 6f 70 65 72 61 6e 64  pr is an operand
12f0: 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   of a comparison
1300: 20 6f 70 65 72 61 74 6f 72 2e 20 20 61 66 66 32   operator.  aff2
1310: 20 69 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20   is the.** type 
1320: 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  affinity of the 
1330: 6f 74 68 65 72 20 6f 70 65 72 61 6e 64 2e 20 20  other operand.  
1340: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
1350: 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79 70 65  urns the.** type
1360: 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73   affinity that s
1370: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f  hould be used fo
1380: 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  r the comparison
1390: 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68   operator..*/.ch
13a0: 61 72 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  ar sqlite3Compar
13b0: 65 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  eAffinity(Expr *
13c0: 70 45 78 70 72 2c 20 63 68 61 72 20 61 66 66 32  pExpr, char aff2
13d0: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 31 20 3d  ){.  char aff1 =
13e0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
13f0: 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20 69  nity(pExpr);.  i
1400: 66 28 20 61 66 66 31 20 26 26 20 61 66 66 32 20  f( aff1 && aff2 
1410: 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68 20 73  ){.    /* Both s
1420: 69 64 65 73 20 6f 66 20 74 68 65 20 63 6f 6d 70  ides of the comp
1430: 61 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d  arison are colum
1440: 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61 73 20 6e  ns. If one has n
1450: 75 6d 65 72 69 63 0a 20 20 20 20 2a 2a 20 61 66  umeric.    ** af
1460: 66 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61 74  finity, use that
1470: 2e 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20  . Otherwise use 
1480: 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20  no affinity..   
1490: 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
14a0: 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
14b0: 6e 69 74 79 28 61 66 66 31 29 20 7c 7c 20 73 71  nity(aff1) || sq
14c0: 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66  lite3IsNumericAf
14d0: 66 69 6e 69 74 79 28 61 66 66 32 29 20 29 7b 0a  finity(aff2) ){.
14e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
14f0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
1500: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1510: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1520: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a  AFF_NONE;.    }.
1530: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66    }else if( !aff
1540: 31 20 26 26 20 21 61 66 66 32 20 29 7b 0a 20 20  1 && !aff2 ){.  
1550: 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 73 69 64    /* Neither sid
1560: 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  e of the compari
1570: 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  son is a column.
1580: 20 20 43 6f 6d 70 61 72 65 20 74 68 65 0a 20 20    Compare the.  
1590: 20 20 2a 2a 20 72 65 73 75 6c 74 73 20 64 69 72    ** results dir
15a0: 65 63 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ectly..    */.  
15b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15c0: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73  AFF_NONE;.  }els
15d0: 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69  e{.    /* One si
15e0: 64 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20  de is a column, 
15f0: 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74  the other is not
1600: 2e 20 55 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  . Use the column
1610: 73 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20  s affinity. */. 
1620: 20 20 20 61 73 73 65 72 74 28 20 61 66 66 31 3d     assert( aff1=
1630: 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b  =0 || aff2==0 );
1640: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 61 66 66  .    return (aff
1650: 31 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d  1 + aff2);.  }.}
1660: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
1670: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
1680: 65 72 61 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  erator.  Return 
1690: 74 68 65 20 74 79 70 65 20 61 66 66 69 6e 69 74  the type affinit
16a0: 79 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a  y that should.**
16b0: 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20 62   be applied to b
16c0: 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 70 72 69  oth operands pri
16d0: 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74 68 65 20  or to doing the 
16e0: 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73  comparison..*/.s
16f0: 74 61 74 69 63 20 63 68 61 72 20 63 6f 6d 70 61  tatic char compa
1700: 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 45 78  risonAffinity(Ex
1710: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68  pr *pExpr){.  ch
1720: 61 72 20 61 66 66 3b 0a 20 20 61 73 73 65 72 74  ar aff;.  assert
1730: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1740: 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  EQ || pExpr->op=
1750: 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d  =TK_IN || pExpr-
1760: 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20  >op==TK_LT ||.  
1770: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
1780: 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70  p==TK_GT || pExp
1790: 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20  r->op==TK_GE || 
17a0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45  pExpr->op==TK_LE
17b0: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45   ||.          pE
17c0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c  xpr->op==TK_NE |
17d0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
17e0: 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IS || pExpr->op=
17f0: 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 61  =TK_ISNOT );.  a
1800: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
1810: 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20 73  eft );.  aff = s
1820: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
1830: 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ty(pExpr->pLeft)
1840: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70  ;.  if( pExpr->p
1850: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66 66  Right ){.    aff
1860: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
1870: 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  eAffinity(pExpr-
1880: 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a 20  >pRight, aff);. 
1890: 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72 48   }else if( ExprH
18a0: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
18b0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
18c0: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c  ){.    aff = sql
18d0: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
18e0: 69 74 79 28 70 45 78 70 72 2d 3e 78 2e 70 53 65  ity(pExpr->x.pSe
18f0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
1900: 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a  0].pExpr, aff);.
1910: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66    }else if( !aff
1920: 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51   ){.    aff = SQ
1930: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
1940: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b   }.  return aff;
1950: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
1960: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
1970: 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20  expression, eg. 
1980: 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e  '=', '<', IN(...
1990: 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66  ) etc..** idx_af
19a0: 66 69 6e 69 74 79 20 69 73 20 74 68 65 20 61 66  finity is the af
19b0: 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64  finity of an ind
19c0: 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74  exed column. Ret
19d0: 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74  urn true.** if t
19e0: 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 61 66  he index with af
19f0: 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e  finity idx_affin
1a00: 69 74 79 20 6d 61 79 20 62 65 20 75 73 65 64 20  ity may be used 
1a10: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20  to implement.** 
1a20: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
1a30: 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20  n pExpr..*/.int 
1a40: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
1a50: 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78  nityOk(Expr *pEx
1a60: 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66  pr, char idx_aff
1a70: 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61  inity){.  char a
1a80: 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41  ff = comparisonA
1a90: 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a  ffinity(pExpr);.
1aa0: 20 20 73 77 69 74 63 68 28 20 61 66 66 20 29 7b    switch( aff ){
1ab0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1ac0: 5f 41 46 46 5f 4e 4f 4e 45 3a 0a 20 20 20 20 20  _AFF_NONE:.     
1ad0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63   return 1;.    c
1ae0: 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  ase SQLITE_AFF_T
1af0: 45 58 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72  EXT:.      retur
1b00: 6e 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d  n idx_affinity==
1b10: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
1b20: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
1b30: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1b40: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
1b50: 69 74 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79  ity(idx_affinity
1b60: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1b70: 52 65 74 75 72 6e 20 74 68 65 20 50 35 20 76 61  Return the P5 va
1b80: 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  lue that should 
1b90: 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 62 69  be used for a bi
1ba0: 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a  nary comparison.
1bb0: 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71  ** opcode (OP_Eq
1bc0: 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73  , OP_Ge etc.) us
1bd0: 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45  ed to compare pE
1be0: 78 70 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e  xpr1 and pExpr2.
1bf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69  .*/.static u8 bi
1c00: 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78  naryCompareP5(Ex
1c10: 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72  pr *pExpr1, Expr
1c20: 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75   *pExpr2, int ju
1c30: 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20  mpIfNull){.  u8 
1c40: 61 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69  aff = (char)sqli
1c50: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
1c60: 70 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d  pExpr2);.  aff =
1c70: 20 28 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70   (u8)sqlite3Comp
1c80: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
1c90: 72 31 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a  r1, aff) | (u8)j
1ca0: 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74  umpIfNull;.  ret
1cb0: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
1cc0: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1cd0: 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74  er to the collat
1ce0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61  ion sequence tha
1cf0: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
1d00: 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20   by.** a binary 
1d10: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
1d20: 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c  tor comparing pL
1d30: 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a  eft and pRight..
1d40: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66  **.** If the lef
1d50: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
1d60: 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  n has a collatin
1d70: 67 20 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c  g sequence type,
1d80: 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75   then it is.** u
1d90: 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74  sed. Otherwise t
1da0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
1db0: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69  uence for the ri
1dc0: 67 68 74 20 68 61 6e 64 20 65 78 70 72 65 73 73  ght hand express
1dd0: 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20  ion.** is used, 
1de0: 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 28  or the default (
1df0: 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68  BINARY) if neith
1e00: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  er expression ha
1e10: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a  s a collating.**
1e20: 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67   type..**.** Arg
1e30: 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62 75  ument pRight (bu
1e40: 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79  t not pLeft) may
1e50: 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74   be a null point
1e60: 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  er. In this case
1e70: 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63  ,.** it is not c
1e80: 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f  onsidered..*/.Co
1e90: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69  llSeq *sqlite3Bi
1ea0: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
1eb0: 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  eq(.  Parse *pPa
1ec0: 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c  rse, .  Expr *pL
1ed0: 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52  eft, .  Expr *pR
1ee0: 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65  ight.){.  CollSe
1ef0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65  q *pColl;.  asse
1f00: 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69  rt( pLeft );.  i
1f10: 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  f( pLeft->flags 
1f20: 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a  & EP_Collate ){.
1f30: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1f40: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
1f50: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
1f60: 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68   }else if( pRigh
1f70: 74 20 26 26 20 28 70 52 69 67 68 74 2d 3e 66 6c  t && (pRight->fl
1f80: 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
1f90: 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c  )!=0 ){.    pCol
1fa0: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
1fb0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1fc0: 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  Right);.  }else{
1fd0: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
1fe0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1ff0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
2000: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
2010: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  {.      pColl = 
2020: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
2030: 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  eq(pParse, pRigh
2040: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
2050: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
2060: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
2070: 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61  code for a compa
2080: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
2090: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
20a0: 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72  deCompare(.  Par
20b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
20c0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 28 61  * The parsing (a
20d0: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
20e0: 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ng) context */. 
20f0: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20   Expr *pLeft,   
2100: 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f     /* The left o
2110: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72  perand */.  Expr
2120: 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a   *pRight,     /*
2130: 20 54 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   The right opera
2140: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f  nd */.  int opco
2150: 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  de,       /* The
2160: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f   comparison opco
2170: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c  de */.  int in1,
2180: 20 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67   int in2, /* Reg
2190: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70  ister holding op
21a0: 65 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20  erands */.  int 
21b0: 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  dest,         /*
21c0: 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 72   Jump here if tr
21d0: 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75  ue.  */.  int ju
21e0: 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49  mpIfNull    /* I
21f0: 66 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20  f true, jump if 
2200: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
2210: 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69  s NULL */.){.  i
2220: 6e 74 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64  nt p5;.  int add
2230: 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34  r;.  CollSeq *p4
2240: 3b 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65  ;..  p4 = sqlite
2250: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
2260: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
2270: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
2280: 70 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61  p5 = binaryCompa
2290: 72 65 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67  reP5(pLeft, pRig
22a0: 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  ht, jumpIfNull);
22b0: 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  .  addr = sqlite
22c0: 33 56 64 62 65 41 64 64 4f 70 34 28 70 50 61 72  3VdbeAddOp4(pPar
22d0: 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64  se->pVdbe, opcod
22e0: 65 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e  e, in2, dest, in
22f0: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
2310: 6f 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c  oid*)p4, P4_COLL
2320: 53 45 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  SEQ);.  sqlite3V
2330: 64 62 65 43 68 61 6e 67 65 50 35 28 70 50 61 72  dbeChangeP5(pPar
2340: 73 65 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70  se->pVdbe, (u8)p
2350: 35 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  5);.  return add
2360: 72 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  r;.}..#if SQLITE
2370: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
2380: 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  0./*.** Check th
2390: 61 74 20 61 72 67 75 6d 65 6e 74 20 6e 48 65 69  at argument nHei
23a0: 67 68 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ght is less than
23b0: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
23c0: 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78 70 72   maximum.** expr
23d0: 65 73 73 69 6f 6e 20 64 65 70 74 68 20 61 6c 6c  ession depth all
23e0: 6f 77 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  owed. If it is n
23f0: 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  ot, leave an err
2400: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 0a 2a 2a  or message in.**
2410: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20   pParse..*/.int 
2420: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
2430: 48 65 69 67 68 74 28 50 61 72 73 65 20 2a 70 50  Height(Parse *pP
2440: 61 72 73 65 2c 20 69 6e 74 20 6e 48 65 69 67 68  arse, int nHeigh
2450: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
2460: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
2470: 6d 78 48 65 69 67 68 74 20 3d 20 70 50 61 72 73  mxHeight = pPars
2480: 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  e->db->aLimit[SQ
2490: 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f  LITE_LIMIT_EXPR_
24a0: 44 45 50 54 48 5d 3b 0a 20 20 69 66 28 20 6e 48  DEPTH];.  if( nH
24b0: 65 69 67 68 74 3e 6d 78 48 65 69 67 68 74 20 29  eight>mxHeight )
24c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
24d0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
24e0: 20 20 20 20 20 20 22 45 78 70 72 65 73 73 69 6f        "Expressio
24f0: 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c 61  n tree is too la
2500: 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65 70  rge (maximum dep
2510: 74 68 20 25 64 29 22 2c 20 6d 78 48 65 69 67 68  th %d)", mxHeigh
2520: 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20  t.    );.    rc 
2530: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
2540: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2550: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  .}../* The follo
2560: 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74  wing three funct
2570: 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45 78  ions, heightOfEx
2580: 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45 78  pr(), heightOfEx
2590: 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64 20  prList().** and 
25a0: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 29  heightOfSelect()
25b0: 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 65  , are used to de
25c0: 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78 69  termine the maxi
25d0: 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f 66  mum height.** of
25e0: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
25f0: 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64 20  tree referenced 
2600: 62 79 20 74 68 65 20 73 74 72 75 63 74 75 72 65  by the structure
2610: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a   passed as the.*
2620: 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * first argument
2630: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
2640: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 69  maximum height i
2650: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
2660: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
2670: 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62   pointed.** to b
2680: 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65 20  y pnHeight, the 
2690: 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
26a0: 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48 65  , then set *pnHe
26b0: 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  ight to that.** 
26c0: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
26d0: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78   void heightOfEx
26e0: 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  pr(Expr *p, int 
26f0: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
2700: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ( p ){.    if( p
2710: 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65 69  ->nHeight>*pnHei
2720: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e  ght ){.      *pn
2730: 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65 69  Height = p->nHei
2740: 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ght;.    }.  }.}
2750: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
2760: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45 78  ghtOfExprList(Ex
2770: 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 2a  prList *p, int *
2780: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28  pnHeight){.  if(
2790: 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b   p ){.    int i;
27a0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
27b0: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  p->nExpr; i++){.
27c0: 20 20 20 20 20 20 68 65 69 67 68 74 4f 66 45 78        heightOfEx
27d0: 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  pr(p->a[i].pExpr
27e0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
27f0: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
2800: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65 6c  void heightOfSel
2810: 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69  ect(Select *p, i
2820: 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20  nt *pnHeight){. 
2830: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 68 65   if( p ){.    he
2840: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 57  ightOfExpr(p->pW
2850: 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29 3b  here, pnHeight);
2860: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2870: 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e  r(p->pHaving, pn
2880: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
2890: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69  ghtOfExpr(p->pLi
28a0: 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  mit, pnHeight);.
28b0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
28c0: 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70 6e 48  (p->pOffset, pnH
28d0: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
28e0: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
28f0: 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67 68 74  pEList, pnHeight
2900: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
2910: 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75  xprList(p->pGrou
2920: 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  pBy, pnHeight);.
2930: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
2940: 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79  List(p->pOrderBy
2950: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2960: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
2970: 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65 69  p->pPrior, pnHei
2980: 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ght);.  }.}../*.
2990: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
29a0: 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65  nHeight variable
29b0: 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72   in the structur
29c0: 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a  e passed as an .
29d0: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20  ** argument. An 
29e0: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20  expression with 
29f0: 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70  no children, Exp
2a00: 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45  r.pList or .** E
2a10: 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62  xpr.pSelect memb
2a20: 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20  er has a height 
2a30: 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20  of 1. Any other 
2a40: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61  expression.** ha
2a50: 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c  s a height equal
2a60: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
2a70: 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74  height of any ot
2a80: 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63  her .** referenc
2a90: 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65  ed Expr plus one
2aa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2ab0: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 45   exprSetHeight(E
2ac0: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  xpr *p){.  int n
2ad0: 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65  Height = 0;.  he
2ae0: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
2af0: 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  eft, &nHeight);.
2b00: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
2b10: 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67  ->pRight, &nHeig
2b20: 68 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48  ht);.  if( ExprH
2b30: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
2b40: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
2b50: 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63     heightOfSelec
2b60: 74 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  t(p->x.pSelect, 
2b70: 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c  &nHeight);.  }el
2b80: 73 65 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  se{.    heightOf
2b90: 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c  ExprList(p->x.pL
2ba0: 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ist, &nHeight);.
2bb0: 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74    }.  p->nHeight
2bc0: 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a   = nHeight + 1;.
2bd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
2be0: 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61   Expr.nHeight va
2bf0: 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65  riable using the
2c00: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 29   exprSetHeight()
2c10: 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a   function. If.**
2c20: 20 74 68 65 20 68 65 69 67 68 74 20 69 73 20 67   the height is g
2c30: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
2c40: 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  maximum allowed 
2c50: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68  expression depth
2c60: 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72  ,.** leave an er
2c70: 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  ror in pParse..*
2c80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
2c90: 70 72 53 65 74 48 65 69 67 68 74 28 50 61 72 73  prSetHeight(Pars
2ca0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
2cb0: 2a 70 29 7b 0a 20 20 65 78 70 72 53 65 74 48 65  *p){.  exprSetHe
2cc0: 69 67 68 74 28 70 29 3b 0a 20 20 73 71 6c 69 74  ight(p);.  sqlit
2cd0: 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68  e3ExprCheckHeigh
2ce0: 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65  t(pParse, p->nHe
2cf0: 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ight);.}../*.** 
2d00: 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  Return the maxim
2d10: 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79  um height of any
2d20: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
2d30: 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62   referenced.** b
2d40: 79 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61  y the select sta
2d50: 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73  tement passed as
2d60: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f   an argument..*/
2d70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65  .int sqlite3Sele
2d80: 63 74 45 78 70 72 48 65 69 67 68 74 28 53 65 6c  ctExprHeight(Sel
2d90: 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ect *p){.  int n
2da0: 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65  Height = 0;.  he
2db0: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2c 20  ightOfSelect(p, 
2dc0: 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 72 65 74  &nHeight);.  ret
2dd0: 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23  urn nHeight;.}.#
2de0: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 65  else.  #define e
2df0: 78 70 72 53 65 74 48 65 69 67 68 74 28 79 29 0a  xprSetHeight(y).
2e00: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2e10: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
2e20: 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0 */../*.** This
2e30: 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
2e40: 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20 66  core allocator f
2e50: 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a 2a  or Expr nodes..*
2e60: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61  *.** Construct a
2e70: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
2e80: 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20  node and return 
2e90: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e  a pointer to it.
2ea0: 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20    Memory.** for 
2eb0: 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20 66 6f  this node and fo
2ec0: 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61 72 67  r the pToken arg
2ed0: 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e 67 6c  ument is a singl
2ee0: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20  e allocation.** 
2ef0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
2f00: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e  lite3DbMalloc().
2f10: 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75    The calling fu
2f20: 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73  nction.** is res
2f30: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b  ponsible for mak
2f40: 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f 64  ing sure the nod
2f50: 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74  e eventually get
2f60: 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  s freed..**.** I
2f70: 66 20 64 65 71 75 6f 74 65 20 69 73 20 74 72 75  f dequote is tru
2f80: 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65  e, then the toke
2f90: 6e 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29  n (if it exists)
2fa0: 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2a   is dequoted..**
2fb0: 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 66   If dequote is f
2fc0: 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74 69  alse, no dequoti
2fd0: 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 61 6e 63  ng is performanc
2fe0: 65 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65 0a  e.  The deQuote.
2ff0: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
3000: 69 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b 65  ignored if pToke
3010: 6e 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20  n is NULL or if 
3020: 74 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e  the token does n
3030: 6f 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f 20  ot.** appear to 
3040: 62 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20 74  be quoted.  If t
3050: 68 65 20 71 75 6f 74 65 73 20 77 65 72 65 20 6f  he quotes were o
3060: 66 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22  f the form "..."
3070: 20 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29   (double-quotes)
3080: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50 5f  .** then the EP_
3090: 44 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20 69  DblQuoted flag i
30a0: 73 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78 70  s set on the exp
30b0: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a  ression node..**
30c0: 0a 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65  .** Special case
30d0: 3a 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54  :  If op==TK_INT
30e0: 45 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20  EGER and pToken 
30f0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
3100: 6e 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62  ng that.** can b
3110: 65 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74  e translated int
3120: 6f 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  o a 32-bit integ
3130: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b  er, then the tok
3140: 65 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f  en is not.** sto
3150: 72 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e  red in u.zToken.
3160: 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 69    Instead, the i
3170: 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 69 73  nteger values is
3180: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
3190: 20 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74 68   u.iValue and th
31a0: 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c  e EP_IntValue fl
31b0: 61 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20 65  ag is set.  No e
31c0: 78 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20  xtra storage.** 
31d0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  is allocated to 
31e0: 68 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72  hold the integer
31f0: 20 74 65 78 74 20 61 6e 64 20 74 68 65 20 64 65   text and the de
3200: 71 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69 67  quote flag is ig
3210: 6e 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  nored..*/.Expr *
3220: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
3230: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
3240: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
3250: 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  andle for sqlite
3260: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20  3DbMallocZero() 
3270: 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f  (may be null) */
3280: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
3290: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
32a0: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
32b0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e  */.  const Token
32c0: 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20   *pToken,    /* 
32d0: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  Token argument. 
32e0: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
32f0: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
3300: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3310: 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20 2a  rue to dequote *
3320: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  /.){.  Expr *pNe
3330: 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  w;.  int nExtra 
3340: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 6c 75  = 0;.  int iValu
3350: 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 54  e = 0;..  if( pT
3360: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  oken ){.    if( 
3370: 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c  op!=TK_INTEGER |
3380: 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20  | pToken->z==0. 
3390: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
33a0: 74 65 33 47 65 74 49 6e 74 33 32 28 70 54 6f 6b  te3GetInt32(pTok
33b0: 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d  en->z, &iValue)=
33c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74  =0 ){.      nExt
33d0: 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31  ra = pToken->n+1
33e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
33f0: 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 20  iValue>=0 );.   
3400: 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20   }.  }.  pNew = 
3410: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
3420: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45  ero(db, sizeof(E
3430: 78 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20  xpr)+nExtra);.  
3440: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
3450: 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29 6f  pNew->op = (u8)o
3460: 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41 67  p;.    pNew->iAg
3470: 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  g = -1;.    if( 
3480: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  pToken ){.      
3490: 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29 7b  if( nExtra==0 ){
34a0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
34b0: 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61  lags |= EP_IntVa
34c0: 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  lue;.        pNe
34d0: 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 56  w->u.iValue = iV
34e0: 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  alue;.      }els
34f0: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  e{.        int c
3500: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
3510: 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72  u.zToken = (char
3520: 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20  *)&pNew[1];.    
3530: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b      assert( pTok
3540: 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70 54 6f 6b  en->z!=0 || pTok
3550: 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  en->n==0 );.    
3560: 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e      if( pToken->
3570: 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d  n ) memcpy(pNew-
3580: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b 65  >u.zToken, pToke
3590: 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29  n->z, pToken->n)
35a0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
35b0: 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e 2d  u.zToken[pToken-
35c0: 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  >n] = 0;.       
35d0: 20 69 66 28 20 64 65 71 75 6f 74 65 20 26 26 20   if( dequote && 
35e0: 6e 45 78 74 72 61 3e 3d 33 20 0a 20 20 20 20 20  nExtra>=3 .     
35f0: 20 20 20 20 20 20 20 20 26 26 20 28 28 63 20 3d          && ((c =
3600: 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 29 3d 3d   pToken->z[0])==
3610: 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 22 27 20 7c  '\'' || c=='"' |
3620: 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27  | c=='[' || c=='
3630: 60 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  `') ){.         
3640: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
3650: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  pNew->u.zToken);
3660: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
3670: 3d 3d 27 22 27 20 29 20 70 4e 65 77 2d 3e 66 6c  =='"' ) pNew->fl
3680: 61 67 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75 6f  ags |= EP_DblQuo
3690: 74 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ted;.        }. 
36a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
36b0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
36c0: 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e 65  _DEPTH>0.    pNe
36d0: 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b 0a  w->nHeight = 1;.
36e0: 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20 72  #endif  .  }.  r
36f0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
3700: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
3710: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
3720: 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d  ode from a zero-
3730: 74 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65 6e  terminated token
3740: 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c 72   that has.** alr
3750: 65 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f 74  eady been dequot
3760: 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ed..*/.Expr *sql
3770: 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c 69  ite3Expr(.  sqli
3780: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
3790: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f      /* Handle fo
37a0: 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  r sqlite3DbMallo
37b0: 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20  cZero() (may be 
37c0: 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f  null) */.  int o
37d0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
37e0: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
37f0: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e   opcode */.  con
3800: 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20  st char *zToken 
3810: 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72       /* Token ar
3820: 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62  gument.  Might b
3830: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54  e NULL */.){.  T
3840: 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d 20  oken x;.  x.z = 
3850: 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d 20  zToken;.  x.n = 
3860: 7a 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74 65 33  zToken ? sqlite3
3870: 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e 29  Strlen30(zToken)
3880: 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73   : 0;.  return s
3890: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
38a0: 64 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a  db, op, &x, 0);.
38b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20  }../*.** Attach 
38c0: 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61  subtrees pLeft a
38d0: 6e 64 20 70 52 69 67 68 74 20 74 6f 20 74 68 65  nd pRight to the
38e0: 20 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74   Expr node pRoot
38f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74  ..**.** If pRoot
3900: 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
3910: 73 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79 20  s that a memory 
3920: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
3930: 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a   has occurred..*
3940: 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20  * In that case, 
3950: 64 65 6c 65 74 65 20 74 68 65 20 73 75 62 74 72  delete the subtr
3960: 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52  ees pLeft and pR
3970: 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ight..*/.void sq
3980: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
3990: 75 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69 74  ubtrees(.  sqlit
39a0: 65 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a  e3 *db,.  Expr *
39b0: 70 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70  pRoot,.  Expr *p
39c0: 4c 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70 52  Left,.  Expr *pR
39d0: 69 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70 52  ight.){.  if( pR
39e0: 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  oot==0 ){.    as
39f0: 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
3a00: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71  Failed );.    sq
3a10: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3a20: 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  db, pLeft);.    
3a30: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
3a40: 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20  e(db, pRight);. 
3a50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
3a60: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
3a70: 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20  pRoot->pRight = 
3a80: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 52  pRight;.      pR
3a90: 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  oot->flags |= EP
3aa0: 5f 43 6f 6c 6c 61 74 65 20 26 20 70 52 69 67 68  _Collate & pRigh
3ab0: 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a  t->flags;.    }.
3ac0: 20 20 20 20 69 66 28 20 70 4c 65 66 74 20 29 7b      if( pLeft ){
3ad0: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c  .      pRoot->pL
3ae0: 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20  eft = pLeft;.   
3af0: 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20     pRoot->flags 
3b00: 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 20 26 20  |= EP_Collate & 
3b10: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a 20 20  pLeft->flags;.  
3b20: 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65 74 48    }.    exprSetH
3b30: 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a 20 20  eight(pRoot);.  
3b40: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
3b50: 61 74 65 20 61 20 45 78 70 72 20 6e 6f 64 65 20  ate a Expr node 
3b60: 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d  which joins as m
3b70: 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62 74 72  any as two subtr
3b80: 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f  ees..**.** One o
3b90: 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 73 75  r both of the su
3ba0: 62 74 72 65 65 73 20 63 61 6e 20 62 65 20 4e 55  btrees can be NU
3bb0: 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  LL.  Return a po
3bc0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77  inter to the new
3bd0: 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e 20 20  .** Expr node.  
3be0: 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72  Or, if an OOM er
3bf0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
3c00: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
3c10: 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65  ocFailed,.** fre
3c20: 65 20 74 68 65 20 73 75 62 74 72 65 65 73 20 61  e the subtrees a
3c30: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  nd return NULL..
3c40: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3c50: 50 45 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a  PExpr(.  Parse *
3c60: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
3c70: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
3c80: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ext */.  int op,
3c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ca0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f   /* Expression o
3cb0: 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20  pcode */.  Expr 
3cc0: 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20  *pLeft,         
3cd0: 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61     /* Left opera
3ce0: 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52  nd */.  Expr *pR
3cf0: 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
3d00: 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64  /* Right operand
3d10: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65   */.  const Toke
3d20: 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20 20 2f 2a  n *pToken     /*
3d30: 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b 65 6e 20   Argument token 
3d40: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b  */.){.  Expr *p;
3d50: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e  .  if( op==TK_AN
3d60: 44 20 26 26 20 70 4c 65 66 74 20 26 26 20 70 52  D && pLeft && pR
3d70: 69 67 68 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ight ){.    /* T
3d80: 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66  ake advantage of
3d90: 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74 20 66   short-circuit f
3da0: 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  alse optimizatio
3db0: 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20 20  n for AND */.   
3dc0: 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   p = sqlite3Expr
3dd0: 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  And(pParse->db, 
3de0: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a  pLeft, pRight);.
3df0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
3e00: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
3e10: 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6f 70  c(pParse->db, op
3e20: 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20  , pToken, 1);.  
3e30: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74    sqlite3ExprAtt
3e40: 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61 72  achSubtrees(pPar
3e50: 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66 74  se->db, p, pLeft
3e60: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20  , pRight);.  }. 
3e70: 20 69 66 28 20 70 20 29 20 7b 0a 20 20 20 20 73   if( p ) {.    s
3e80: 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48  qlite3ExprCheckH
3e90: 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d  eight(pParse, p-
3ea0: 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 20  >nHeight);.  }. 
3eb0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
3ec0: 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20  .** Return 1 if 
3ed0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75  an expression mu
3ee0: 73 74 20 62 65 20 46 41 4c 53 45 20 69 6e 20 61  st be FALSE in a
3ef0: 6c 6c 20 63 61 73 65 73 20 61 6e 64 20 30 20 69  ll cases and 0 i
3f00: 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  f the.** express
3f10: 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 74 72 75  ion might be tru
3f20: 65 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f  e.  This is an o
3f30: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 66  ptimization.  If
3f40: 20 69 73 20 4f 4b 20 74 6f 0a 2a 2a 20 72 65 74   is OK to.** ret
3f50: 75 72 6e 20 30 20 68 65 72 65 20 65 76 65 6e 20  urn 0 here even 
3f60: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
3f70: 6e 20 72 65 61 6c 6c 79 20 69 73 20 61 6c 77 61  n really is alwa
3f80: 79 73 20 66 61 6c 73 65 20 28 61 20 0a 2a 2a 20  ys false (a .** 
3f90: 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 29 2e  false negative).
3fa0: 20 20 42 75 74 20 69 74 20 69 73 20 61 20 62 75    But it is a bu
3fb0: 67 20 74 6f 20 72 65 74 75 72 6e 20 31 20 69 66  g to return 1 if
3fc0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
3fd0: 2a 2a 20 6d 69 67 68 74 20 62 65 20 74 72 75 65  ** might be true
3fe0: 20 69 6e 20 73 6f 6d 65 20 72 61 72 65 20 63 69   in some rare ci
3ff0: 72 63 75 6d 73 74 61 6e 63 65 73 20 28 61 20 66  rcumstances (a f
4000: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 29 0a  alse positive.).
4010: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
4020: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
4030: 6e 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6e  n is part of con
4040: 64 69 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a  ditional for a.*
4050: 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  * LEFT JOIN, the
4060: 6e 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65  n we cannot dete
4070: 72 6d 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65  rmine at compile
4080: 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72  -time whether or
4090: 20 6e 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74 72   not.** is it tr
40a0: 75 65 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20  ue or false, so 
40b0: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 30 2e  always return 0.
40c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
40d0: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 45  xprAlwaysFalse(E
40e0: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76  xpr *p){.  int v
40f0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72   = 0;.  if( Expr
4100: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
4110: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65  P_FromJoin) ) re
4120: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
4130: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
4140: 67 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74  ger(p, &v) ) ret
4150: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
4160: 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a  v==0;.}../*.** J
4170: 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69  oin two expressi
4180: 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44  ons using an AND
4190: 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65   operator.  If e
41a0: 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  ither expression
41b0: 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65   is.** NULL, the
41c0: 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68  n just return th
41d0: 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  e other expressi
41e0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65  on..**.** If one
41f0: 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74 68   side or the oth
4200: 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69 73  er of the AND is
4210: 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61 6c   known to be fal
4220: 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64  se, then instead
4230: 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e 67  .** of returning
4240: 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73 69   an AND expressi
4250: 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20  on, just return 
4260: 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  a constant expre
4270: 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61 20  ssion with.** a 
4280: 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e 0a  value of false..
4290: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
42a0: 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20  ExprAnd(sqlite3 
42b0: 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74  *db, Expr *pLeft
42c0: 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b  , Expr *pRight){
42d0: 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20  .  if( pLeft==0 
42e0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52  ){.    return pR
42f0: 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ight;.  }else if
4300: 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20  ( pRight==0 ){. 
4310: 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b     return pLeft;
4320: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70  .  }else if( exp
4330: 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c 65  rAlwaysFalse(pLe
4340: 66 74 29 20 7c 7c 20 65 78 70 72 41 6c 77 61 79  ft) || exprAlway
4350: 73 46 61 6c 73 65 28 70 52 69 67 68 74 29 20 29  sFalse(pRight) )
4360: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
4370: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66  rDelete(db, pLef
4380: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
4390: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52  xprDelete(db, pR
43a0: 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72  ight);.    retur
43b0: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  n sqlite3ExprAll
43c0: 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  oc(db, TK_INTEGE
43d0: 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f  R, &sqlite3IntTo
43e0: 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d  kens[0], 0);.  }
43f0: 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20 2a  else{.    Expr *
4400: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
4410: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 41  prAlloc(db, TK_A
4420: 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  ND, 0, 0);.    s
4430: 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68  qlite3ExprAttach
4440: 53 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e 65  Subtrees(db, pNe
4450: 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  w, pLeft, pRight
4460: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4e  );.    return pN
4470: 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ew;.  }.}../*.**
4480: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   Construct a new
4490: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
44a0: 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20   for a function 
44b0: 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  with multiple.**
44c0: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45   arguments..*/.E
44d0: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
44e0: 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  Function(Parse *
44f0: 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74  pParse, ExprList
4500: 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
4510: 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20  pToken){.  Expr 
4520: 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65 33  *pNew;.  sqlite3
4530: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
4540: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  b;.  assert( pTo
4550: 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20  ken );.  pNew = 
4560: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
4570: 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  (db, TK_FUNCTION
4580: 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20  , pToken, 1);.  
4590: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
45a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
45b0: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
45c0: 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65  st); /* Avoid me
45d0: 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d  mory leak when m
45e0: 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20  alloc fails */. 
45f0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
4600: 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74  .  pNew->x.pList
4610: 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73 65   = pList;.  asse
4620: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
4630: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49  erty(pNew, EP_xI
4640: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71  sSelect) );.  sq
4650: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
4660: 68 74 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29  ht(pParse, pNew)
4670: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
4680: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
4690: 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62   a variable numb
46a0: 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73  er to an express
46b0: 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73  ion that encodes
46c0: 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69   a wildcard.** i
46d0: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
46e0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a  QL statement.  .
46f0: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
4700: 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20  consisting of a 
4710: 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61  single "?" are a
4720: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74  ssigned the next
4730: 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76   sequential.** v
4740: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a  ariable number..
4750: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
4760: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
4770: 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  n" are assigned 
4780: 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22  the number "nnn"
4790: 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75  .  We make.** su
47a0: 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20  re "nnn" is not 
47b0: 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69 64 20  too be to avoid 
47c0: 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72 76  a denial of serv
47d0: 69 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e 0a  ice attack when.
47e0: 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  ** the SQL state
47f0: 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ment comes from 
4800: 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75 72  an external sour
4810: 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  ce..**.** Wildca
4820: 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rds of the form 
4830: 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22 2c 20  ":aaa", "@aaa", 
4840: 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61 73  or "$aaa" are as
4850: 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65 20  signed the same 
4860: 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68 65  number.** as the
4870: 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61 6e   previous instan
4880: 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 77  ce of the same w
4890: 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66 20  ildcard.  Or if 
48a0: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
48b0: 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66  t.** instance of
48c0: 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20 74   the wildcard, t
48d0: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 69 61  he next sequenia
48e0: 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  l variable numbe
48f0: 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65 64  r is.** assigned
4900: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4910: 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e 75  3ExprAssignVarNu
4920: 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61 72  mber(Parse *pPar
4930: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
4940: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
4950: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
4960: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 0a  const char *z;..
4970: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
4980: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
4990: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
49a0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
49b0: 74 56 61 6c 75 65 7c 45 50 5f 52 65 64 75 63 65  tValue|EP_Reduce
49c0: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  d|EP_TokenOnly) 
49d0: 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70 72 2d 3e  );.  z = pExpr->
49e0: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65  u.zToken;.  asse
49f0: 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 61 73  rt( z!=0 );.  as
4a00: 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30 20 29 3b  sert( z[0]!=0 );
4a10: 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29  .  if( z[1]==0 )
4a20: 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72  {.    /* Wildcar
4a30: 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  d of the form "?
4a40: 22 2e 20 20 41 73 73 69 67 6e 20 74 68 65 20 6e  ".  Assign the n
4a50: 65 78 74 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ext variable num
4a60: 62 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ber */.    asser
4a70: 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a  t( z[0]=='?' );.
4a80: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
4a90: 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70  mn = (ynVar)(++p
4aa0: 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20  Parse->nVar);.  
4ab0: 7d 65 6c 73 65 7b 0a 20 20 20 20 79 6e 56 61 72  }else{.    ynVar
4ac0: 20 78 20 3d 20 30 3b 0a 20 20 20 20 75 33 32 20   x = 0;.    u32 
4ad0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
4ae0: 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28 20  n30(z);.    if( 
4af0: 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20  z[0]=='?' ){.   
4b00: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f     /* Wildcard o
4b10: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e  f the form "?nnn
4b20: 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e 6e  ".  Convert "nnn
4b30: 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  " to an integer 
4b40: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 73 65  and.      ** use
4b50: 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69 61   it as the varia
4b60: 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
4b70: 20 20 20 20 69 36 34 20 69 3b 0a 20 20 20 20 20      i64 i;.     
4b80: 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3d 3d 73 71   int bOk = 0==sq
4b90: 6c 69 74 65 33 41 74 6f 69 36 34 28 26 7a 5b 31  lite3Atoi64(&z[1
4ba0: 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c 49  ], &i, n-1, SQLI
4bb0: 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20  TE_UTF8);.      
4bc0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
4bd0: 20 78 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20   x = (ynVar)i;. 
4be0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
4bf0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
4c00: 74 63 61 73 65 28 20 69 3d 3d 31 20 29 3b 0a 20  tcase( i==1 );. 
4c10: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
4c20: 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ==db->aLimit[SQL
4c30: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
4c40: 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29 3b 0a  LE_NUMBER]-1 );.
4c50: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
4c60: 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  i==db->aLimit[SQ
4c70: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
4c80: 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a 20  BLE_NUMBER] );. 
4c90: 20 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20       if( bOk==0 
4ca0: 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e  || i<1 || i>db->
4cb0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
4cc0: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
4cd0: 42 45 52 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  BER] ){.        
4ce0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
4cf0: 70 50 61 72 73 65 2c 20 22 76 61 72 69 61 62 6c  pParse, "variabl
4d00: 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62 65  e number must be
4d10: 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64 20   between ?1 and 
4d20: 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ?%d",.          
4d30: 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c    db->aLimit[SQL
4d40: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
4d50: 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20 20 20  LE_NUMBER]);.   
4d60: 20 20 20 20 20 78 20 3d 20 30 3b 0a 20 20 20 20       x = 0;.    
4d70: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e    }.      if( i>
4d80: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a  pParse->nVar ){.
4d90: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
4da0: 6e 56 61 72 20 3d 20 28 69 6e 74 29 69 3b 0a 20  nVar = (int)i;. 
4db0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
4dc0: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63  {.      /* Wildc
4dd0: 61 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22  ards like ":aaa"
4de0: 2c 20 22 24 61 61 61 22 20 6f 72 20 22 40 61 61  , "$aaa" or "@aa
4df0: 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73  a".  Reuse the s
4e00: 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20  ame variable.   
4e10: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20     ** number as 
4e20: 74 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72  the prior appear
4e30: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
4e40: 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65   name, or if the
4e50: 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68   name.      ** h
4e60: 61 73 20 6e 65 76 65 72 20 61 70 70 65 61 72 65  as never appeare
4e70: 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20  d before, reuse 
4e80: 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c  the same variabl
4e90: 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a  e number.      *
4ea0: 2f 0a 20 20 20 20 20 20 79 6e 56 61 72 20 69 3b  /.      ynVar i;
4eb0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
4ec0: 69 3c 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3b  i<pParse->nzVar;
4ed0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
4ee0: 66 28 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  f( pParse->azVar
4ef0: 5b 69 5d 20 26 26 20 73 74 72 63 6d 70 28 70 50  [i] && strcmp(pP
4f00: 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69 5d 2c 7a  arse->azVar[i],z
4f10: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
4f20: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
4f30: 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69 2b   = x = (ynVar)i+
4f40: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
4f50: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
4f60: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
4f70: 78 3d 3d 30 20 29 20 78 20 3d 20 70 45 78 70 72  x==0 ) x = pExpr
4f80: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56  ->iColumn = (ynV
4f90: 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  ar)(++pParse->nV
4fa0: 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ar);.    }.    i
4fb0: 66 28 20 78 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( x>0 ){.      
4fc0: 69 66 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e 7a  if( x>pParse->nz
4fd0: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Var ){.        c
4fe0: 68 61 72 20 2a 2a 61 3b 0a 20 20 20 20 20 20 20  har **a;.       
4ff0: 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65   a = sqlite3DbRe
5000: 61 6c 6c 6f 63 28 64 62 2c 20 70 50 61 72 73 65  alloc(db, pParse
5010: 2d 3e 61 7a 56 61 72 2c 20 78 2a 73 69 7a 65 6f  ->azVar, x*sizeo
5020: 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20  f(a[0]));.      
5030: 20 20 69 66 28 20 61 3d 3d 30 20 29 20 72 65 74    if( a==0 ) ret
5040: 75 72 6e 3b 20 20 2f 2a 20 45 72 72 6f 72 20 72  urn;  /* Error r
5050: 65 70 6f 72 74 65 64 20 74 68 72 6f 75 67 68 20  eported through 
5060: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
5070: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 61 72   */.        pPar
5080: 73 65 2d 3e 61 7a 56 61 72 20 3d 20 61 3b 0a 20  se->azVar = a;. 
5090: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61         memset(&a
50a0: 5b 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 5d 2c  [pParse->nzVar],
50b0: 20 30 2c 20 28 78 2d 70 50 61 72 73 65 2d 3e 6e   0, (x-pParse->n
50c0: 7a 56 61 72 29 2a 73 69 7a 65 6f 66 28 61 5b 30  zVar)*sizeof(a[0
50d0: 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  ]));.        pPa
50e0: 72 73 65 2d 3e 6e 7a 56 61 72 20 3d 20 78 3b 0a  rse->nzVar = x;.
50f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
5100: 28 20 7a 5b 30 5d 21 3d 27 3f 27 20 7c 7c 20 70  ( z[0]!='?' || p
5110: 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31  Parse->azVar[x-1
5120: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
5130: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5140: 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b  , pParse->azVar[
5150: 78 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 70  x-1]);.        p
5160: 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31  Parse->azVar[x-1
5170: 5d 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  ] = sqlite3DbStr
5180: 4e 44 75 70 28 64 62 2c 20 7a 2c 20 6e 29 3b 0a  NDup(db, z, n);.
5190: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
51a0: 7d 20 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  } .  if( !pParse
51b0: 2d 3e 6e 45 72 72 20 26 26 20 70 50 61 72 73 65  ->nErr && pParse
51c0: 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61 4c 69 6d 69  ->nVar>db->aLimi
51d0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
51e0: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20  ARIABLE_NUMBER] 
51f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
5200: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
5210: 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72  too many SQL var
5220: 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a  iables");.  }.}.
5230: 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65  ./*.** Recursive
5240: 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70  ly delete an exp
5250: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f  ression tree..*/
5260: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
5270: 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  rDelete(sqlite3 
5280: 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20  *db, Expr *p){. 
5290: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
52a0: 72 6e 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20  rn;.  /* Sanity 
52b0: 63 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74 68  check: Assert th
52c0: 61 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65 20  at the IntValue 
52d0: 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20  is non-negative 
52e0: 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a  if it exists */.
52f0: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
5300: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5310: 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70 2d  _IntValue) || p-
5320: 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a  >u.iValue>=0 );.
5330: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
5340: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
5350: 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 2f  enOnly) ){.    /
5360: 2a 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69  * The Expr.x uni
5370: 6f 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  on is never used
5380: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
5390: 65 20 61 73 20 45 78 70 72 2e 70 52 69 67 68 74  e as Expr.pRight
53a0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
53b0: 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c  p->x.pList==0 ||
53c0: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b   p->pRight==0 );
53d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
53e0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
53f0: 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eft);.    sqlite
5400: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
5410: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  p->pRight);.    
5420: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
5430: 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b  rty(p, EP_MemTok
5440: 65 6e 29 20 29 20 73 71 6c 69 74 65 33 44 62 46  en) ) sqlite3DbF
5450: 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f  ree(db, p->u.zTo
5460: 6b 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 45 78  ken);.    if( Ex
5470: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
5480: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
5490: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
54a0: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
54b0: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
54c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
54d0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
54e0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70  elete(db, p->x.p
54f0: 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
5500: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
5510: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53 74  roperty(p, EP_St
5520: 61 74 69 63 29 20 29 7b 0a 20 20 20 20 73 71 6c  atic) ){.    sql
5530: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5540: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
5550: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
5560: 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63  r of bytes alloc
5570: 61 74 65 64 20 66 6f 72 20 74 68 65 20 65 78 70  ated for the exp
5580: 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75 72  ression structur
5590: 65 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20  e .** passed as 
55a0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
55b0: 6e 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61  nt. This is alwa
55c0: 79 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46  ys one of EXPR_F
55d0: 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50 52  ULLSIZE,.** EXPR
55e0: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72 20  _REDUCEDSIZE or 
55f0: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
5600: 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ZE..*/.static in
5610: 74 20 65 78 70 72 53 74 72 75 63 74 53 69 7a 65  t exprStructSize
5620: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
5630: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
5640: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
5650: 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ) ) return EXPR_
5660: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20  TOKENONLYSIZE;. 
5670: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
5680: 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63  erty(p, EP_Reduc
5690: 65 64 29 20 29 20 72 65 74 75 72 6e 20 45 58 50  ed) ) return EXP
56a0: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a 20  R_REDUCEDSIZE;. 
56b0: 20 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55 4c   return EXPR_FUL
56c0: 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  LSIZE;.}../*.** 
56d0: 54 68 65 20 64 75 70 65 64 45 78 70 72 2a 53 69  The dupedExpr*Si
56e0: 7a 65 28 29 20 72 6f 75 74 69 6e 65 73 20 65 61  ze() routines ea
56f0: 63 68 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  ch return the nu
5700: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
5710: 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74 6f  quired.** to sto
5720: 72 65 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20  re a copy of an 
5730: 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 65 78  expression or ex
5740: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
5750: 54 68 65 79 20 64 69 66 66 65 72 20 69 6e 0a 2a  They differ in.*
5760: 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74 68  * how much of th
5770: 65 20 74 72 65 65 20 69 73 20 6d 65 61 73 75 72  e tree is measur
5780: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 75  ed..**.**     du
5790: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
57a0: 65 28 29 20 20 20 20 20 53 69 7a 65 20 6f 66 20  e()     Size of 
57b0: 6f 6e 6c 79 20 74 68 65 20 45 78 70 72 20 73 74  only the Expr st
57c0: 72 75 63 74 75 72 65 20 0a 2a 2a 20 20 20 20 20  ructure .**     
57d0: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
57e0: 65 28 29 20 20 20 20 20 20 20 53 69 7a 65 20 6f  e()       Size o
57f0: 66 20 45 78 70 72 20 2b 20 73 70 61 63 65 20 66  f Expr + space f
5800: 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20  or token.**     
5810: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 29 20  dupedExprSize() 
5820: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2b            Expr +
5830: 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65 65   token + subtree
5840: 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a   components.**.*
5850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
58a0: 20 54 68 65 20 64 75 70 65 64 45 78 70 72 53 74   The dupedExprSt
58b0: 72 75 63 74 53 69 7a 65 28 29 20 66 75 6e 63 74  ructSize() funct
58c0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 77 6f 20  ion returns two 
58d0: 76 61 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f 67  values OR-ed tog
58e0: 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29 20  ether:  .** (1) 
58f0: 74 68 65 20 73 70 61 63 65 20 72 65 71 75 69 72  the space requir
5900: 65 64 20 66 6f 72 20 61 20 63 6f 70 79 20 6f 66  ed for a copy of
5910: 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74   the Expr struct
5920: 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a  ure only and .**
5930: 20 28 32 29 20 74 68 65 20 45 50 5f 78 78 78 20   (2) the EP_xxx 
5940: 66 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69 63  flags that indic
5950: 61 74 65 20 77 68 61 74 20 74 68 65 20 73 74 72  ate what the str
5960: 75 63 74 75 72 65 20 73 69 7a 65 20 73 68 6f 75  ucture size shou
5970: 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72 65  ld be..** The re
5980: 74 75 72 6e 20 76 61 6c 75 65 73 20 69 73 20 61  turn values is a
5990: 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a  lways one of:.**
59a0: 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 46 55  .**      EXPR_FU
59b0: 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20 45  LLSIZE.**      E
59c0: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
59d0: 20 20 7c 20 45 50 5f 52 65 64 75 63 65 64 0a 2a    | EP_Reduced.*
59e0: 2a 20 20 20 20 20 20 45 58 50 52 5f 54 4f 4b 45  *      EXPR_TOKE
59f0: 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54  NONLYSIZE | EP_T
5a00: 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54  okenOnly.**.** T
5a10: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73  he size of the s
5a20: 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20  tructure can be 
5a30: 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67  found by masking
5a40: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
5a50: 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75  e.** of this rou
5a60: 74 69 6e 65 20 77 69 74 68 20 30 78 66 66 66 2e  tine with 0xfff.
5a70: 20 20 54 68 65 20 66 6c 61 67 73 20 63 61 6e 20    The flags can 
5a80: 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b  be found by mask
5a90: 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74 75 72  ing the.** retur
5aa0: 6e 20 76 61 6c 75 65 20 77 69 74 68 20 45 50 5f  n value with EP_
5ab0: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
5ac0: 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  Only..**.** Note
5ad0: 20 74 68 61 74 20 77 69 74 68 20 66 6c 61 67 73   that with flags
5ae0: 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  ==EXPRDUP_REDUCE
5af0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 73 20  , this routines 
5b00: 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73 69  works on full-si
5b10: 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65 64  ze.** (unreduced
5b20: 29 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20 61  ) Expr objects a
5b30: 73 20 74 68 65 79 20 6f 72 20 6f 72 69 67 69 6e  s they or origin
5b40: 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74 65 64  ally constructed
5b50: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e 0a   by the parser..
5b60: 2a 2a 20 44 75 72 69 6e 67 20 65 78 70 72 65 73  ** During expres
5b70: 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20 65  sion analysis, e
5b80: 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
5b90: 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64   is computed and
5ba0: 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c   moved into.** l
5bb0: 61 74 65 72 20 70 61 72 74 73 20 6f 66 20 74 65  ater parts of te
5bc0: 68 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e  h Expr object an
5bd0: 64 20 74 68 61 74 20 65 78 74 72 61 20 69 6e 66  d that extra inf
5be0: 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20 67  ormation might g
5bf0: 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f 66  et chopped.** of
5c00: 66 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  f if the express
5c10: 69 6f 6e 20 69 73 20 72 65 64 75 63 65 64 2e 20  ion is reduced. 
5c20: 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20   Note also that 
5c30: 69 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  it does not work
5c40: 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 20 45 58   to.** make a EX
5c50: 50 52 44 55 50 5f 52 45 44 55 43 45 20 63 6f 70  PRDUP_REDUCE cop
5c60: 79 20 6f 66 20 61 20 72 65 64 75 63 65 64 20 65  y of a reduced e
5c70: 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 74 20 69  xpression.  It i
5c80: 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20  s only legal.** 
5c90: 74 6f 20 72 65 64 75 63 65 20 61 20 70 72 69 73  to reduce a pris
5ca0: 74 69 6e 65 20 65 78 70 72 65 73 73 69 6f 6e 20  tine expression 
5cb0: 74 72 65 65 20 66 72 6f 6d 20 74 68 65 20 70 61  tree from the pa
5cc0: 72 73 65 72 2e 20 20 54 68 65 20 69 6d 70 6c 65  rser.  The imple
5cd0: 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  mentation.** of 
5ce0: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
5cf0: 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d 75  ize() contain mu
5d00: 6c 74 69 70 6c 65 20 61 73 73 65 72 74 28 29 20  ltiple assert() 
5d10: 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
5d20: 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e  attempt.** to en
5d30: 66 6f 72 63 65 20 74 68 69 73 20 63 6f 6e 73 74  force this const
5d40: 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  raint..*/.static
5d50: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 74   int dupedExprSt
5d60: 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70  ructSize(Expr *p
5d70: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
5d80: 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73 73  int nSize;.  ass
5d90: 65 72 74 28 20 66 6c 61 67 73 3d 3d 45 58 50 52  ert( flags==EXPR
5da0: 44 55 50 5f 52 45 44 55 43 45 20 7c 7c 20 66 6c  DUP_REDUCE || fl
5db0: 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c  ags==0 ); /* Onl
5dc0: 79 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75 65  y one flag value
5dd0: 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 61 73   allowed */.  as
5de0: 73 65 72 74 28 20 45 58 50 52 5f 46 55 4c 4c 53  sert( EXPR_FULLS
5df0: 49 5a 45 3c 3d 30 78 66 66 66 20 29 3b 0a 20 20  IZE<=0xfff );.  
5e00: 61 73 73 65 72 74 28 20 28 30 78 66 66 66 20 26  assert( (0xfff &
5e10: 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f   (EP_Reduced|EP_
5e20: 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29  TokenOnly))==0 )
5e30: 3b 0a 20 20 69 66 28 20 30 3d 3d 28 66 6c 61 67  ;.  if( 0==(flag
5e40: 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  s&EXPRDUP_REDUCE
5e50: 29 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d  ) ){.    nSize =
5e60: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a   EXPR_FULLSIZE;.
5e70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
5e80: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
5e90: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
5ea0: 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
5eb0: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
5ec0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
5ed0: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
5ee0: 29 20 29 3b 20 0a 20 20 20 20 61 73 73 65 72 74  ) ); .    assert
5ef0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
5f00: 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65  ty(p, EP_MemToke
5f10: 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  n) );.    assert
5f20: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
5f30: 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63  ty(p, EP_NoReduc
5f40: 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  e) );.    if( p-
5f50: 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 78 2e 70  >pLeft || p->x.p
5f60: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 53  List ){.      nS
5f70: 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55 43  ize = EXPR_REDUC
5f80: 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64 75  EDSIZE | EP_Redu
5f90: 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ced;.    }else{.
5fa0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
5fb0: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
5fc0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
5fd0: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c  _TOKENONLYSIZE |
5fe0: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20   EP_TokenOnly;. 
5ff0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6000: 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n nSize;.}../*.*
6010: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
6020: 72 65 74 75 72 6e 73 20 74 68 65 20 73 70 61 63  returns the spac
6030: 65 20 69 6e 20 62 79 74 65 73 20 72 65 71 75 69  e in bytes requi
6040: 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  red to store the
6050: 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68 65   copy .** of the
6060: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
6070: 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68  and a copy of th
6080: 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20  e Expr.u.zToken 
6090: 73 74 72 69 6e 67 20 28 69 66 20 74 68 61 74 0a  string (if that.
60a0: 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 64 65 66  ** string is def
60b0: 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69 63  ined.).*/.static
60c0: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 4e 6f   int dupedExprNo
60d0: 64 65 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20  deSize(Expr *p, 
60e0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
60f0: 74 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45  t nByte = dupedE
6100: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c  xprStructSize(p,
6110: 20 66 6c 61 67 73 29 20 26 20 30 78 66 66 66 3b   flags) & 0xfff;
6120: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
6130: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e  roperty(p, EP_In
6140: 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e  tValue) && p->u.
6150: 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e 42  zToken ){.    nB
6160: 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  yte += sqlite3St
6170: 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b  rlen30(p->u.zTok
6180: 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74  en)+1;.  }.  ret
6190: 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74 65  urn ROUND8(nByte
61a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
61b0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
61c0: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
61d0: 74 6f 20 63 72 65 61 74 65 20 61 20 64 75 70 6c  to create a dupl
61e0: 69 63 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a  icate of the .**
61f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73   expression pass
6200: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
6210: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 73 65  argument. The se
6220: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
6230: 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61   a.** mask conta
6240: 69 6e 69 6e 67 20 45 58 50 52 44 55 50 5f 58 58  ining EXPRDUP_XX
6250: 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54  X flags..**.** T
6260: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
6270: 64 20 69 6e 63 6c 75 64 65 73 20 73 70 61 63 65  d includes space
6280: 20 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f 70   to create a cop
6290: 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  y of the Expr st
62a0: 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61  ruct.** itself a
62b0: 6e 64 20 74 68 65 20 62 75 66 66 65 72 20 72 65  nd the buffer re
62c0: 66 65 72 72 65 64 20 74 6f 20 62 79 20 45 78 70  ferred to by Exp
62d0: 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61  r.u.zToken, if a
62e0: 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ny..**.** If the
62f0: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20   EXPRDUP_REDUCE 
6300: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
6310: 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
6320: 75 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20  ue includes .** 
6330: 73 70 61 63 65 20 74 6f 20 64 75 70 6c 69 63 61  space to duplica
6340: 74 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65  te all Expr node
6350: 73 20 69 6e 20 74 68 65 20 74 72 65 65 20 66 6f  s in the tree fo
6360: 72 6d 65 64 20 62 79 20 45 78 70 72 2e 70 4c 65  rmed by Expr.pLe
6370: 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e  ft .** and Expr.
6380: 70 52 69 67 68 74 20 76 61 72 69 61 62 6c 65 73  pRight variables
6390: 20 28 62 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e   (but not for an
63a0: 79 20 73 74 72 75 63 74 75 72 65 73 20 70 6f 69  y structures poi
63b0: 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64  nted to or .** d
63c0: 65 73 63 65 6e 64 65 64 20 66 72 6f 6d 20 74 68  escended from th
63d0: 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f  e Expr.x.pList o
63e0: 72 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74  r Expr.x.pSelect
63f0: 20 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a   variables)..*/.
6400: 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64  static int duped
6410: 45 78 70 72 53 69 7a 65 28 45 78 70 72 20 2a 70  ExprSize(Expr *p
6420: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
6430: 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20  int nByte = 0;. 
6440: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6e 42   if( p ){.    nB
6450: 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 4e  yte = dupedExprN
6460: 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  odeSize(p, flags
6470: 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  );.    if( flags
6480: 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  &EXPRDUP_REDUCE 
6490: 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b  ){.      nByte +
64a0: 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  = dupedExprSize(
64b0: 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73 29  p->pLeft, flags)
64c0: 20 2b 20 64 75 70 65 64 45 78 70 72 53 69 7a 65   + dupedExprSize
64d0: 28 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61 67  (p->pRight, flag
64e0: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  s);.    }.  }.  
64f0: 72 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a  return nByte;.}.
6500: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
6510: 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20  tion is similar 
6520: 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  to sqlite3ExprDu
6530: 70 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74  p(), except that
6540: 20 69 66 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a   if pzBuffer .**
6550: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
6560: 6e 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20 61  n *pzBuffer is a
6570: 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20  ssumed to point 
6580: 74 6f 20 61 20 62 75 66 66 65 72 20 6c 61 72 67  to a buffer larg
6590: 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20  e enough .** to 
65a0: 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f  store the copy o
65b0: 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2c 20  f expression p, 
65c0: 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 70 2d  the copies of p-
65d0: 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66  >u.zToken.** (if
65e0: 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e   applicable), an
65f0: 64 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20  d the copies of 
6600: 74 68 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64  the p->pLeft and
6610: 20 70 2d 3e 70 52 69 67 68 74 20 65 78 70 72 65   p->pRight expre
6620: 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e  ssions,.** if an
6630: 79 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  y. Before return
6640: 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72 20 69  ing, *pzBuffer i
6650: 73 20 73 65 74 20 74 6f 20 74 68 65 20 66 69 72  s set to the fir
6660: 73 74 20 62 79 74 65 20 70 61 73 73 65 64 20 74  st byte passed t
6670: 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f 66  he.** portion of
6680: 20 74 68 65 20 62 75 66 66 65 72 20 63 6f 70 69   the buffer copi
6690: 65 64 20 69 6e 74 6f 20 62 79 20 74 68 69 73 20  ed into by this 
66a0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
66b0: 74 69 63 20 45 78 70 72 20 2a 65 78 70 72 44 75  tic Expr *exprDu
66c0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
66d0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
66e0: 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65 72  s, u8 **pzBuffer
66f0: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 20  ){.  Expr *pNew 
6700: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
6710: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
6720: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
6730: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63    if( p ){.    c
6740: 6f 6e 73 74 20 69 6e 74 20 69 73 52 65 64 75 63  onst int isReduc
6750: 65 64 20 3d 20 28 66 6c 61 67 73 26 45 58 50 52  ed = (flags&EXPR
6760: 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20  DUP_REDUCE);.   
6770: 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a 20 20 20   u8 *zAlloc;.   
6780: 20 75 33 32 20 73 74 61 74 69 63 46 6c 61 67 20   u32 staticFlag 
6790: 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  = 0;..    assert
67a0: 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c  ( pzBuffer==0 ||
67b0: 20 69 73 52 65 64 75 63 65 64 20 29 3b 0a 0a 20   isReduced );.. 
67c0: 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
67d0: 20 77 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   where to write 
67e0: 74 68 65 20 6e 65 77 20 45 78 70 72 20 73 74 72  the new Expr str
67f0: 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20 20 69  ucture. */.    i
6800: 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20  f( pzBuffer ){. 
6810: 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70       zAlloc = *p
6820: 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 20 20 73  zBuffer;.      s
6830: 74 61 74 69 63 46 6c 61 67 20 3d 20 45 50 5f 53  taticFlag = EP_S
6840: 74 61 74 69 63 3b 0a 20 20 20 20 7d 65 6c 73 65  tatic;.    }else
6850: 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d  {.      zAlloc =
6860: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
6870: 52 61 77 28 64 62 2c 20 64 75 70 65 64 45 78 70  Raw(db, dupedExp
6880: 72 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 29  rSize(p, flags))
6890: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
68a0: 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f   = (Expr *)zAllo
68b0: 63 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77  c;..    if( pNew
68c0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65 74   ){.      /* Set
68d0: 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74 68 65   nNewSize to the
68e0: 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64 20   size allocated 
68f0: 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75 72  for the structur
6900: 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20 20  e pointed to.   
6910: 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20 54     ** by pNew. T
6920: 68 69 73 20 69 73 20 65 69 74 68 65 72 20 45 58  his is either EX
6930: 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58 50  PR_FULLSIZE, EXP
6940: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72  R_REDUCEDSIZE or
6950: 0a 20 20 20 20 20 20 2a 2a 20 45 58 50 52 5f 54  .      ** EXPR_T
6960: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54  OKENONLYSIZE. nT
6970: 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74  oken is set to t
6980: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
6990: 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20  es consumed.    
69a0: 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f 70 79    ** by the copy
69b0: 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f   of the p->u.zTo
69c0: 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 61  ken string (if a
69d0: 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ny)..      */.  
69e0: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
69f0: 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20 3d  ed nStructSize =
6a00: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
6a10: 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a  Size(p, flags);.
6a20: 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
6a30: 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72 75  nNewSize = nStru
6a40: 63 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b 0a  ctSize & 0xfff;.
6a50: 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e        int nToken
6a60: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 45 78 70  ;.      if( !Exp
6a70: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
6a80: 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20  EP_IntValue) && 
6a90: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20  p->u.zToken ){. 
6aa0: 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20         nToken = 
6ab0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
6ac0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31  p->u.zToken) + 1
6ad0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6ae0: 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20         nToken = 
6af0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
6b00: 20 69 66 28 20 69 73 52 65 64 75 63 65 64 20 29   if( isReduced )
6b10: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
6b20: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
6b30: 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29  y(p, EP_Reduced)
6b40: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  ==0 );.        m
6b50: 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c  emcpy(zAlloc, p,
6b60: 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20   nNewSize);.    
6b70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6b80: 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20 65 78 70   int nSize = exp
6b90: 72 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b 0a  rStructSize(p);.
6ba0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
6bb0: 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65 29  Alloc, p, nSize)
6bc0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
6bd0: 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c  (&zAlloc[nSize],
6be0: 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a   0, EXPR_FULLSIZ
6bf0: 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  E-nSize);.      
6c00: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20  }..      /* Set 
6c10: 74 68 65 20 45 50 5f 52 65 64 75 63 65 64 2c 20  the EP_Reduced, 
6c20: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e  EP_TokenOnly, an
6c30: 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c 61 67  d EP_Static flag
6c40: 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e  s appropriately.
6c50: 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
6c60: 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52 65  flags &= ~(EP_Re
6c70: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
6c80: 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c 45 50 5f  ly|EP_Static|EP_
6c90: 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  MemToken);.     
6ca0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
6cb0: 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 28 45  nStructSize & (E
6cc0: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
6cd0: 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 70  enOnly);.      p
6ce0: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74  New->flags |= st
6cf0: 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20 20  aticFlag;..     
6d00: 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 2d 3e   /* Copy the p->
6d10: 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c  u.zToken string,
6d20: 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20   if any. */.    
6d30: 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a    if( nToken ){.
6d40: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
6d50: 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a  oken = pNew->u.z
6d60: 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26  Token = (char*)&
6d70: 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d  zAlloc[nNewSize]
6d80: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
6d90: 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54  (zToken, p->u.zT
6da0: 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20  oken, nToken);. 
6db0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
6dc0: 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c  ( 0==((p->flags|
6dd0: 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20 45  pNew->flags) & E
6de0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
6df0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
6e00: 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e 70  in the pNew->x.p
6e10: 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d 3e  Select or pNew->
6e20: 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e 20  x.pList member. 
6e30: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 45  */.        if( E
6e40: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
6e50: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
6e60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
6e70: 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73  w->x.pSelect = s
6e80: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
6e90: 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74  db, p->x.pSelect
6ea0: 2c 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20  , isReduced);.  
6eb0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6ec0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70         pNew->x.p
6ed0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
6ee0: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
6ef0: 3e 78 2e 70 4c 69 73 74 2c 20 69 73 52 65 64 75  >x.pList, isRedu
6f00: 63 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ced);.        }.
6f10: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
6f20: 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e  * Fill in pNew->
6f30: 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d 3e  pLeft and pNew->
6f40: 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20  pRight. */.     
6f50: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
6f60: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65  erty(pNew, EP_Re
6f70: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
6f80: 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ly) ){.        z
6f90: 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78  Alloc += dupedEx
6fa0: 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c  prNodeSize(p, fl
6fb0: 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ags);.        if
6fc0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
6fd0: 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75 63  y(pNew, EP_Reduc
6fe0: 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ed) ){.         
6ff0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 65   pNew->pLeft = e
7000: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
7010: 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44  eft, EXPRDUP_RED
7020: 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a 20  UCE, &zAlloc);. 
7030: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
7040: 52 69 67 68 74 20 3d 20 65 78 70 72 44 75 70 28  Right = exprDup(
7050: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45  db, p->pRight, E
7060: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
7070: 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  zAlloc);.       
7080: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
7090: 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20  zBuffer ){.     
70a0: 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72 20 3d       *pzBuffer =
70b0: 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 20   zAlloc;.       
70c0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
70d0: 20 20 20 20 20 20 20 20 69 66 28 20 21 45 78 70          if( !Exp
70e0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
70f0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
7100: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
7110: 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  >pLeft = sqlite3
7120: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
7130: 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Left, 0);.      
7140: 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74      pNew->pRight
7150: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
7160: 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c  p(db, p->pRight,
7170: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
7180: 20 20 20 20 20 7d 0a 0a 20 20 20 20 7d 0a 20 20       }..    }.  
7190: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
71a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
71b0: 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66  llowing group of
71c0: 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64   routines make d
71d0: 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78  eep copies of ex
71e0: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78  pressions,.** ex
71f0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20  pression lists, 
7200: 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65  ID lists, and se
7210: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e  lect statements.
7220: 20 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e    The copies can
7230: 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28  .** be deleted (
7240: 62 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20  by being passed 
7250: 74 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74  to their respect
7260: 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20  ive ...Delete() 
7270: 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74  routines).** wit
7280: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
7290: 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a  he originals..**
72a0: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
72b0: 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64  on list, ID, and
72c0: 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65   source lists re
72d0: 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45  turn by sqlite3E
72e0: 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a  xprListDup(),.**
72f0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
7300: 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33  p(), and sqlite3
7310: 53 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e  SrcListDup() can
7320: 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20   not be further 
7330: 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20  expanded .** by 
7340: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
7350: 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41   to sqlite*ListA
7360: 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73  ppend() routines
7370: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c  ..**.** Any tabl
7380: 65 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c  es that the SrcL
7390: 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ist might point 
73a0: 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69  to are not dupli
73b0: 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cated..**.** The
73c0: 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
73d0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62   contains a comb
73e0: 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45  ination of the E
73f0: 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73  XPRDUP_XXX flags
7400: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52  ..** If the EXPR
7410: 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20  DUP_REDUCE flag 
7420: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
7430: 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72   structure retur
7440: 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e  ned is a.** trun
7450: 63 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  cated version of
7460: 20 74 68 65 20 75 73 75 61 6c 20 45 78 70 72 20   the usual Expr 
7470: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77  structure that w
7480: 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73  ill be stored as
7490: 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20  .** part of the 
74a0: 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
74b0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
74c0: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
74d0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
74e0: 33 45 78 70 72 44 75 70 28 73 71 6c 69 74 65 33  3ExprDup(sqlite3
74f0: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69   *db, Expr *p, i
7500: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 72 65 74  nt flags){.  ret
7510: 75 72 6e 20 65 78 70 72 44 75 70 28 64 62 2c 20  urn exprDup(db, 
7520: 70 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 7d 0a  p, flags, 0);.}.
7530: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
7540: 33 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c  3ExprListDup(sql
7550: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69  ite3 *db, ExprLi
7560: 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  st *p, int flags
7570: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
7580: 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78  New;.  struct Ex
7590: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
75a0: 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20  em, *pOldItem;. 
75b0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d   int i;.  if( p=
75c0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
75d0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
75e0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
75f0: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
7600: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
7610: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
7620: 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 30 3b 0a  ->iECursor = 0;.
7630: 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20    pNew->nExpr = 
7640: 69 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20  i = p->nExpr;.  
7650: 69 66 28 20 28 66 6c 61 67 73 20 26 20 45 58 50  if( (flags & EXP
7660: 52 44 55 50 5f 52 45 44 55 43 45 29 3d 3d 30 20  RDUP_REDUCE)==0 
7670: 29 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e  ) for(i=1; i<p->
7680: 6e 45 78 70 72 3b 20 69 2b 3d 69 29 7b 7d 0a 20  nExpr; i+=i){}. 
7690: 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d   pNew->a = pItem
76a0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
76b0: 6f 63 52 61 77 28 64 62 2c 20 20 69 2a 73 69 7a  ocRaw(db,  i*siz
76c0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
76d0: 20 20 69 66 28 20 70 49 74 65 6d 3d 3d 30 20 29    if( pItem==0 )
76e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
76f0: 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20  ree(db, pNew);. 
7700: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7710: 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70   .  pOldItem = p
7720: 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ->a;.  for(i=0; 
7730: 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  i<p->nExpr; i++,
7740: 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74   pItem++, pOldIt
7750: 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  em++){.    Expr 
7760: 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64  *pOldExpr = pOld
7770: 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
7780: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20   pItem->pExpr = 
7790: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
77a0: 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61  b, pOldExpr, fla
77b0: 67 73 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  gs);.    pItem->
77c0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
77d0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
77e0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
77f0: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
7800: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
7810: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
7820: 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d  Span);.    pItem
7830: 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f  ->sortOrder = pO
7840: 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65  ldItem->sortOrde
7850: 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f  r;.    pItem->do
7860: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65  ne = 0;.    pIte
7870: 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20  m->bSpanIsTab = 
7880: 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 70 61 6e 49  pOldItem->bSpanI
7890: 73 54 61 62 3b 0a 20 20 20 20 70 49 74 65 6d 2d  sTab;.    pItem-
78a0: 3e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 70  >iOrderByCol = p
78b0: 4f 6c 64 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42  OldItem->iOrderB
78c0: 79 43 6f 6c 3b 0a 20 20 20 20 70 49 74 65 6d 2d  yCol;.    pItem-
78d0: 3e 69 41 6c 69 61 73 20 3d 20 70 4f 6c 64 49 74  >iAlias = pOldIt
78e0: 65 6d 2d 3e 69 41 6c 69 61 73 3b 0a 20 20 7d 0a  em->iAlias;.  }.
78f0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
7900: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f  ../*.** If curso
7910: 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69  rs, triggers, vi
7920: 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69  ews and subqueri
7930: 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74  es are all omitt
7940: 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62  ed from.** the b
7950: 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20  uild, then none 
7960: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
7970: 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70   routines, excep
7980: 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65  t for .** sqlite
7990: 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61  3SelectDup(), ca
79a0: 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c  n be called. sql
79b0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20  ite3SelectDup() 
79c0: 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  is sometimes.** 
79d0: 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55  called with a NU
79e0: 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  LL argument..*/.
79f0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
7a00: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
7a10: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
7a20: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20  E_OMIT_TRIGGER) 
7a30: 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  \. || !defined(S
7a40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
7a50: 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71  ERY).SrcList *sq
7a60: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28  lite3SrcListDup(
7a70: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63  sqlite3 *db, Src
7a80: 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  List *p, int fla
7a90: 67 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  gs){.  SrcList *
7aa0: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pNew;.  int i;. 
7ab0: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66   int nByte;.  if
7ac0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
7ad0: 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  0;.  nByte = siz
7ae0: 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53  eof(*p) + (p->nS
7af0: 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d  rc>0 ? sizeof(p-
7b00: 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72  >a[0]) * (p->nSr
7b10: 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65  c-1) : 0);.  pNe
7b20: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
7b30: 6c 6f 63 52 61 77 28 64 62 2c 20 6e 42 79 74 65  locRaw(db, nByte
7b40: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
7b50: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
7b60: 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65  pNew->nSrc = pNe
7b70: 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  w->nAlloc = p->n
7b80: 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Src;.  for(i=0; 
7b90: 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  i<p->nSrc; i++){
7ba0: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
7bb0: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
7bc0: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
7bd0: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
7be0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49  List_item *pOldI
7bf0: 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a  tem = &p->a[i];.
7c00: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
7c10: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
7c20: 53 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65  Schema = pOldIte
7c30: 6d 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  m->pSchema;.    
7c40: 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62  pNewItem->zDatab
7c50: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ase = sqlite3DbS
7c60: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
7c70: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
7c80: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
7c90: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
7ca0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
7cb0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
7cc0: 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pNewItem->zAlias
7cd0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
7ce0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
7cf0: 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e  >zAlias);.    pN
7d00: 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ewItem->jointype
7d10: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69   = pOldItem->joi
7d20: 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 49  ntype;.    pNewI
7d30: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70  tem->iCursor = p
7d40: 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  OldItem->iCursor
7d50: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
7d60: 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f  addrFillSub = pO
7d70: 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c  ldItem->addrFill
7d80: 53 75 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  Sub;.    pNewIte
7d90: 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 70  m->regReturn = p
7da0: 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  OldItem->regRetu
7db0: 72 6e 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  rn;.    pNewItem
7dc0: 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 20 3d  ->isCorrelated =
7dd0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 43 6f 72   pOldItem->isCor
7de0: 72 65 6c 61 74 65 64 3b 0a 20 20 20 20 70 4e 65  related;.    pNe
7df0: 77 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74  wItem->viaCorout
7e00: 69 6e 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ine = pOldItem->
7e10: 76 69 61 43 6f 72 6f 75 74 69 6e 65 3b 0a 20 20  viaCoroutine;.  
7e20: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 49 6e 64    pNewItem->zInd
7e30: 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ex = sqlite3DbSt
7e40: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
7e50: 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20  m->zIndex);.    
7e60: 70 4e 65 77 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64  pNewItem->notInd
7e70: 65 78 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  exed = pOldItem-
7e80: 3e 6e 6f 74 49 6e 64 65 78 65 64 3b 0a 20 20 20  >notIndexed;.   
7e90: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 6e 64 65   pNewItem->pInde
7ea0: 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49  x = pOldItem->pI
7eb0: 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62 20 3d  ndex;.    pTab =
7ec0: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20   pNewItem->pTab 
7ed0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62  = pOldItem->pTab
7ee0: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29  ;.    if( pTab )
7ef0: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  {.      pTab->nR
7f00: 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ef++;.    }.    
7f10: 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pNewItem->pSelec
7f20: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
7f30: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
7f40: 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67  m->pSelect, flag
7f50: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
7f60: 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ->pOn = sqlite3E
7f70: 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  xprDup(db, pOldI
7f80: 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29  tem->pOn, flags)
7f90: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
7fa0: 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  pUsing = sqlite3
7fb0: 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f  IdListDup(db, pO
7fc0: 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b  ldItem->pUsing);
7fd0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63  .    pNewItem->c
7fe0: 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65  olUsed = pOldIte
7ff0: 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a  m->colUsed;.  }.
8000: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
8010: 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
8020: 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  IdListDup(sqlite
8030: 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70  3 *db, IdList *p
8040: 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65  ){.  IdList *pNe
8050: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  w;.  int i;.  if
8060: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
8070: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
8080: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
8090: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  b, sizeof(*pNew)
80a0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
80b0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
80c0: 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e  pNew->nId = p->n
80d0: 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  Id;.  pNew->a = 
80e0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
80f0: 61 77 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69  aw(db, p->nId*si
8100: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b  zeof(p->a[0]) );
8110: 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d  .  if( pNew->a==
8120: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
8130: 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29  DbFree(db, pNew)
8140: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
8150: 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68    }.  /* Note th
8160: 61 74 20 62 65 63 61 75 73 65 20 74 68 65 20 73  at because the s
8170: 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63  ize of the alloc
8180: 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d  ation for p->a[]
8190: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63   is not.  ** nec
81a0: 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77 65 72  essarily a power
81b0: 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74 65 33   of two, sqlite3
81c0: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29 20 6d  IdListAppend() m
81d0: 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64  ay not be called
81e0: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70  .  ** on the dup
81f0: 6c 69 63 61 74 65 20 63 72 65 61 74 65 64 20 62  licate created b
8200: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
8210: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
8220: 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  <p->nId; i++){. 
8230: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
8240: 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20  _item *pNewItem 
8250: 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20  = &pNew->a[i];. 
8260: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
8270: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
8280: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
8290: 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pNewItem->zName 
82a0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
82b0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
82c0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
82d0: 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64  Item->idx = pOld
82e0: 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20  Item->idx;.  }. 
82f0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
8300: 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53  Select *sqlite3S
8310: 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33  electDup(sqlite3
8320: 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c   *db, Select *p,
8330: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53   int flags){.  S
8340: 65 6c 65 63 74 20 2a 70 4e 65 77 2c 20 2a 70 50  elect *pNew, *pP
8350: 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 3d 3d 30  rior;.  if( p==0
8360: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
8370: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
8380: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
8390: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
83a0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
83b0: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  n 0;.  pNew->pEL
83c0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
83d0: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
83e0: 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a  pEList, flags);.
83f0: 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73    pNew->pSrc = s
8400: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
8410: 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c  (db, p->pSrc, fl
8420: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  ags);.  pNew->pW
8430: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
8440: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 68  prDup(db, p->pWh
8450: 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  ere, flags);.  p
8460: 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
8470: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
8480: 75 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70  up(db, p->pGroup
8490: 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  By, flags);.  pN
84a0: 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  ew->pHaving = sq
84b0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
84c0: 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61   p->pHaving, fla
84d0: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  gs);.  pNew->pOr
84e0: 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
84f0: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
8500: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c 61 67  ->pOrderBy, flag
8510: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  s);.  pNew->op =
8520: 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e   p->op;.  pNew->
8530: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 20  pPrior = pPrior 
8540: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
8550: 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  up(db, p->pPrior
8560: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20  , flags);.  if( 
8570: 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d  pPrior ) pPrior-
8580: 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20  >pNext = pNew;. 
8590: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30   pNew->pNext = 0
85a0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
85b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
85c0: 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c  p(db, p->pLimit,
85d0: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
85e0: 3e 70 4f 66 66 73 65 74 20 3d 20 73 71 6c 69 74  >pOffset = sqlit
85f0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
8600: 3e 70 4f 66 66 73 65 74 2c 20 66 6c 61 67 73 29  >pOffset, flags)
8610: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74  ;.  pNew->iLimit
8620: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f   = 0;.  pNew->iO
8630: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4e 65  ffset = 0;.  pNe
8640: 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d  w->selFlags = p-
8650: 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f  >selFlags & ~SF_
8660: 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
8670: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73   pNew->pRightmos
8680: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 61  t = 0;.  pNew->a
8690: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
86a0: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64   -1;.  pNew->add
86b0: 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d  rOpenEphm[1] = -
86c0: 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  1;.  pNew->addrO
86d0: 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b  penEphm[2] = -1;
86e0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
86f0: 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a  }.#else.Select *
8700: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
8710: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65  (sqlite3 *db, Se
8720: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  lect *p, int fla
8730: 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  gs){.  assert( p
8740: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
8750: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  0;.}.#endif.../*
8760: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
8770: 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64  ement to the end
8780: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
8790: 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73  n list.  If pLis
87a0: 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c  t is.** initiall
87b0: 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65  y NULL, then cre
87c0: 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73  ate a new expres
87d0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
87e0: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
87f0: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63  ocation error oc
8800: 63 75 72 73 2c 20 74 68 65 20 65 6e 74 69 72 65  curs, the entire
8810: 20 6c 69 73 74 20 69 73 20 66 72 65 65 64 20 61   list is freed a
8820: 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65  nd.** NULL is re
8830: 74 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f 6e 2d  turned.  If non-
8840: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
8850: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61  , then it is gua
8860: 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61 74 20  ranteed.** that 
8870: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 61  the new entry wa
8880: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61  s successfully a
8890: 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70 72  ppended..*/.Expr
88a0: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70  List *sqlite3Exp
88b0: 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50  rListAppend(.  P
88c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
88d0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
88e0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
88f0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
8900: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
8910: 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e  o which to appen
8920: 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  d. Might be NULL
8930: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
8940: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r             /*
8950: 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62   Expression to b
8960: 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68  e appended. Migh
8970: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
8980: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8990: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
89a0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
89b0: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
89c0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
89d0: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73  , sizeof(ExprLis
89e0: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
89f0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
8a00: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
8a10: 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20   }.    pList->a 
8a20: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
8a30: 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
8a40: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
8a50: 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 3d     if( pList->a=
8a60: 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  =0 ) goto no_mem
8a70: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70  ;.  }else if( (p
8a80: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 20 28 70  List->nExpr & (p
8a90: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d  List->nExpr-1))=
8aa0: 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =0 ){.    struct
8ab0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
8ac0: 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  a;.    assert( p
8ad0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
8ae0: 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33  .    a = sqlite3
8af0: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c  DbRealloc(db, pL
8b00: 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e  ist->a, pList->n
8b10: 45 78 70 72 2a 32 2a 73 69 7a 65 6f 66 28 70 4c  Expr*2*sizeof(pL
8b20: 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  ist->a[0]));.   
8b30: 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
8b40: 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
8b50: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d      }.    pList-
8b60: 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 61 73  >a = a;.  }.  as
8b70: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d  sert( pList->a!=
8b80: 30 20 29 3b 0a 20 20 69 66 28 20 31 20 29 7b 0a  0 );.  if( 1 ){.
8b90: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
8ba0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
8bb0: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
8bc0: 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20  t->nExpr++];.   
8bd0: 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30   memset(pItem, 0
8be0: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29  , sizeof(*pItem)
8bf0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45  );.    pItem->pE
8c00: 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d  xpr = pExpr;.  }
8c10: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
8c20: 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20  ..no_mem:     . 
8c30: 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e   /* Avoid leakin
8c40: 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c  g memory if mall
8c50: 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a  oc has failed. *
8c60: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  /.  sqlite3ExprD
8c70: 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
8c80: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
8c90: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
8ca0: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ist);.  return 0
8cb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
8cc0: 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e  he ExprList.a[].
8cd0: 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66  zName element of
8ce0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
8cf0: 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a  ly added item.**
8d00: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
8d10: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70  on list..**.** p
8d20: 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55  List might be NU
8d30: 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20  LL following an 
8d40: 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20  OOM error.  But 
8d50: 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76  pName should nev
8d60: 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20  er be.** NULL.  
8d70: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
8d80: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68  cation fails, th
8d90: 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  e pParse->db->ma
8da0: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a  llocFailed flag.
8db0: 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ** is set..*/.vo
8dc0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
8dd0: 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50 61 72  stSetName(.  Par
8de0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
8df0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
8e00: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
8e10: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
8e20: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
8e30: 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65  which to add the
8e40: 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65   span. */.  Toke
8e50: 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20  n *pName,       
8e60: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62      /* Name to b
8e70: 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e added */.  int
8e80: 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20   dequote        
8e90: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
8ea0: 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65 20 74  cause the name t
8eb0: 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20 2a 2f  o be dequoted */
8ec0: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  .){.  assert( pL
8ed0: 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  ist!=0 || pParse
8ee0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
8ef0: 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
8f00: 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75  List ){.    stru
8f10: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
8f20: 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73   *pItem;.    ass
8f30: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
8f40: 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  r>0 );.    pItem
8f50: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
8f60: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  st->nExpr-1];.  
8f70: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
8f80: 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20  >zName==0 );.   
8f90: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
8fa0: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
8fb0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
8fc0: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
8fd0: 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75 6f 74  ;.    if( dequot
8fe0: 65 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  e && pItem->zNam
8ff0: 65 20 29 20 73 71 6c 69 74 65 33 44 65 71 75 6f  e ) sqlite3Dequo
9000: 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  te(pItem->zName)
9010: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
9020: 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e  et the ExprList.
9030: 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e  a[].zSpan elemen
9040: 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  t of the most re
9050: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65  cently added ite
9060: 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72  m.** on the expr
9070: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
9080: 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62  ** pList might b
9090: 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67  e NULL following
90a0: 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20   an OOM error.  
90b0: 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75 6c 64  But pSpan should
90c0: 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c   never be.** NUL
90d0: 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  L.  If a memory 
90e0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
90f0: 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62  , the pParse->db
9100: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
9110: 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a  lag.** is set..*
9120: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
9130: 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28 0a 20  prListSetSpan(. 
9140: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9150: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
9160: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
9170: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
9180: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
9190: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64   to which to add
91a0: 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20   the span. */.  
91b0: 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e 20  ExprSpan *pSpan 
91c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
91d0: 70 61 6e 20 74 6f 20 62 65 20 61 64 64 65 64 20  pan to be added 
91e0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
91f0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9200: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
9210: 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  t!=0 || db->mall
9220: 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20  ocFailed!=0 );. 
9230: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
9240: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
9250: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
9260: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
9270: 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61  >nExpr-1];.    a
9280: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
9290: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  xpr>0 );.    ass
92a0: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
92b0: 61 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d 2d 3e  ailed || pItem->
92c0: 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e 70 45  pExpr==pSpan->pE
92d0: 78 70 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  xpr );.    sqlit
92e0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
92f0: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  em->zSpan);.    
9300: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73  pItem->zSpan = s
9310: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
9320: 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61 6e  db, (char*)pSpan
9330: 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20 20  ->zStart,.      
9340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
9360: 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20  nt)(pSpan->zEnd 
9370: 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29  - pSpan->zStart)
9380: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
9390: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
93a0: 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f  n list pEList co
93b0: 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e  ntains more than
93c0: 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73   iLimit elements
93d0: 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72  ,.** leave an er
93e0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
93f0: 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Parse..*/.void s
9400: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68  qlite3ExprListCh
9410: 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72  eckLength(.  Par
9420: 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78  se *pParse,.  Ex
9430: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a  prList *pEList,.
9440: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
9450: 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d  bject.){.  int m
9460: 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  x = pParse->db->
9470: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
9480: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74  MIT_COLUMN];.  t
9490: 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20  estcase( pEList 
94a0: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
94b0: 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74 63 61  ==mx );.  testca
94c0: 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  se( pEList && pE
94d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b  List->nExpr==mx+
94e0: 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  1 );.  if( pELis
94f0: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
9500: 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c  pr>mx ){.    sql
9510: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
9520: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
9530: 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a  olumns in %s", z
9540: 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Object);.  }.}..
9550: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
9560: 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69 6f  entire expressio
9570: 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  n list..*/.void 
9580: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
9590: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
95a0: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  b, ExprList *pLi
95b0: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
95c0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
95d0: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
95e0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
95f0: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
9600: 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 70  pList->a!=0 || p
9610: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29  List->nExpr==0 )
9620: 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
9630: 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
9640: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
9650: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
9660: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
9670: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78  e(db, pItem->pEx
9680: 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pr);.    sqlite3
9690: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
96a0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
96b0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
96c0: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20  pItem->zSpan);. 
96d0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
96e0: 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29  ee(db, pList->a)
96f0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
9700: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  e(db, pList);.}.
9710: 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  ./*.** These rou
9720: 74 69 6e 65 73 20 61 72 65 20 57 61 6c 6b 65 72  tines are Walker
9730: 20 63 61 6c 6c 62 61 63 6b 73 2e 20 20 57 61 6c   callbacks.  Wal
9740: 6b 65 72 2e 75 2e 70 69 20 69 73 20 61 20 70 6f  ker.u.pi is a po
9750: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 69  inter.** to an i
9760: 6e 74 65 67 65 72 2e 20 20 54 68 65 73 65 20 72  nteger.  These r
9770: 6f 75 74 69 6e 65 73 20 61 72 65 20 63 68 65 63  outines are chec
9780: 6b 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69  king an expressi
9790: 6f 6e 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66 20  on to see.** if 
97a0: 69 74 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  it is a constant
97b0: 2e 20 20 53 65 74 20 2a 57 61 6c 6b 65 72 2e 75  .  Set *Walker.u
97c0: 2e 70 69 20 74 6f 20 30 20 69 66 20 74 68 65 20  .pi to 0 if the 
97d0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
97e0: 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a   not constant..*
97f0: 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 62  *.** These callb
9800: 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ack routines are
9810: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
9820: 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  nt the following
9830: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69  :.**.**     sqli
9840: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
9850: 74 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  t().**     sqlit
9860: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
9870: 4e 6f 74 4a 6f 69 6e 28 29 0a 2a 2a 20 20 20 20  NotJoin().**    
9880: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
9890: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
98a0: 28 29 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  ().**.*/.static 
98b0: 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  int exprNodeIsCo
98c0: 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70  nstant(Walker *p
98d0: 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
98e0: 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70  xpr){..  /* If p
98f0: 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 69 73 20 33  Walker->u.i is 3
9900: 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f   then any term o
9910: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9920: 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d   that comes from
9930: 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20  .  ** the ON or 
9940: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
9950: 20 61 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69   a join disquali
9960: 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73 73  fies the express
9970: 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65  ion.  ** from be
9980: 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63  ing considered c
9990: 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66  onstant. */.  if
99a0: 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d  ( pWalker->u.i==
99b0: 33 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70  3 && ExprHasProp
99c0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
99d0: 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
99e0: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30  pWalker->u.i = 0
99f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
9a00: 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73  _Abort;.  }..  s
9a10: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
9a20: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69   ){.    /* Consi
9a30: 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  der functions to
9a40: 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20   be constant if 
9a50: 61 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65  all their argume
9a60: 6e 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74  nts are constant
9a70: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 70 57 61 6c  .    ** and pWal
9a80: 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20 2a 2f 0a 20  ker->u.i==2 */. 
9a90: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
9aa0: 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70  ION:.      if( p
9ab0: 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20 29  Walker->u.i==2 )
9ac0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
9ad0: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
9ae0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
9af0: 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ID:.    case TK_
9b00: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
9b10: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
9b20: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
9b30: 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20  G_COLUMN:.      
9b40: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
9b50: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20  >op==TK_ID );.  
9b60: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
9b70: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
9b80: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
9b90: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
9ba0: 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
9bb0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
9bc0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
9bd0: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
9be0: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75        pWalker->u
9bf0: 2e 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  .i = 0;.      re
9c00: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
9c10: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
9c20: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
9c30: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
9c40: 54 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f  T ); /* selectNo
9c50: 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c  deIsConstant wil
9c60: 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20  l disallow */.  
9c70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
9c80: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
9c90: 54 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e  TS ); /* selectN
9ca0: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69  odeIsConstant wi
9cb0: 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20  ll disallow */. 
9cc0: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
9cd0: 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a  Continue;.  }.}.
9ce0: 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
9cf0: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28  tNodeIsConstant(
9d00: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
9d10: 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64   Select *NotUsed
9d20: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
9d30: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
9d40: 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d    pWalker->u.i =
9d50: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43   0;.  return WRC
9d60: 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69 63  _Abort;.}.static
9d70: 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74   int exprIsConst
9d80: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e  (Expr *p, int in
9d90: 69 74 46 6c 61 67 29 7b 0a 20 20 57 61 6c 6b 65  itFlag){.  Walke
9da0: 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  r w;.  memset(&w
9db0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
9dc0: 0a 20 20 77 2e 75 2e 69 20 3d 20 69 6e 69 74 46  .  w.u.i = initF
9dd0: 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  lag;.  w.xExprCa
9de0: 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64  llback = exprNod
9df0: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77  eIsConstant;.  w
9e00: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
9e10: 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43   = selectNodeIsC
9e20: 6f 6e 73 74 61 6e 74 3b 0a 20 20 73 71 6c 69 74  onstant;.  sqlit
9e30: 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
9e40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 75 2e  );.  return w.u.
9e50: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  i;.}../*.** Walk
9e60: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
9e70: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ree.  Return 1 i
9e80: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9e90: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
9ea0: 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f  and 0 if it invo
9eb0: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
9ec0: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
9ed0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
9ee0: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
9ef0: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
9f00: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
9f10: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
9f20: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
9f30: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
9f40: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
9f50: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
9f60: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
9f70: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
9f80: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
9f90: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
9fa0: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
9fb0: 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  , 1);.}../*.** W
9fc0: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
9fd0: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
9fe0: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
9ff0: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
a000: 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 20  ** that does no 
a010: 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74  originate from t
a020: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
a030: 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e  lauses of a join
a040: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  ..** Return 0 if
a050: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
a060: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
a070: 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d  on calls or term
a080: 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20  s from.** an ON 
a090: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  or USING clause.
a0a0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
a0b0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
a0c0: 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20  Join(Expr *p){. 
a0d0: 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f   return exprIsCo
a0e0: 6e 73 74 28 70 2c 20 33 29 3b 0a 7d 0a 0a 2f 2a  nst(p, 3);.}../*
a0f0: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
a100: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
a110: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
a120: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
a130: 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e  tant.** or a fun
a140: 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20  ction call with 
a150: 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
a160: 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20  ts.  Return and 
a170: 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72  0 if there.** ar
a180: 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e  e any variables.
a190: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
a1a0: 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
a1b0: 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62  function, a doub
a1c0: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
a1d0: 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20   (ex: "abc").** 
a1e0: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
a1f0: 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73  variable but a s
a200: 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ingle-quoted str
a210: 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20  ing (ex: 'abc') 
a220: 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74  is.** a constant
a230: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
a240: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
a250: 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70  Function(Expr *p
a260: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
a270: 49 73 43 6f 6e 73 74 28 70 2c 20 32 29 3b 0a 7d  IsConst(p, 2);.}
a280: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
a290: 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65  xpression p code
a2a0: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74  s a constant int
a2b0: 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61  eger that is sma
a2c0: 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20  ll enough.** to 
a2d0: 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20  fit in a 32-bit 
a2e0: 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
a2f0: 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61  1 and put the va
a300: 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67  lue of the integ
a310: 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65  er.** in *pValue
a320: 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73  .  If the expres
a330: 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69  sion is not an i
a340: 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20  nteger or if it 
a350: 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f  is too big.** to
a360: 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64   fit in a signed
a370: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
a380: 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65   return 0 and le
a390: 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68  ave *pValue unch
a3a0: 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
a3b0: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
a3c0: 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  er(Expr *p, int 
a3d0: 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20  *pValue){.  int 
a3e0: 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66  rc = 0;..  /* If
a3f0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
a400: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74  s an integer lit
a410: 65 72 61 6c 20 74 68 61 74 20 66 69 74 73 20 69  eral that fits i
a420: 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
a430: 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20  t.  ** integer, 
a440: 74 68 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56  then the EP_IntV
a450: 61 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68  alue flag will h
a460: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
a470: 20 73 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74   set */.  assert
a480: 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45  ( p->op!=TK_INTE
a490: 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73  GER || (p->flags
a4a0: 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21   & EP_IntValue)!
a4b0: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
a4c0: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
a4d0: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72  (p->u.zToken, &r
a4e0: 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  c)==0 );..  if( 
a4f0: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  p->flags & EP_In
a500: 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70  tValue ){.    *p
a510: 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61  Value = p->u.iVa
a520: 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  lue;.    return 
a530: 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  1;.  }.  switch(
a540: 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
a550: 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
a560: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
a570: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
a580: 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29  ->pLeft, pValue)
a590: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a5a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
a5b0: 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
a5c0: 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66   int v;.      if
a5d0: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
a5e0: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
a5f0: 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20   &v) ){.        
a600: 61 73 73 65 72 74 28 20 76 21 3d 28 2d 32 31 34  assert( v!=(-214
a610: 37 34 38 33 36 34 37 2d 31 29 20 29 3b 0a 20 20  7483647-1) );.  
a620: 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20        *pValue = 
a630: 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  -v;.        rc =
a640: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
a650: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
a660: 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61     default: brea
a670: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
a680: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
a690: 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65  urn FALSE if the
a6a0: 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
a6b0: 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
a6c0: 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e  ion can be NULL.
a6d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
a6e0: 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62  pression might b
a6f0: 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65  e NULL or if the
a700: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
a710: 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f  oo complex.** to
a720: 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55   tell return TRU
a730: 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  E.  .**.** This 
a740: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
a750: 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  as an optimizati
a760: 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49  on, to skip OP_I
a770: 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a  sNull opcodes.**
a780: 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68   when we know th
a790: 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f  at a value canno
a7a0: 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63  t be NULL.  Henc
a7b0: 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74  e, a false posit
a7c0: 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e  ive.** (returnin
a7d0: 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66  g TRUE when in f
a7e0: 61 63 74 20 74 68 65 20 65 78 70 72 65 73 73 69  act the expressi
a7f0: 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20  on can never be 
a800: 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62  NULL) might.** b
a810: 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72  e a small perfor
a820: 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20 69 73  mance hit but is
a830: 20 6f 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c   otherwise harml
a840: 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68  ess.  On the oth
a850: 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61  er.** hand, a fa
a860: 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28 72 65  lse negative (re
a870: 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68  turning FALSE wh
a880: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  en the result co
a890: 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20  uld be NULL).** 
a8a0: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
a8b0: 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65  lt in an incorre
a8c0: 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77  ct answer.  So w
a8d0: 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65  hen in doubt, re
a8e0: 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f  turn.** TRUE..*/
a8f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
a900: 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20  CanBeNull(const 
a910: 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f  Expr *p){.  u8 o
a920: 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f  p;.  while( p->o
a930: 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70  p==TK_UPLUS || p
a940: 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20  ->op==TK_UMINUS 
a950: 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b  ){ p = p->pLeft;
a960: 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b   }.  op = p->op;
a970: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
a980: 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d  GISTER ) op = p-
a990: 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20  >op2;.  switch( 
a9a0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
a9b0: 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63  K_INTEGER:.    c
a9c0: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20  ase TK_STRING:. 
a9d0: 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
a9e0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  :.    case TK_BL
a9f0: 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  OB:.      return
aa00: 20 30 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   0;.    default:
aa10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
aa20: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
aa30: 6e 65 72 61 74 65 20 61 6e 20 4f 50 5f 49 73 4e  nerate an OP_IsN
aa40: 75 6c 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ull instruction 
aa50: 74 68 61 74 20 74 65 73 74 73 20 72 65 67 69 73  that tests regis
aa60: 74 65 72 20 69 52 65 67 20 61 6e 64 20 6a 75 6d  ter iReg and jum
aa70: 70 73 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 69 6f  ps.** to locatio
aa80: 6e 20 69 44 65 73 74 20 69 66 20 74 68 65 20 76  n iDest if the v
aa90: 61 6c 75 65 20 69 6e 20 69 52 65 67 20 69 73 20  alue in iReg is 
aaa0: 4e 55 4c 4c 2e 20 20 54 68 65 20 76 61 6c 75 65  NULL.  The value
aab0: 20 69 6e 20 69 52 65 67 20 0a 2a 2a 20 77 61 73   in iReg .** was
aac0: 20 63 6f 6d 70 75 74 65 64 20 62 79 20 70 45 78   computed by pEx
aad0: 70 72 2e 20 20 49 66 20 77 65 20 63 61 6e 20 6c  pr.  If we can l
aae0: 6f 6f 6b 20 61 74 20 70 45 78 70 72 20 61 74 20  ook at pExpr at 
aaf0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 61 6e 64  compile-time and
ab00: 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20 74 68  .** determine th
ab10: 61 74 20 69 74 20 63 61 6e 20 6e 65 76 65 72 20  at it can never 
ab20: 67 65 6e 65 72 61 74 65 20 61 20 4e 55 4c 4c 2c  generate a NULL,
ab30: 20 74 68 65 6e 20 74 68 65 20 4f 50 5f 49 73 4e   then the OP_IsN
ab40: 75 6c 6c 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a  ull operation.**
ab50: 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e   can be omitted.
ab60: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
ab70: 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75  ExprCodeIsNullJu
ab80: 6d 70 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  mp(.  Vdbe *v,  
ab90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
aba0: 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73   VDBE under cons
abb0: 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f  truction */.  co
abc0: 6e 73 74 20 45 78 70 72 20 2a 70 45 78 70 72 2c  nst Expr *pExpr,
abd0: 20 20 2f 2a 20 4f 6e 6c 79 20 67 65 6e 65 72 61    /* Only genera
abe0: 74 65 20 4f 50 5f 49 73 4e 75 6c 6c 20 69 66 20  te OP_IsNull if 
abf0: 74 68 69 73 20 65 78 70 72 20 63 61 6e 20 62 65  this expr can be
ac00: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69   NULL */.  int i
ac10: 52 65 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Reg,           /
ac20: 2a 20 54 65 73 74 20 74 68 65 20 76 61 6c 75 65  * Test the value
ac30: 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
ac40: 72 20 66 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  r for NULL */.  
ac50: 69 6e 74 20 69 44 65 73 74 20 20 20 20 20 20 20  int iDest       
ac60: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
ac70: 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   if the value is
ac80: 20 6e 75 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 66   null */.){.  if
ac90: 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  ( sqlite3ExprCan
aca0: 42 65 4e 75 6c 6c 28 70 45 78 70 72 29 20 29 7b  BeNull(pExpr) ){
acb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
acc0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
acd0: 75 6c 6c 2c 20 69 52 65 67 2c 20 69 44 65 73 74  ull, iReg, iDest
ace0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
acf0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
ad00: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
ad10: 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  ion is a constan
ad20: 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65  t which would be
ad30: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62 79  .** unchanged by
ad40: 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69 74   OP_Affinity wit
ad50: 68 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 67  h the affinity g
ad60: 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f  iven in the seco
ad70: 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  nd.** argument..
ad80: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
ad90: 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ne is used to de
ada0: 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4f  termine if the O
adb0: 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72 61  P_Affinity opera
adc0: 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f  tion.** can be o
add0: 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69 6e  mitted.  When in
ade0: 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46 41   doubt return FA
adf0: 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e 65  LSE.  A false ne
ae00: 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61 72  gative.** is har
ae10: 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65 20  mless.  A false 
ae20: 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76 65  positive, howeve
ae30: 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e  r, can result in
ae40: 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e   the wrong.** an
ae50: 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  swer..*/.int sql
ae60: 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
ae70: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63 6f  ffinityChange(co
ae80: 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68 61  nst Expr *p, cha
ae90: 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b  r aff){.  u8 op;
aea0: 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c 49  .  if( aff==SQLI
aeb0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 20 72 65  TE_AFF_NONE ) re
aec0: 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28  turn 1;.  while(
aed0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   p->op==TK_UPLUS
aee0: 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d   || p->op==TK_UM
aef0: 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70  INUS ){ p = p->p
af00: 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70  Left; }.  op = p
af10: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
af20: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
af30: 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69   = p->op2;.  swi
af40: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
af50: 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
af60: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
af70: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff==SQLITE_AFF_I
af80: 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53  NTEGER || aff==S
af90: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
afa0: 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  C;.    }.    cas
afb0: 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
afc0: 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d      return aff==
afd0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
afe0: 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
aff0: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
b000: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  }.    case TK_ST
b010: 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72 65  RING: {.      re
b020: 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45  turn aff==SQLITE
b030: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d  _AFF_TEXT;.    }
b040: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
b050: 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  B: {.      retur
b060: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
b070: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
b080: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
b090: 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20  ->iTable>=0 );  
b0a0: 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20 70  /* p cannot be p
b0b0: 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20 63  art of a CHECK c
b0c0: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
b0d0: 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f     return p->iCo
b0e0: 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20 20  lumn<0.         
b0f0: 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45   && (aff==SQLITE
b100: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20  _AFF_INTEGER || 
b110: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
b120: 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a  NUMERIC);.    }.
b130: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
b140: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
b150: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
b160: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
b170: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
b180: 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f  g is a row-id co
b190: 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e  lumn name..*/.in
b1a0: 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64  t sqlite3IsRowid
b1b0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
b1c0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
b1d0: 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44  rICmp(z, "_ROWID
b1e0: 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  _")==0 ) return 
b1f0: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
b200: 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49  StrICmp(z, "ROWI
b210: 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
b220: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
b230: 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22  StrICmp(z, "OID"
b240: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
b250: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
b260: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
b270: 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c 65  e if we are able
b280: 20 74 6f 20 74 68 65 20 49 4e 20 6f 70 65 72 61   to the IN opera
b290: 74 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  tor optimization
b2a0: 20 6f 6e 20 61 0a 2a 2a 20 71 75 65 72 79 20 6f   on a.** query o
b2b0: 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a  f the form.**.**
b2c0: 20 20 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c         x IN (SEL
b2d0: 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 57  ECT ...).**.** W
b2e0: 68 65 72 65 20 74 68 65 20 53 45 4c 45 43 54 2e  here the SELECT.
b2f0: 2e 2e 20 63 6c 61 75 73 65 20 69 73 20 61 73 20  .. clause is as 
b300: 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65  specified by the
b310: 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
b320: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a 2a  is.** routine..*
b330: 2a 0a 2a 2a 20 54 68 65 20 53 65 6c 65 63 74 20  *.** The Select 
b340: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 69 6e  object passed in
b350: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
b360: 6e 20 70 72 65 70 72 6f 63 65 73 73 65 64 20 61  n preprocessed a
b370: 6e 64 20 6e 6f 0a 2a 2a 20 65 72 72 6f 72 73 20  nd no.** errors 
b380: 68 61 76 65 20 62 65 65 6e 20 66 6f 75 6e 64 2e  have been found.
b390: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
b3a0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
b3b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 43 61  .static int isCa
b3c0: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
b3d0: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72  Select *p){.  Sr
b3e0: 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45  cList *pSrc;.  E
b3f0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
b400: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
b410: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
b420: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
b430: 20 20 20 20 20 20 20 20 20 2f 2a 20 72 69 67 68           /* righ
b440: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 49  t-hand side of I
b450: 4e 20 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20  N is SELECT */. 
b460: 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
b470: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
b480: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61          /* Not a
b490: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
b4a0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
b4b0: 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
b4c0: 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
b4d0: 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61  e) ){.    testca
b4e0: 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  se( (p->selFlags
b4f0: 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
b500: 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
b510: 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  SF_Distinct );. 
b520: 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d     testcase( (p-
b530: 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
b540: 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
b550: 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72  egate))==SF_Aggr
b560: 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74  egate );.    ret
b570: 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53  urn 0; /* No DIS
b580: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e  TINCT keyword an
b590: 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66  d no aggregate f
b5a0: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a  unctions */.  }.
b5b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72    assert( p->pGr
b5c0: 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20  oupBy==0 );     
b5d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20           /* Has 
b5e0: 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
b5f0: 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  se */.  if( p->p
b600: 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30  Limit ) return 0
b610: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
b620: 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63  * Has no LIMIT c
b630: 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73 73 65 72  lause */.  asser
b640: 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30  t( p->pOffset==0
b650: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
b660: 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d 65    /* No LIMIT me
b670: 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54 20 2a 2f  ans no OFFSET */
b680: 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
b690: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
b6a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
b6b0: 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
b6c0: 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   */.  pSrc = p->
b6d0: 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
b6e0: 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28  pSrc!=0 );.  if(
b6f0: 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
b700: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
b710: 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65      /* Single te
b720: 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73  rm in FROM claus
b730: 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d  e */.  if( pSrc-
b740: 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 20  >a[0].pSelect ) 
b750: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a  return 0;     /*
b760: 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73   FROM is not a s
b770: 75 62 71 75 65 72 79 20 6f 72 20 76 69 65 77 20  ubquery or view 
b780: 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  */.  pTab = pSrc
b790: 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 69  ->a[0].pTab;.  i
b7a0: 66 28 20 4e 45 56 45 52 28 70 54 61 62 3d 3d 30  f( NEVER(pTab==0
b7b0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
b7c0: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53  assert( pTab->pS
b7d0: 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20 20  elect==0 );     
b7e0: 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63         /* FROM c
b7f0: 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76  lause is not a v
b800: 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  iew */.  if( IsV
b810: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
b820: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
b830: 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e  /* FROM clause n
b840: 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ot a virtual tab
b850: 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d  le */.  pEList =
b860: 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
b870: 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ( pEList->nExpr!
b880: 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =1 ) return 0;  
b890: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75       /* One colu
b8a0: 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  mn in the result
b8b0: 20 73 65 74 20 2a 2f 0a 20 20 69 66 28 20 70 45   set */.  if( pE
b8c0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
b8d0: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
b8e0: 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52  ) return 0; /* R
b8f0: 65 73 75 6c 74 20 69 73 20 61 20 63 6f 6c 75 6d  esult is a colum
b900: 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b  n */.  return 1;
b910: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
b920: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
b930: 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  Y */../*.** Code
b940: 20 61 6e 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74   an OP_Once inst
b950: 72 75 63 74 69 6f 6e 20 61 6e 64 20 61 6c 6c 6f  ruction and allo
b960: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 69  cate space for i
b970: 74 73 20 66 6c 61 67 2e 20 52 65 74 75 72 6e 20  ts flag. Return 
b980: 74 68 65 20 0a 2a 2a 20 61 64 64 72 65 73 73 20  the .** address 
b990: 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72  of the new instr
b9a0: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  uction..*/.int s
b9b0: 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 50  qlite3CodeOnce(P
b9c0: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
b9d0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
b9e0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
b9f0: 29 3b 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75  );      /* Virtu
ba00: 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67  al machine being
ba10: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 72 65 74 75   coded */.  retu
ba20: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
ba30: 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c  dOp1(v, OP_Once,
ba40: 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 2b 2b   pParse->nOnce++
ba50: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
ba60: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
ba70: 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65  d by the impleme
ba80: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49  ntation of the I
ba90: 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72  N (...) operator
baa0: 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72 61  ..** The pX para
bab0: 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 78 70  meter is the exp
bac0: 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52  ression on the R
bad0: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
bae0: 72 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20  rator, which.** 
baf0: 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20  might be either 
bb00: 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  a list of expres
bb10: 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71 75  sions or a subqu
bb20: 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ery..**.** The j
bb30: 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
bb40: 6e 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72  ne is to find or
bb50: 20 63 72 65 61 74 65 20 61 20 62 2d 74 72 65 65   create a b-tree
bb60: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61 6e   object that can
bb70: 0a 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74 68  .** be used eith
bb80: 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d  er to test for m
bb90: 65 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68 65  embership in the
bba0: 20 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20 69   RHS set or to i
bbb0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a  terate through.*
bbc0: 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66  * all members of
bbd0: 20 74 68 65 20 52 48 53 20 73 65 74 2c 20 73 6b   the RHS set, sk
bbe0: 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65  ipping duplicate
bbf0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f  s..**.** A curso
bc00: 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74  r is opened on t
bc10: 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74  he b-tree object
bc20: 20 74 68 61 74 20 74 68 65 20 52 48 53 20 6f 66   that the RHS of
bc30: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
bc40: 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61 62  .** and pX->iTab
bc50: 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  le is set to the
bc60: 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63   index of that c
bc70: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
bc80: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
bc90: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
bca0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 62   indicates the b
bcb0: 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73 20 66  -tree type, as f
bcc0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
bcd0: 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 20  IN_INDEX_ROWID  
bce0: 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72      - The cursor
bcf0: 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
bd00: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e   database table.
bd10: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49  .**   IN_INDEX_I
bd20: 4e 44 45 58 5f 41 53 43 20 20 2d 20 54 68 65 20  NDEX_ASC  - The 
bd30: 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
bd40: 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e  d on an ascendin
bd50: 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e  g index..**   IN
bd60: 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53  _INDEX_INDEX_DES
bd70: 43 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77  C - The cursor w
bd80: 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64  as opened on a d
bd90: 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e  escending index.
bda0: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45  .**   IN_INDEX_E
bdb0: 50 48 20 20 20 20 20 20 20 20 2d 20 54 68 65 20  PH        - The 
bdc0: 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
bdd0: 64 20 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79  d on a specially
bde0: 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20   created and.** 
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be00: 20 20 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65          populate
be10: 64 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  d epheremal tabl
be20: 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73  e..**.** An exis
be30: 74 69 6e 67 20 62 2d 74 72 65 65 20 6d 69 67 68  ting b-tree migh
be40: 74 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  t be used if the
be50: 20 52 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20   RHS expression 
be60: 70 58 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a  pX is a simple.*
be70: 2a 20 73 75 62 71 75 65 72 79 20 73 75 63 68 20  * subquery such 
be80: 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  as:.**.**     SE
be90: 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52  LECT <column> FR
bea0: 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a  OM <table>.**.**
beb0: 20 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   If the RHS of t
bec0: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
bed0: 73 20 61 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f  s a list or a mo
bee0: 72 65 20 63 6f 6d 70 6c 65 78 20 73 75 62 71 75  re complex subqu
bef0: 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20  ery, then.** an 
bf00: 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
bf10: 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65  might need to be
bf20: 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
bf30: 74 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 6e  the RHS and then
bf40: 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d  .** pX->iTable m
bf50: 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ade to point to 
bf60: 74 68 65 20 65 70 68 65 72 6d 65 72 61 6c 20 74  the ephermeral t
bf70: 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  able instead of 
bf80: 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 74  an.** existing t
bf90: 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  able.  .**.** If
bfa0: 20 74 68 65 20 70 72 4e 6f 74 46 6f 75 6e 64 20   the prNotFound 
bfb0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20  parameter is 0, 
bfc0: 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20  then the b-tree 
bfd0: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
bfe0: 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75  iterate.** throu
bff0: 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65  gh the set membe
c000: 72 73 2c 20 73 6b 69 70 70 69 6e 67 20 61 6e 79  rs, skipping any
c010: 20 64 75 70 6c 69 63 61 74 65 73 2e 20 49 6e 20   duplicates. In 
c020: 74 68 69 73 20 63 61 73 65 20 61 6e 0a 2a 2a 20  this case an.** 
c030: 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
c040: 6d 75 73 74 20 62 65 20 75 73 65 64 20 75 6e 6c  must be used unl
c050: 65 73 73 20 74 68 65 20 73 65 6c 65 63 74 65 64  ess the selected
c060: 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 67 75 61   <column> is gua
c070: 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
c080: 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65 72   unique - either
c090: 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 61   because it is a
c0a0: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
c0b0: 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a 2a 20 68  Y KEY or it.** h
c0c0: 61 73 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73  as a UNIQUE cons
c0d0: 74 72 61 69 6e 74 20 6f 72 20 55 4e 49 51 55 45  traint or UNIQUE
c0e0: 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66   index..**.** If
c0f0: 20 74 68 65 20 70 72 4e 6f 74 46 6f 75 6e 64 20   the prNotFound 
c100: 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
c110: 20 30 2c 20 74 68 65 6e 20 74 68 65 20 62 2d 74   0, then the b-t
c120: 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ree will be used
c130: 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20 73 65   .** for fast se
c140: 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  t membership tes
c150: 74 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ts. In this case
c160: 20 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61   an epheremal ta
c170: 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20  ble must .** be 
c180: 75 73 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c  used unless <col
c190: 75 6d 6e 3e 20 69 73 20 61 6e 20 49 4e 54 45 47  umn> is an INTEG
c1a0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  ER PRIMARY KEY o
c1b0: 72 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 0a  r an index can .
c1c0: 2a 2a 20 62 65 20 66 6f 75 6e 64 20 77 69 74 68  ** be found with
c1d0: 20 3c 63 6f 6c 75 6d 6e 3e 20 61 73 20 69 74 73   <column> as its
c1e0: 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
c1f0: 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  n..**.** When th
c200: 65 20 62 2d 74 72 65 65 20 69 73 20 62 65 69 6e  e b-tree is bein
c210: 67 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 62 65  g used for membe
c220: 72 73 68 69 70 20 74 65 73 74 73 2c 20 74 68 65  rship tests, the
c230: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
c240: 6e 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 6b 6e  n.** needs to kn
c250: 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ow whether or no
c260: 74 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  t the structure 
c270: 63 6f 6e 74 61 69 6e 73 20 61 6e 20 53 51 4c 20  contains an SQL 
c280: 4e 55 4c 4c 20 0a 2a 2a 20 76 61 6c 75 65 20 69  NULL .** value i
c290: 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 72 72 65  n order to corre
c2a0: 63 74 6c 79 20 65 76 61 6c 75 61 74 65 20 65 78  ctly evaluate ex
c2b0: 70 72 65 73 73 69 6f 6e 73 20 6c 69 6b 65 20 22  pressions like "
c2c0: 58 20 49 4e 20 28 59 2c 20 5a 29 22 2e 0a 2a 2a  X IN (Y, Z)"..**
c2d0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   If there is any
c2e0: 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
c2f0: 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e   (...) might con
c300: 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75  tain a NULL valu
c310: 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c  e at.** runtime,
c320: 20 74 68 65 6e 20 61 20 72 65 67 69 73 74 65 72   then a register
c330: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
c340: 64 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e  d the register n
c350: 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a  umber written.**
c360: 20 74 6f 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2e   to *prNotFound.
c370: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
c380: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
c390: 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61  (...) contains a
c3a0: 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20  .** NULL value, 
c3b0: 74 68 65 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64  then *prNotFound
c3c0: 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
c3d0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72  ed..**.** If a r
c3e0: 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63  egister is alloc
c3f0: 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63  ated and its loc
c400: 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20  ation stored in 
c410: 2a 70 72 4e 6f 74 46 6f 75 6e 64 2c 20 74 68 65  *prNotFound, the
c420: 6e 0a 2a 2a 20 69 74 73 20 69 6e 69 74 69 61 6c  n.** its initial
c430: 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2e 20   value is NULL. 
c440: 20 49 66 20 74 68 65 20 28 2e 2e 2e 29 20 64 6f   If the (...) do
c450: 65 73 20 6e 6f 74 20 72 65 6d 61 69 6e 20 63 6f  es not remain co
c460: 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 74 68  nstant.** for th
c470: 65 20 64 75 72 61 74 69 6f 6e 20 6f 66 20 74 68  e duration of th
c480: 65 20 71 75 65 72 79 20 28 69 2e 65 2e 20 74 68  e query (i.e. th
c490: 65 20 53 45 4c 45 43 54 20 77 69 74 68 69 6e 20  e SELECT within 
c4a0: 74 68 65 20 28 2e 2e 2e 29 0a 2a 2a 20 69 73 20  the (...).** is 
c4b0: 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
c4c0: 71 75 65 72 79 29 20 74 68 65 6e 20 74 68 65 20  query) then the 
c4d0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 61 6c 6c  value of the all
c4e0: 6f 63 61 74 65 64 20 72 65 67 69 73 74 65 72 20  ocated register 
c4f0: 69 73 0a 2a 2a 20 72 65 73 65 74 20 74 6f 20 4e  is.** reset to N
c500: 55 4c 4c 20 65 61 63 68 20 74 69 6d 65 20 74 68  ULL each time th
c510: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 72 65  e subquery is re
c520: 72 75 6e 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73  run. This allows
c530: 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74   the.** caller t
c540: 6f 20 75 73 65 20 76 64 62 65 20 63 6f 64 65 20  o use vdbe code 
c550: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68  equivalent to th
c560: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
c570: 2a 2a 20 20 20 69 66 28 20 72 65 67 69 73 74 65  **   if( registe
c580: 72 3d 3d 4e 55 4c 4c 20 29 7b 0a 2a 2a 20 20 20  r==NULL ){.**   
c590: 20 20 68 61 73 5f 6e 75 6c 6c 20 3d 20 3c 74 65    has_null = <te
c5a0: 73 74 20 69 66 20 64 61 74 61 20 73 74 72 75 63  st if data struc
c5b0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 6e 75  ture contains nu
c5c0: 6c 6c 3e 0a 2a 2a 20 20 20 20 20 72 65 67 69 73  ll>.**     regis
c5d0: 74 65 72 20 3d 20 31 0a 2a 2a 20 20 20 7d 0a 2a  ter = 1.**   }.*
c5e0: 2a 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  *.** in order to
c5f0: 20 61 76 6f 69 64 20 72 75 6e 6e 69 6e 67 20 74   avoid running t
c600: 68 65 20 3c 74 65 73 74 20 69 66 20 64 61 74 61  he <test if data
c610: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
c620: 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 74 65 73  ins null>.** tes
c630: 74 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  t more often tha
c640: 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  n is necessary..
c650: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
c660: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
c670: 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49  int sqlite3FindI
c680: 6e 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  nIndex(Parse *pP
c690: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 58 2c 20  arse, Expr *pX, 
c6a0: 69 6e 74 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 29  int *prNotFound)
c6b0: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20  {.  Select *p;  
c6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
c6e0: 45 43 54 20 74 6f 20 74 68 65 20 72 69 67 68 74  ECT to the right
c6f0: 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   of IN operator 
c700: 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  */.  int eType =
c710: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
c720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
c730: 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e  pe of RHS table.
c740: 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20   IN_INDEX_* */. 
c750: 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72   int iTab = pPar
c760: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
c770: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
c780: 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c   of the RHS tabl
c790: 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42  e */.  int mustB
c7a0: 65 55 6e 69 71 75 65 20 3d 20 28 70 72 4e 6f 74  eUnique = (prNot
c7b0: 46 6f 75 6e 64 3d 3d 30 29 3b 20 20 20 2f 2a 20  Found==0);   /* 
c7c0: 54 72 75 65 20 69 66 20 52 48 53 20 6d 75 73 74  True if RHS must
c7d0: 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20   be unique */.  
c7e0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
c7f0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
c800: 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c  ;     /* Virtual
c810: 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63   machine being c
c820: 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  oded */..  asser
c830: 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  t( pX->op==TK_IN
c840: 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
c850: 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65 78 69  to see if an exi
c860: 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69  sting table or i
c870: 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64  ndex can be used
c880: 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79   to.  ** satisfy
c890: 20 74 68 65 20 71 75 65 72 79 2e 20 20 54 68 69   the query.  Thi
c8a0: 73 20 69 73 20 70 72 65 66 65 72 61 62 6c 65 20  s is preferable 
c8b0: 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  to generating a 
c8c0: 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65  new .  ** epheme
c8d0: 72 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ral table..  */.
c8e0: 20 20 70 20 3d 20 28 45 78 70 72 48 61 73 50 72    p = (ExprHasPr
c8f0: 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49  operty(pX, EP_xI
c900: 73 53 65 6c 65 63 74 29 20 3f 20 70 58 2d 3e 78  sSelect) ? pX->x
c910: 2e 70 53 65 6c 65 63 74 20 3a 20 30 29 3b 0a 20  .pSelect : 0);. 
c920: 20 69 66 28 20 41 4c 57 41 59 53 28 70 50 61 72   if( ALWAYS(pPar
c930: 73 65 2d 3e 6e 45 72 72 3d 3d 30 29 20 26 26 20  se->nErr==0) && 
c940: 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
c950: 4f 70 74 28 70 29 20 29 7b 0a 20 20 20 20 73 71  Opt(p) ){.    sq
c960: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
c970: 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20  se->db;         
c980: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
c990: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
c9a0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20     Table *pTab; 
c9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
c9d0: 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20  le <table>. */. 
c9e0: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20     Expr *pExpr; 
c9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
ca10: 72 65 73 73 69 6f 6e 20 3c 63 6f 6c 75 6d 6e 3e  ression <column>
ca20: 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 43 6f 6c   */.    i16 iCol
ca30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ca40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ca50: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
ca60: 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20  n <column> */.  
ca70: 20 20 69 31 36 20 69 44 62 3b 20 20 20 20 20 20    i16 iDb;      
ca80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca90: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
caa0: 62 61 73 65 20 69 64 78 20 66 6f 72 20 70 54 61  base idx for pTa
cab0: 62 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  b */..    assert
cac0: 28 20 70 20 29 3b 20 20 20 20 20 20 20 20 20 20  ( p );          
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cae0: 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
caf0: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
cb00: 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p) */.    assert
cb10: 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29  ( p->pEList!=0 )
cb20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
cb30: 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
cb40: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
cb50: 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p) */.    assert
cb60: 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  ( p->pEList->a[0
cb70: 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a  ].pExpr!=0 ); /*
cb80: 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
cb90: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
cba0: 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p) */.    assert
cbb0: 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20  ( p->pSrc!=0 ); 
cbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cbd0: 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
cbe0: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
cbf0: 70 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d  p) */.    pTab =
cc00: 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
cc10: 54 61 62 3b 0a 20 20 20 20 70 45 78 70 72 20 3d  Tab;.    pExpr =
cc20: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
cc30: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 43 6f 6c  .pExpr;.    iCol
cc40: 20 3d 20 28 69 31 36 29 70 45 78 70 72 2d 3e 69   = (i16)pExpr->i
cc50: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 0a 20 20 20 20  Column;.   .    
cc60: 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 56 65  /* Code an OP_Ve
cc70: 72 69 66 79 43 6f 6f 6b 69 65 20 61 6e 64 20 4f  rifyCookie and O
cc80: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20  P_TableLock for 
cc90: 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20  <table>. */.    
cca0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
ccb0: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
ccc0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
ccd0: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
cce0: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
ccf0: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  e, iDb);.    sql
cd00: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
cd10: 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
cd20: 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
cd30: 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20  zName);..    /* 
cd40: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
cd50: 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f   only called fro
cd60: 6d 20 74 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e  m two places. In
cd70: 20 62 6f 74 68 20 63 61 73 65 73 20 74 68 65 20   both cases the 
cd80: 76 64 62 65 0a 20 20 20 20 2a 2a 20 68 61 73 20  vdbe.    ** has 
cd90: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
cda0: 6f 63 61 74 65 64 2e 20 53 6f 20 61 73 73 75 6d  ocated. So assum
cdb0: 65 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  e sqlite3GetVdbe
cdc0: 28 29 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20  () is always.   
cdd0: 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 68   ** successful h
cde0: 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ere..    */.    
cdf0: 61 73 73 65 72 74 28 76 29 3b 0a 20 20 20 20 69  assert(v);.    i
ce00: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
ce10: 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 0a 20     int iAddr;.. 
ce20: 20 20 20 20 20 69 41 64 64 72 20 3d 20 73 71 6c       iAddr = sql
ce30: 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61  ite3CodeOnce(pPa
ce40: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  rse);..      sql
ce50: 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
ce60: 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c  arse, iTab, iDb,
ce70: 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
ce80: 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65  ad);.      eType
ce90: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49   = IN_INDEX_ROWI
cea0: 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  D;..      sqlite
ceb0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
cec0: 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c   iAddr);.    }el
ced0: 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
cee0: 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
cef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cf00: 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
cf10: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ble */..      /*
cf20: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   The collation s
cf30: 65 71 75 65 6e 63 65 20 75 73 65 64 20 62 79 20  equence used by 
cf40: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  the comparison. 
cf50: 49 66 20 61 6e 20 69 6e 64 65 78 20 69 73 20 74  If an index is t
cf60: 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73  o.      ** be us
cf70: 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61  ed in place of a
cf80: 20 74 65 6d 70 2d 74 61 62 6c 65 2c 20 69 74 20   temp-table, it 
cf90: 6d 75 73 74 20 62 65 20 6f 72 64 65 72 65 64 20  must be ordered 
cfa0: 61 63 63 6f 72 64 69 6e 67 0a 20 20 20 20 20 20  according.      
cfb0: 2a 2a 20 74 6f 20 74 68 69 73 20 63 6f 6c 6c 61  ** to this colla
cfc0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 20  tion sequence.  
cfd0: 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  */.      CollSeq
cfe0: 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33   *pReq = sqlite3
cff0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
d000: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d  lSeq(pParse, pX-
d010: 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a  >pLeft, pExpr);.
d020: 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
d030: 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74  that the affinit
d040: 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  y that will be u
d050: 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 74  sed to perform t
d060: 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  he .      ** com
d070: 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73  parison is the s
d080: 61 6d 65 20 61 73 20 74 68 65 20 61 66 66 69 6e  ame as the affin
d090: 69 74 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ity of the colum
d0a0: 6e 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 69  n. If.      ** i
d0b0: 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 69 73 20  t is not, it is 
d0c0: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
d0d0: 75 73 65 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20  use any index.. 
d0e0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
d0f0: 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20  t affinity_ok = 
d100: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
d110: 6e 69 74 79 4f 6b 28 70 58 2c 20 70 54 61 62 2d  nityOk(pX, pTab-
d120: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69  >aCol[iCol].affi
d130: 6e 69 74 79 29 3b 0a 0a 20 20 20 20 20 20 66 6f  nity);..      fo
d140: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
d150: 64 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79  dex; pIdx && eTy
d160: 70 65 3d 3d 30 20 26 26 20 61 66 66 69 6e 69 74  pe==0 && affinit
d170: 79 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d  y_ok; pIdx=pIdx-
d180: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
d190: 20 69 66 28 20 28 70 49 64 78 2d 3e 61 69 43 6f   if( (pIdx->aiCo
d1a0: 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20  lumn[0]==iCol). 
d1b0: 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
d1c0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
d1d0: 2c 20 45 4e 43 28 64 62 29 2c 20 70 49 64 78 2d  , ENC(db), pIdx-
d1e0: 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 30 29 3d 3d  >azColl[0], 0)==
d1f0: 70 52 65 71 0a 20 20 20 20 20 20 20 20 20 26 26  pReq.         &&
d200: 20 28 21 6d 75 73 74 42 65 55 6e 69 71 75 65 20   (!mustBeUnique 
d210: 7c 7c 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  || (pIdx->nKeyCo
d220: 6c 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e  l==1 && pIdx->on
d230: 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 29 29  Error!=OE_None))
d240: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
d250: 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 3b        int iAddr;
d260: 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
d270: 2a 70 4b 65 79 3b 0a 20 20 0a 20 20 20 20 20 20  *pKey;.  .      
d280: 20 20 20 20 70 4b 65 79 20 3d 20 28 63 68 61 72      pKey = (char
d290: 20 2a 29 73 71 6c 69 74 65 33 49 6e 64 65 78 4b   *)sqlite3IndexK
d2a0: 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyinfo(pParse, p
d2b0: 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Idx);.          
d2c0: 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43  iAddr = sqlite3C
d2d0: 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
d2e0: 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  .  .          sq
d2f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
d300: 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
d310: 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  iTab, pIdx->tnum
d320: 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20  , iDb,.         
d330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d340: 20 20 20 20 20 20 70 4b 65 79 2c 50 34 5f 4b 45        pKey,P4_KE
d350: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
d360: 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
d370: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
d380: 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pIdx->zName));. 
d390: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
d3a0: 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
d3b0: 44 45 53 43 20 3d 3d 20 49 4e 5f 49 4e 44 45 58  DESC == IN_INDEX
d3c0: 5f 49 4e 44 45 58 5f 41 53 43 2b 31 20 29 3b 0a  _INDEX_ASC+1 );.
d3d0: 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65 20            eType 
d3e0: 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  = IN_INDEX_INDEX
d3f0: 5f 41 53 43 20 2b 20 70 49 64 78 2d 3e 61 53 6f  _ASC + pIdx->aSo
d400: 72 74 4f 72 64 65 72 5b 30 5d 3b 0a 0a 20 20 20  rtOrder[0];..   
d410: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d420: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41  beJumpHere(v, iA
d430: 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ddr);.          
d440: 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20 26  if( prNotFound &
d450: 26 20 21 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  & !pTab->aCol[iC
d460: 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20  ol].notNull ){. 
d470: 20 20 20 20 20 20 20 20 20 20 20 2a 70 72 4e 6f             *prNo
d480: 74 46 6f 75 6e 64 20 3d 20 2b 2b 70 50 61 72 73  tFound = ++pPars
d490: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
d4a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d4b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
d4c0: 6c 2c 20 30 2c 20 2a 70 72 4e 6f 74 46 6f 75 6e  l, 0, *prNotFoun
d4d0: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  d);.          }.
d4e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d4f0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
d500: 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20  f( eType==0 ){. 
d510: 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20     /* Could not 
d520: 66 6f 75 6e 64 20 61 6e 20 65 78 69 73 74 69 6e  found an existin
d530: 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  g table or index
d540: 20 74 6f 20 75 73 65 20 61 73 20 74 68 65 20 52   to use as the R
d550: 48 53 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a  HS b-tree..    *
d560: 2a 20 57 65 20 77 69 6c 6c 20 68 61 76 65 20 74  * We will have t
d570: 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 70  o generate an ep
d580: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f  hemeral table to
d590: 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20   do the job..   
d5a0: 20 2a 2f 0a 20 20 20 20 75 33 32 20 73 61 76 65   */.    u32 save
d5b0: 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50  dNQueryLoop = pP
d5c0: 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
d5d0: 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61  ;.    int rMayHa
d5e0: 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  veNull = 0;.    
d5f0: 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
d600: 5f 45 50 48 3b 0a 20 20 20 20 69 66 28 20 70 72  _EPH;.    if( pr
d610: 4e 6f 74 46 6f 75 6e 64 20 29 7b 0a 20 20 20 20  NotFound ){.    
d620: 20 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20    *prNotFound = 
d630: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b  rMayHaveNull = +
d640: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
d650: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d660: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
d670: 6c 2c 20 30 2c 20 2a 70 72 4e 6f 74 46 6f 75 6e  l, 0, *prNotFoun
d680: 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
d690: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
d6a0: 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
d6b0: 70 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  p>0 );.      pPa
d6c0: 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
d6d0: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
d6e0: 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d  X->pLeft->iColum
d6f0: 6e 3c 30 20 26 26 20 21 45 78 70 72 48 61 73 50  n<0 && !ExprHasP
d700: 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78  roperty(pX, EP_x
d710: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
d720: 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f       eType = IN_
d730: 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20  INDEX_ROWID;.   
d740: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
d750: 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
d760: 65 63 74 28 70 50 61 72 73 65 2c 20 70 58 2c 20  ect(pParse, pX, 
d770: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54  rMayHaveNull, eT
d780: 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f  ype==IN_INDEX_RO
d790: 57 49 44 29 3b 0a 20 20 20 20 70 50 61 72 73 65  WID);.    pParse
d7a0: 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73  ->nQueryLoop = s
d7b0: 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
d7c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d    }else{.    pX-
d7d0: 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a  >iTable = iTab;.
d7e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79    }.  return eTy
d7f0: 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  pe;.}.#endif../*
d800: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
d810: 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62  e for scalar sub
d820: 71 75 65 72 69 65 73 20 75 73 65 64 20 61 73 20  queries used as 
d830: 61 20 73 75 62 71 75 65 72 79 20 65 78 70 72 65  a subquery expre
d840: 73 73 69 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a  ssion, EXISTS,.*
d850: 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72  * or IN operator
d860: 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a  s.  Examples:.**
d870: 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20  .**     (SELECT 
d880: 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20  a FROM b)       
d890: 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a     -- subquery.*
d8a0: 2a 20 20 20 20 20 45 58 49 53 54 53 20 28 53 45  *     EXISTS (SE
d8b0: 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
d8c0: 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71 75   -- EXISTS subqu
d8d0: 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20  ery.**     x IN 
d8e0: 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20  (4,5,11)        
d8f0: 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72        -- IN oper
d900: 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f  ator with list o
d910: 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  n right-hand sid
d920: 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53  e.**     x IN (S
d930: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
d940: 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74      -- IN operat
d950: 6f 72 20 77 69 74 68 20 73 75 62 71 75 65 72 79  or with subquery
d960: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a   on the right.**
d970: 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70 61  .** The pExpr pa
d980: 72 61 6d 65 74 65 72 20 64 65 73 63 72 69 62 65  rameter describe
d990: 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
d9a0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
d9b0: 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f  he IN.** operato
d9c0: 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a  r or subquery..*
d9d0: 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
d9e0: 72 20 69 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e  r isRowid is non
d9f0: 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78 70 72  -zero, then expr
da00: 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20  ession pExpr is 
da10: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
da20: 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   be of the form 
da30: 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20  "<rowid> IN (?, 
da40: 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65 20 3c 72  ?, ?)", where <r
da50: 6f 77 69 64 3e 20 69 73 20 61 20 72 65 66 65 72  owid> is a refer
da60: 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20  ence.** to some 
da70: 69 6e 74 65 67 65 72 20 6b 65 79 20 63 6f 6c 75  integer key colu
da80: 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 20 42 2d  mn of a table B-
da90: 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61  Tree. In this ca
daa0: 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e  se, use an.** in
dab0: 74 6b 65 79 20 42 2d 54 72 65 65 20 74 6f 20 73  tkey B-Tree to s
dac0: 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20  tore the set of 
dad0: 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69  IN(...) values i
dae0: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73  nstead of the us
daf0: 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20  ual.** (slower) 
db00: 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
db10: 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a  keys B-Tree..**.
db20: 2a 2a 20 49 66 20 72 4d 61 79 48 61 76 65 4e 75  ** If rMayHaveNu
db30: 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ll is non-zero, 
db40: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
db50: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  the operation is
db60: 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61   an IN.** (not a
db70: 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54   SELECT or EXIST
db80: 53 29 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  S) and that the 
db90: 52 48 53 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  RHS might contai
dba0: 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 46 75 72  ns NULLs..** Fur
dbb0: 74 68 65 72 6d 6f 72 65 2c 20 74 68 65 20 49 4e  thermore, the IN
dbc0: 20 69 73 20 69 6e 20 61 20 57 48 45 52 45 20 63   is in a WHERE c
dbd0: 6c 61 75 73 65 20 61 6e 64 20 74 68 61 74 20 77  lause and that w
dbe0: 65 20 72 65 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a  e really want.**
dbf0: 20 74 6f 20 69 74 65 72 61 74 65 20 6f 76 65 72   to iterate over
dc00: 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
dc10: 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 6f  IN operator in o
dc20: 72 64 65 72 20 74 6f 20 71 75 69 63 6b 6c 79 20  rder to quickly 
dc30: 6c 6f 63 61 74 65 0a 2a 2a 20 61 6c 6c 20 63 6f  locate.** all co
dc40: 72 72 65 73 70 6f 6e 64 69 6e 67 20 4c 48 53 20  rresponding LHS 
dc50: 65 6c 65 6d 65 6e 74 73 2e 20 20 41 6c 6c 20 74  elements.  All t
dc60: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
dc70: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 0a 2a   is initialize.*
dc80: 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20 67  * the register g
dc90: 69 76 65 6e 20 62 79 20 72 4d 61 79 48 61 76 65  iven by rMayHave
dca0: 4e 75 6c 6c 20 74 6f 20 4e 55 4c 4c 2e 20 20 43  Null to NULL.  C
dcb0: 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  alling routines 
dcc0: 77 69 6c 6c 20 74 61 6b 65 0a 2a 2a 20 63 61 72  will take.** car
dcd0: 65 20 6f 66 20 63 68 61 6e 67 69 6e 67 20 74 68  e of changing th
dce0: 69 73 20 72 65 67 69 73 74 65 72 20 76 61 6c 75  is register valu
dcf0: 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66  e to non-NULL if
dd00: 20 74 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c   the RHS is NULL
dd10: 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  -free..**.** If 
dd20: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20  rMayHaveNull is 
dd30: 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73  zero, that means
dd40: 20 74 68 61 74 20 74 68 65 20 73 75 62 71 75 65   that the subque
dd50: 72 79 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  ry is being used
dd60: 0a 2a 2a 20 66 6f 72 20 6d 65 6d 62 65 72 73 68  .** for membersh
dd70: 69 70 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 2e  ip testing only.
dd80: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65    There is no ne
dd90: 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ed to initialize
dda0: 20 61 6e 79 0a 2a 2a 20 72 65 67 69 73 74 65 72   any.** register
ddb0: 73 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  s to indicate th
ddc0: 65 20 70 72 65 73 65 6e 63 65 20 6f 72 20 61 62  e presence or ab
ddd0: 73 65 6e 63 65 20 6f 66 20 4e 55 4c 4c 73 20 6f  sence of NULLs o
dde0: 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a 0a 2a 2a  n the RHS..**.**
ddf0: 20 46 6f 72 20 61 20 53 45 4c 45 43 54 20 6f 72   For a SELECT or
de00: 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72   EXISTS operator
de10: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 67  , return the reg
de20: 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73  ister that holds
de30: 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20   the.** result. 
de40: 20 46 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72   For IN operator
de50: 73 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72  s or if an error
de60: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 72 65 74   occurs, the ret
de70: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 30 2e 0a  urn value is 0..
de80: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
de90: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
dea0: 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65 53  int sqlite3CodeS
deb0: 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61 72 73  ubselect(.  Pars
dec0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
ded0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
dee0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
def0: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
df00: 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20 53      /* The IN, S
df10: 45 4c 45 43 54 2c 20 6f 72 20 45 58 49 53 54 53  ELECT, or EXISTS
df20: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   operator */.  i
df30: 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c  nt rMayHaveNull,
df40: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
df50: 65 72 20 74 68 61 74 20 72 65 63 6f 72 64 73 20  er that records 
df60: 77 68 65 74 68 65 72 20 4e 55 4c 4c 73 20 65 78  whether NULLs ex
df70: 69 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20 20  ist in RHS */.  
df80: 69 6e 74 20 69 73 52 6f 77 69 64 20 20 20 20 20  int isRowid     
df90: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
dfa0: 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f 70  ue, LHS of IN op
dfb0: 65 72 61 74 6f 72 20 69 73 20 61 20 72 6f 77 69  erator is a rowi
dfc0: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 74 65  d */.){.  int te
dfd0: 73 74 41 64 64 72 20 3d 20 2d 31 3b 20 20 20 20  stAddr = -1;    
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dff0: 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65    /* One-time te
e000: 73 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  st address */.  
e010: 69 6e 74 20 72 52 65 67 20 3d 20 30 3b 20 20 20  int rReg = 0;   
e020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e030: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
e040: 74 65 72 20 73 74 6f 72 69 6e 67 20 72 65 73 75  ter storing resu
e050: 6c 74 69 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20  lting */.  Vdbe 
e060: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
e070: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
e080: 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
e090: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c   return 0;.  sql
e0a0: 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
e0b0: 68 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a  h(pParse);..  /*
e0c0: 20 54 68 69 73 20 63 6f 64 65 20 6d 75 73 74 20   This code must 
e0d0: 62 65 20 72 75 6e 20 69 6e 20 69 74 73 20 65 6e  be run in its en
e0e0: 74 69 72 65 74 79 20 65 76 65 72 79 20 74 69 6d  tirety every tim
e0f0: 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65  e it is encounte
e100: 72 65 64 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20  red.  ** if any 
e110: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
e120: 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20   is true:.  **. 
e130: 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
e140: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
e150: 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
e160: 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a  bquery.  **    *
e170: 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
e180: 20 73 69 64 65 20 69 73 20 61 6e 20 65 78 70 72   side is an expr
e190: 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74  ession list cont
e1a0: 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73  aining variables
e1b0: 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61  .  **    *  We a
e1c0: 72 65 20 69 6e 73 69 64 65 20 61 20 74 72 69 67  re inside a trig
e1d0: 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ger.  **.  ** If
e1e0: 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76   all of the abov
e1f0: 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65  e are false, the
e200: 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68 69  n we can run thi
e210: 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65  s code just once
e220: 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20 72  .  ** save the r
e230: 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75 73  esults, and reus
e240: 65 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  e the same resul
e250: 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20  t on subsequent 
e260: 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a  invocations..  *
e270: 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  /.  if( !ExprHas
e280: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
e290: 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 29 7b  EP_VarSelect) ){
e2a0: 0a 20 20 20 20 74 65 73 74 41 64 64 72 20 3d 20  .    testAddr = 
e2b0: 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
e2c0: 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 23 69  pParse);.  }..#i
e2d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e2e0: 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66 28 20  T_EXPLAIN.  if( 
e2f0: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
e300: 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =2 ){.    char *
e310: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
e320: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70  rintf(.        p
e330: 50 61 72 73 65 2d 3e 64 62 2c 20 22 45 58 45 43  Parse->db, "EXEC
e340: 55 54 45 20 25 73 25 73 20 53 55 42 51 55 45 52  UTE %s%s SUBQUER
e350: 59 20 25 64 22 2c 20 74 65 73 74 41 64 64 72 3e  Y %d", testAddr>
e360: 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45  =0?"":"CORRELATE
e370: 44 20 22 2c 0a 20 20 20 20 20 20 20 20 70 45 78  D ",.        pEx
e380: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c  pr->op==TK_IN?"L
e390: 49 53 54 22 3a 22 53 43 41 4c 41 52 22 2c 20 70  IST":"SCALAR", p
e3a0: 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
e3b0: 63 74 49 64 0a 20 20 20 20 29 3b 0a 20 20 20 20  ctId.    );.    
e3c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e3d0: 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
e3e0: 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
e3f0: 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20  Id, 0, 0, zMsg, 
e400: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
e410: 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77 69 74 63  .#endif..  switc
e420: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
e430: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
e440: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66  {.      char aff
e450: 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20 20  inity;          
e460: 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
e470: 6f 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  of the LHS of th
e480: 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  e IN */.      in
e490: 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20  t addr;         
e4a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
e4b0: 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45  ress of OP_OpenE
e4c0: 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
e4d0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  tion */.      Ex
e4e0: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
e4f0: 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65  r->pLeft; /* the
e500: 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   LHS of the IN o
e510: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
e520: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
e530: 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  fo = 0;      /* 
e540: 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  Key information 
e550: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 72 4d  */..      if( rM
e560: 61 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20 20  ayHaveNull ){.  
e570: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e580: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
e590: 6c 6c 2c 20 30 2c 20 72 4d 61 79 48 61 76 65 4e  ll, 0, rMayHaveN
e5a0: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ull);.      }.. 
e5b0: 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
e5c0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
e5d0: 69 74 79 28 70 4c 65 66 74 29 3b 0a 0a 20 20 20  ity(pLeft);..   
e5e0: 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68     /* Whether th
e5f0: 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53  is is an 'x IN(S
e600: 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e  ELECT...)' or an
e610: 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74   'x IN(<exprlist
e620: 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70  >)'.      ** exp
e630: 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61  ression it is ha
e640: 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77  ndled the same w
e650: 61 79 2e 20 20 41 6e 20 65 70 68 65 6d 65 72 61  ay.  An ephemera
e660: 6c 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20  l table is .    
e670: 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68    ** filled with
e680: 20 73 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e   single-field in
e690: 64 65 78 20 6b 65 79 73 20 72 65 70 72 65 73 65  dex keys represe
e6a0: 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  nting the result
e6b0: 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20  s.      ** from 
e6c0: 74 68 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68  the SELECT or th
e6d0: 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20  e <exprlist>..  
e6e0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
e6f0: 49 66 20 74 68 65 20 27 78 27 20 65 78 70 72 65  If the 'x' expre
e700: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
e710: 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20  n value, or the 
e720: 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20  SELECT....      
e730: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74  ** statement ret
e740: 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  urns a column va
e750: 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66  lue, then the af
e760: 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20  finity of that. 
e770: 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69       ** column i
e780: 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
e790: 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  the index keys. 
e7a0: 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20  If both 'x' and 
e7b0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c  the.      ** SEL
e7c0: 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
e7d0: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
e7e0: 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
e7f0: 69 74 79 20 69 73 20 75 73 65 64 0a 20 20 20 20  ity is used.    
e800: 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63    ** if either c
e810: 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49  olumn has NUMERI
e820: 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66  C or INTEGER aff
e830: 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65  inity. If neithe
e840: 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e  r.      ** 'x' n
e850: 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e  or the SELECT...
e860: 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
e870: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
e880: 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20  eric affinity.  
e890: 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a      ** is used..
e8a0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
e8b0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
e8c0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
e8d0: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
e8e0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
e8f0: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
e900: 6c 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  l, pExpr->iTable
e910: 2c 20 21 69 73 52 6f 77 69 64 29 3b 0a 20 20 20  , !isRowid);.   
e920: 20 20 20 69 66 28 20 72 4d 61 79 48 61 76 65 4e     if( rMayHaveN
e930: 75 6c 6c 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  ull==0 ) sqlite3
e940: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
e950: 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
e960: 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
e970: 20 3d 20 69 73 52 6f 77 69 64 20 3f 20 30 20 3a   = isRowid ? 0 :
e980: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
e990: 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
e9a0: 20 31 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69   1, 1);..      i
e9b0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
e9c0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
e9d0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
e9e0: 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20     /* Case 1:   
e9f0: 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43    expr IN (SELEC
ea00: 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a  T ...).        *
ea10: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e  *.        ** Gen
ea20: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72  erate code to wr
ea30: 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ite the results 
ea40: 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e  of the select in
ea50: 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  to the temporary
ea60: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
ea70: 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  e allocated and 
ea80: 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20  opened above..  
ea90: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
eaa0: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
eab0: 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  ;.        ExprLi
eac0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 20  st *pEList;..   
ead0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73       assert( !is
eae0: 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20  Rowid );.       
eaf0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
eb00: 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
eb10: 54 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54  T_Set, pExpr->iT
eb20: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 64  able);.        d
eb30: 65 73 74 2e 61 66 66 53 64 73 74 20 3d 20 28 75  est.affSdst = (u
eb40: 38 29 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  8)affinity;.    
eb50: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45 78      assert( (pEx
eb60: 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30  pr->iTable&0x000
eb70: 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69  0FFFF)==pExpr->i
eb80: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20  Table );.       
eb90: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
eba0: 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  t->iLimit = 0;. 
ebb0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
ebc0: 20 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20   pKeyInfo==0 ); 
ebd0: 2f 2a 20 43 61 75 73 65 64 20 62 79 20 4f 4f 4d  /* Caused by OOM
ebe0: 20 69 6e 20 73 71 6c 69 74 65 33 4b 65 79 49 6e   in sqlite3KeyIn
ebf0: 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20  foAlloc() */.   
ec00: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
ec10: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
ec20: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  Expr->x.pSelect,
ec30: 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20   &dest) ){.     
ec40: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
ec50: 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ee(pParse->db, p
ec60: 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  KeyInfo);.      
ec70: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ec80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ec90: 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
eca0: 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
ecb0: 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
ecc0: 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29  t( pKeyInfo!=0 )
ecd0: 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61  ; /* OOM will ca
ece0: 75 73 65 20 65 78 69 74 20 61 66 74 65 72 20 73  use exit after s
ecf0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 2a  qlite3Select() *
ed00: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
ed10: 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
ed20: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
ed30: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  EList->nExpr>0 )
ed40: 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e  ;.        pKeyIn
ed50: 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73  fo->aColl[0] = s
ed60: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
ed70: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
ed80: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
ed90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edc0: 20 20 20 20 20 20 20 20 20 20 70 45 4c 69 73 74            pEList
edd0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
ede0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
edf0: 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70  LWAYS(pExpr->x.p
ee00: 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  List!=0) ){.    
ee10: 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20      /* Case 2:  
ee20: 20 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72     expr IN (expr
ee30: 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a  list).        **
ee40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  .        ** For 
ee50: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c  each expression,
ee60: 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20   build an index 
ee70: 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61  key from the eva
ee80: 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20  luation and.    
ee90: 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20      ** store it 
eea0: 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
eeb0: 20 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72   table. If <expr
eec0: 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74  > is a column, t
eed0: 68 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20  hen use.        
eee0: 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20  ** that columns 
eef0: 61 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75  affinity when bu
ef00: 69 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79  ilding index key
ef10: 73 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  s. If <expr> is 
ef20: 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  not.        ** a
ef30: 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d   column, use num
ef40: 65 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20  eric affinity.. 
ef50: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
ef60: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
ef70: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
ef80: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
ef90: 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  t;.        struc
efa0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
efb0: 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20  *pItem;.        
efc0: 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a  int r1, r2, r3;.
efd0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61 66  .        if( !af
efe0: 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20  finity ){.      
eff0: 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53      affinity = S
f000: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
f010: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f020: 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
f030: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79  {.          pKey
f040: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d  Info->aColl[0] =
f050: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
f060: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
f070: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
f080: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
f090: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61   Loop through ea
f0a0: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
f0b0: 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a   <exprlist>. */.
f0c0: 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
f0d0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
f0e0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
f0f0: 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
f100: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
f110: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f120: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f130: 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a 20 20  Null, 0, r2);.  
f140: 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73        for(i=pLis
f150: 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  t->nExpr, pItem=
f160: 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69  pList->a; i>0; i
f170: 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
f180: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
f190: 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  2 = pItem->pExpr
f1a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
f1b0: 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20  iValToIns;..    
f1c0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
f1d0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f  expression is no
f1e0: 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20  t constant then 
f1f0: 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a  we will need to.
f200: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73            ** dis
f210: 61 62 6c 65 20 74 68 65 20 74 65 73 74 20 74 68  able the test th
f220: 61 74 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  at was generated
f230: 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65   above that make
f240: 73 20 73 75 72 65 0a 20 20 20 20 20 20 20 20 20  s sure.         
f250: 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e   ** this code on
f260: 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65  ly executes once
f270: 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61  .  Because for a
f280: 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20   non-constant.  
f290: 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65          ** expre
f2a0: 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f  ssion we need to
f2b0: 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65   rerun this code
f2c0: 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20   each time..    
f2d0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
f2e0: 20 20 20 69 66 28 20 74 65 73 74 41 64 64 72 3e     if( testAddr>
f2f0: 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78  =0 && !sqlite3Ex
f300: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32  prIsConstant(pE2
f310: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
f320: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
f330: 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73 74  geToNoop(v, test
f340: 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Addr);.         
f350: 20 20 20 74 65 73 74 41 64 64 72 20 3d 20 2d 31     testAddr = -1
f360: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
f370: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c           /* Eval
f380: 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73  uate the express
f390: 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69  ion and insert i
f3a0: 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20  t into the temp 
f3b0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
f3c0: 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 26     if( isRowid &
f3d0: 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  & sqlite3ExprIsI
f3e0: 6e 74 65 67 65 72 28 70 45 32 2c 20 26 69 56 61  nteger(pE2, &iVa
f3f0: 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20  lToIns) ){.     
f400: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
f410: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
f420: 6e 73 65 72 74 49 6e 74 2c 20 70 45 78 70 72 2d  nsertInt, pExpr-
f430: 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 69 56 61  >iTable, r2, iVa
f440: 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 20  lToIns);.       
f450: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f460: 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74        r3 = sqlit
f470: 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
f480: 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31  (pParse, pE2, r1
f490: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
f4a0: 66 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20  f( isRowid ){.  
f4b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
f4c0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f4d0: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72   OP_MustBeInt, r
f4e0: 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  3,.             
f4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f500: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75     sqlite3VdbeCu
f510: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b  rrentAddr(v)+2);
f520: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
f530: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
f540: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
f550: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32  Expr->iTable, r2
f560: 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20  , r3);.         
f570: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f580: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f590: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
f5a0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20  MakeRecord, r3, 
f5b0: 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79  1, r2, &affinity
f5c0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
f5d0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
f5e0: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
f5f0: 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31  ge(pParse, r3, 1
f600: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
f610: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f620: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
f630: 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt, pExpr->iTabl
f640: 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  e, r2);.        
f650: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
f660: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
f670: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
f680: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
f690: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
f6a0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
f6b0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
f6c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f6d0: 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
f6e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f6f0: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
f700: 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65  ddr, (void *)pKe
f710: 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
f720: 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20  O_HANDOFF);.    
f730: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
f740: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
f750: 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20   TK_EXISTS:.    
f760: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a  case TK_SELECT:.
f770: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
f780: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
f790: 68 61 73 20 74 6f 20 62 65 20 61 20 73 63 61 6c  has to be a scal
f7a0: 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65 6e 65  ar SELECT.  Gene
f7b0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74  rate code to put
f7c0: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 76 61   the.      ** va
f7d0: 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65 6c 65  lue of this sele
f7e0: 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63  ct in a memory c
f7f0: 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64 20 74  ell and record t
f800: 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20  he number.      
f810: 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79  ** of the memory
f820: 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e   cell in iColumn
f830: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  .  If this is an
f840: 20 45 58 49 53 54 53 2c 20 77 72 69 74 65 0a 20   EXISTS, write. 
f850: 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67       ** an integ
f860: 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73  er 0 (not exists
f870: 29 20 6f 72 20 31 20 28 65 78 69 73 74 73 29 20  ) or 1 (exists) 
f880: 69 6e 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63 65  into a memory ce
f890: 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ll.      ** and 
f8a0: 72 65 63 6f 72 64 20 74 68 61 74 20 6d 65 6d 6f  record that memo
f8b0: 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75  ry cell in iColu
f8c0: 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  mn..      */.   
f8d0: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b     Select *pSel;
f8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
f900: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  CT statement to 
f910: 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  encode */.      
f920: 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
f930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f940: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
f950: 64 65 61 6c 20 77 69 74 68 20 53 45 4c 45 43 74  deal with SELECt
f960: 20 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20   result */..    
f970: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
f980: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
f990: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
f9a0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
f9b0: 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
f9c0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
f9d0: 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c  >op==TK_EXISTS |
f9e0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
f9f0: 53 45 4c 45 43 54 20 29 3b 0a 0a 20 20 20 20 20  SELECT );..     
fa00: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
fa10: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
fa20: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
fa30: 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45  .      pSel = pE
fa40: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a  xpr->x.pSelect;.
fa50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
fa60: 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
fa70: 74 2c 20 30 2c 20 2b 2b 70 50 61 72 73 65 2d 3e  t, 0, ++pParse->
fa80: 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28  nMem);.      if(
fa90: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
faa0: 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20  ELECT ){.       
fab0: 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
fac0: 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73  T_Mem;.        s
fad0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
fae0: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
faf0: 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20  dest.iSDParm);. 
fb00: 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
fb10: 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62  nt((v, "Init sub
fb20: 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b  query result"));
fb30: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
fb40: 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74        dest.eDest
fb50: 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20   = SRT_Exists;. 
fb60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
fb70: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
fb80: 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e  nteger, 0, dest.
fb90: 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
fba0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
fbb0: 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53 20 72  , "Init EXISTS r
fbc0: 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20  esult"));.      
fbd0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
fbe0: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
fbf0: 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d  ->db, pSel->pLim
fc00: 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d  it);.      pSel-
fc10: 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  >pLimit = sqlite
fc20: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
fc30: 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c  K_INTEGER, 0, 0,
fc40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc60: 20 20 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f     &sqlite3IntTo
fc70: 6b 65 6e 73 5b 31 5d 29 3b 0a 20 20 20 20 20 20  kens[1]);.      
fc80: 70 53 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  pSel->iLimit = 0
fc90: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
fca0: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
fcb0: 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29  , pSel, &dest) )
fcc0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
fcd0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
fce0: 20 20 72 52 65 67 20 3d 20 64 65 73 74 2e 69 53    rReg = dest.iS
fcf0: 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 45 78 70  DParm;.      Exp
fd00: 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
fd10: 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75  pExpr, EP_NoRedu
fd20: 63 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ce);.      break
fd30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
fd40: 66 28 20 74 65 73 74 41 64 64 72 3e 3d 30 20 29  f( testAddr>=0 )
fd50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
fd60: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 74 65 73  eJumpHere(v, tes
fd70: 74 41 64 64 72 29 3b 0a 20 20 7d 0a 20 20 73 71  tAddr);.  }.  sq
fd80: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
fd90: 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 0a 20  p(pParse, 1);.. 
fda0: 20 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a   return rReg;.}.
fdb0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
fdc0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
fdd0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
fde0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
fdf0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
fe00: 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e 20 65 78  ode for an IN ex
fe10: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
fe20: 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43       x IN (SELEC
fe30: 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78  T ...).**      x
fe40: 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75   IN (value, valu
fe50: 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  e, ...).**.** Th
fe60: 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65  e left-hand side
fe70: 20 28 4c 48 53 29 20 69 73 20 61 20 73 63 61 6c   (LHS) is a scal
fe80: 61 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ar expression.  
fe90: 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
fea0: 69 64 65 20 28 52 48 53 29 0a 2a 2a 20 69 73 20  ide (RHS).** is 
feb0: 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f  an array of zero
fec0: 20 6f 72 20 6d 6f 72 65 20 76 61 6c 75 65 73 2e   or more values.
fed0: 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e    The expression
fee0: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
fef0: 4c 48 53 20 69 73 0a 2a 2a 20 63 6f 6e 74 61 69  LHS is.** contai
ff00: 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52  ned within the R
ff10: 48 53 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6f  HS.  The value o
ff20: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
ff30: 20 69 73 20 75 6e 6b 6e 6f 77 6e 20 28 4e 55 4c   is unknown (NUL
ff40: 4c 29 0a 2a 2a 20 69 66 20 74 68 65 20 4c 48 53  L).** if the LHS
ff50: 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   is NULL or if t
ff60: 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f  he LHS is not co
ff70: 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74  ntained within t
ff80: 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 0a 2a  he RHS and the.*
ff90: 2a 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 6f  * RHS contains o
ffa0: 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20  ne or more NULL 
ffb0: 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  values..**.** Th
ffc0: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
ffd0: 61 74 65 73 20 63 6f 64 65 20 77 69 6c 6c 20 6a  ates code will j
ffe0: 75 6d 70 20 74 6f 20 64 65 73 74 49 66 46 61 6c  ump to destIfFal
fff0: 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  se if the LHS is
10000 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e   not .** contain
10010 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48  ed within the RH
10020 53 2e 20 20 49 66 20 64 75 65 20 74 6f 20 4e 55  S.  If due to NU
10030 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20 64 65  LLs we cannot de
10040 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4c  termine if the L
10050 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e  HS.** is contain
10060 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 74 68  ed in the RHS th
10070 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49  en jump to destI
10080 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c  fNull.  If the L
10090 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a  HS is contained.
100a0 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 52 48  ** within the RH
100b0 53 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f  S then fall thro
100c0 75 67 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ugh..*/.static v
100d0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
100e0 6f 64 65 49 4e 28 0a 20 20 50 61 72 73 65 20 2a  odeIN(.  Parse *
100f0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
10100 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
10110 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
10120 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
10130 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
10140 20 2f 2a 20 54 68 65 20 49 4e 20 65 78 70 72 65   /* The IN expre
10150 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64  ssion */.  int d
10160 65 73 74 49 66 46 61 6c 73 65 2c 20 20 20 20 20  estIfFalse,     
10170 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
10180 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74   LHS is not cont
10190 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53  ained in the RHS
101a0 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66   */.  int destIf
101b0 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20 4a  Null        /* J
101c0 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20  ump here if the 
101d0 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 6b 6e  results are unkn
101e0 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73  own due to NULLs
101f0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52 68   */.){.  int rRh
10200 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f  sHasNull = 0;  /
10210 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74 20  * Register that 
10220 69 73 20 74 72 75 65 20 69 66 20 52 48 53 20 63  is true if RHS c
10230 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c  ontains NULL val
10240 75 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 61 66  ues */.  char af
10250 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20 2f  finity;        /
10260 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 61 66 66  * Comparison aff
10270 69 6e 69 74 79 20 74 6f 20 75 73 65 20 2a 2f 0a  inity to use */.
10280 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20    int eType;    
10290 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
102a0 6f 66 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20  of the RHS */.  
102b0 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20 20  int r1;         
102c0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
102d0 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72 20  ry use register 
102e0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
102f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
10300 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
10310 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20  nstruction */.. 
10320 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
10330 52 48 53 2e 20 20 20 41 66 74 65 72 20 74 68 69  RHS.   After thi
10340 73 20 73 74 65 70 2c 20 74 68 65 20 74 61 62 6c  s step, the tabl
10350 65 20 77 69 74 68 20 63 75 72 73 6f 72 0a 20 20  e with cursor.  
10360 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  ** pExpr->iTable
10370 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 74   will contains t
10380 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d  he values that m
10390 61 6b 65 20 75 70 20 74 68 65 20 52 48 53 2e 0a  ake up the RHS..
103a0 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73    */.  v = pPars
103b0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
103c0 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20  rt( v!=0 );     
103d0 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65    /* OOM detecte
103e0 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20  d prior to this 
103f0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62  routine */.  Vdb
10400 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
10410 20 22 62 65 67 69 6e 20 49 4e 20 65 78 70 72 22   "begin IN expr"
10420 29 29 3b 0a 20 20 65 54 79 70 65 20 3d 20 73 71  ));.  eType = sq
10430 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
10440 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
10450 26 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 0a  &rRhsHasNull);..
10460 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
10470 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20  the affinity to 
10480 75 73 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  use to create a 
10490 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73  key from the res
104a0 75 6c 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65  ults.  ** of the
104b0 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 61 66 66   expression. aff
104c0 69 6e 69 74 79 53 74 72 20 73 74 6f 72 65 73 20  inityStr stores 
104d0 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  a static string 
104e0 73 75 69 74 61 62 6c 65 20 66 6f 72 0a 20 20 2a  suitable for.  *
104f0 2a 20 50 34 20 6f 66 20 4f 50 5f 4d 61 6b 65 52  * P4 of OP_MakeR
10500 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 61 66  ecord..  */.  af
10510 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69  finity = compari
10520 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70  sonAffinity(pExp
10530 72 29 3b 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74  r);..  /* Code t
10540 68 65 20 4c 48 53 2c 20 74 68 65 20 3c 65 78 70  he LHS, the <exp
10550 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20  r> from "<expr> 
10560 49 4e 20 28 2e 2e 2e 29 22 2e 0a 20 20 2a 2f 0a  IN (...)"..  */.
10570 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
10580 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
10590 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
105a0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
105b0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
105c0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
105d0 72 2d 3e 70 4c 65 66 74 2c 20 72 31 29 3b 0a 0a  r->pLeft, r1);..
105e0 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 48 53 20    /* If the LHS 
105f0 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
10600 65 20 72 65 73 75 6c 74 20 69 73 20 65 69 74 68  e result is eith
10610 65 72 20 66 61 6c 73 65 20 6f 72 20 4e 55 4c 4c  er false or NULL
10620 20 64 65 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20   depending.  ** 
10630 6f 6e 20 77 68 65 74 68 65 72 20 74 68 65 20 52  on whether the R
10640 48 53 20 69 73 20 65 6d 70 74 79 20 6f 72 20 6e  HS is empty or n
10650 6f 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  ot, respectively
10660 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73  ..  */.  if( des
10670 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46  tIfNull==destIfF
10680 61 6c 73 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53  alse ){.    /* S
10690 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65 20  hortcut for the 
106a0 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
106b0 65 20 74 68 65 20 66 61 6c 73 65 20 61 6e 64 20  e the false and 
106c0 4e 55 4c 4c 20 6f 75 74 63 6f 6d 65 73 20 61 72  NULL outcomes ar
106d0 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d  e.    ** the sam
106e0 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  e. */.    sqlite
106f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10700 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 64 65  P_IsNull, r1, de
10710 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c  stIfNull);.  }el
10720 73 65 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  se{.    int addr
10730 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
10740 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp1(v, OP_NotN
10750 75 6c 6c 2c 20 72 31 29 3b 0a 20 20 20 20 73 71  ull, r1);.    sq
10760 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10770 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 45  v, OP_Rewind, pE
10780 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73  xpr->iTable, des
10790 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 73  tIfFalse);.    s
107a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
107b0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
107c0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
107d0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
107e0 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
107f0 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65    }..  if( eType
10800 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
10810 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
10820 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48 53  is case, the RHS
10830 20 69 73 20 74 68 65 20 52 4f 57 49 44 20 6f 66   is the ROWID of
10840 20 74 61 62 6c 65 20 62 2d 74 72 65 65 0a 20 20   table b-tree.  
10850 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
10860 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10870 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 31 2c 20  _MustBeInt, r1, 
10880 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
10890 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
108a0 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69  Op3(v, OP_NotExi
108b0 73 74 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  sts, pExpr->iTab
108c0 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  le, destIfFalse,
108d0 20 72 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   r1);.  }else{. 
108e0 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
108f0 73 65 2c 20 74 68 65 20 52 48 53 20 69 73 20 61  se, the RHS is a
10900 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 0a  n index b-tree..
10910 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
10920 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
10930 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 72 31 2c  OP_Affinity, r1,
10940 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79   1, 0, &affinity
10950 2c 20 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  , 1);..    /* If
10960 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73   the set members
10970 68 69 70 20 74 65 73 74 20 66 61 69 6c 73 2c 20  hip test fails, 
10980 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
10990 6f 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 22  of the .    ** "
109a0 78 20 49 4e 20 28 2e 2e 2e 29 22 20 65 78 70 72  x IN (...)" expr
109b0 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 65  ession must be e
109c0 69 74 68 65 72 20 30 20 6f 72 20 4e 55 4c 4c 2e  ither 0 or NULL.
109d0 20 49 66 20 74 68 65 20 73 65 74 0a 20 20 20 20   If the set.    
109e0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e  ** contains no N
109f0 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e  ULL values, then
10a00 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 30   the result is 0
10a10 2e 20 49 66 20 74 68 65 20 73 65 74 20 0a 20 20  . If the set .  
10a20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6f 6e    ** contains on
10a30 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76  e or more NULL v
10a40 61 6c 75 65 73 2c 20 74 68 65 6e 20 74 68 65 20  alues, then the 
10a50 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20  result of the.  
10a60 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
10a70 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 20 20  is also NULL..  
10a80 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 52 68    */.    if( rRh
10a90 73 48 61 73 4e 75 6c 6c 3d 3d 30 20 7c 7c 20 64  sHasNull==0 || d
10aa0 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74  estIfFalse==dest
10ab0 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  IfNull ){.      
10ac0 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72  /* This branch r
10ad0 75 6e 73 20 69 66 20 69 74 20 69 73 20 6b 6e 6f  uns if it is kno
10ae0 77 6e 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  wn at compile ti
10af0 6d 65 20 74 68 61 74 20 74 68 65 20 52 48 53 0a  me that the RHS.
10b00 20 20 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20        ** cannot 
10b10 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 20 76 61 6c  contain NULL val
10b20 75 65 73 2e 20 54 68 69 73 20 68 61 70 70 65 6e  ues. This happen
10b30 73 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 0a  s as the result.
10b40 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 22 4e        ** of a "N
10b50 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61  OT NULL" constra
10b60 69 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  int in the datab
10b70 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20  ase schema..    
10b80 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c    **.      ** Al
10b90 73 6f 20 72 75 6e 20 74 68 69 73 20 62 72 61 6e  so run this bran
10ba0 63 68 20 69 66 20 4e 55 4c 4c 20 69 73 20 65 71  ch if NULL is eq
10bb0 75 69 76 61 6c 65 6e 74 20 74 6f 20 46 41 4c 53  uivalent to FALS
10bc0 45 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  E.      ** for t
10bd0 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 49  his particular I
10be0 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20  N operator..    
10bf0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
10c00 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
10c10 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
10c20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
10c30 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31 2c 20  estIfFalse, r1, 
10c40 31 29 3b 0a 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1);..    }else{.
10c50 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73        /* In this
10c60 20 62 72 61 6e 63 68 2c 20 74 68 65 20 52 48 53   branch, the RHS
10c70 20 6f 66 20 74 68 65 20 49 4e 20 6d 69 67 68 74   of the IN might
10c80 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20   contain a NULL 
10c90 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  and.      ** the
10ca0 20 70 72 65 73 65 6e 63 65 20 6f 66 20 61 20 4e   presence of a N
10cb0 55 4c 4c 20 6f 6e 20 74 68 65 20 52 48 53 20 6d  ULL on the RHS m
10cc0 61 6b 65 73 20 61 20 64 69 66 66 65 72 65 6e 63  akes a differenc
10cd0 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  e in the.      *
10ce0 2a 20 6f 75 74 63 6f 6d 65 2e 0a 20 20 20 20 20  * outcome..     
10cf0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 31   */.      int j1
10d00 2c 20 6a 32 2c 20 6a 33 3b 0a 0a 20 20 20 20 20  , j2, j3;..     
10d10 20 2f 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20   /* First check 
10d20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c 48  to see if the LH
10d30 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  S is contained i
10d40 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20 73  n the RHS.  If s
10d50 6f 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  o,.      ** then
10d60 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
10d70 20 4e 55 4c 4c 73 20 69 6e 20 74 68 65 20 52 48   NULLs in the RH
10d80 53 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  S does not matte
10d90 72 2c 20 73 6f 20 6a 75 6d 70 0a 20 20 20 20 20  r, so jump.     
10da0 20 2a 2a 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20   ** over all of 
10db0 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 66 6f  the code that fo
10dc0 6c 6c 6f 77 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  llows..      */.
10dd0 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74        j1 = sqlit
10de0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
10df0 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78  v, OP_Found, pEx
10e00 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72  pr->iTable, 0, r
10e10 31 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  1, 1);..      /*
10e20 20 48 65 72 65 20 77 65 20 62 65 67 69 6e 20 67   Here we begin g
10e30 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20 74  enerating code t
10e40 68 61 74 20 72 75 6e 73 20 69 66 20 74 68 65 20  hat runs if the 
10e50 4c 48 53 20 69 73 20 6e 6f 74 0a 20 20 20 20 20  LHS is not.     
10e60 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69   ** contained wi
10e70 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 47  thin the RHS.  G
10e80 65 6e 65 72 61 74 65 20 61 64 64 69 74 69 6f 6e  enerate addition
10e90 61 6c 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20  al code that.   
10ea0 20 20 20 2a 2a 20 74 65 73 74 73 20 74 68 65 20     ** tests the 
10eb0 52 48 53 20 66 6f 72 20 4e 55 4c 4c 73 2e 20 20  RHS for NULLs.  
10ec0 49 66 20 74 68 65 20 52 48 53 20 63 6f 6e 74 61  If the RHS conta
10ed0 69 6e 73 20 61 20 4e 55 4c 4c 20 74 68 65 6e 0a  ins a NULL then.
10ee0 20 20 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f        ** jump to
10ef0 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66   destIfNull.  If
10f00 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 4e 55   there are no NU
10f10 4c 4c 73 20 69 6e 20 74 68 65 20 52 48 53 20 74  LLs in the RHS t
10f20 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6a 75 6d  hen.      ** jum
10f30 70 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65  p to destIfFalse
10f40 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10f50 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j2 = sqlite3Vdb
10f60 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f  eAddOp1(v, OP_No
10f70 74 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75  tNull, rRhsHasNu
10f80 6c 6c 29 3b 0a 20 20 20 20 20 20 6a 33 20 3d 20  ll);.      j3 = 
10f90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10fa0 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
10fb0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
10fc0 20 30 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c   0, rRhsHasNull,
10fd0 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
10fe0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10ff0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20  OP_Integer, -1, 
11000 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20  rRhsHasNull);.  
11010 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
11020 75 6d 70 48 65 72 65 28 76 2c 20 6a 33 29 3b 0a  umpHere(v, j3);.
11030 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11040 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
11050 64 49 6d 6d 2c 20 72 52 68 73 48 61 73 4e 75 6c  dImm, rRhsHasNul
11060 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  l, 1);.      sql
11070 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
11080 28 76 2c 20 6a 32 29 3b 0a 0a 20 20 20 20 20 20  (v, j2);..      
11090 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 61  /* Jump to the a
110a0 70 70 72 6f 70 72 69 61 74 65 20 74 61 72 67 65  ppropriate targe
110b0 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  t depending on w
110c0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20  hether or not.  
110d0 20 20 20 20 2a 2a 20 74 68 65 20 52 48 53 20 63      ** the RHS c
110e0 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 0a 20  ontains a NULL. 
110f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
11100 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11110 76 2c 20 4f 50 5f 49 66 2c 20 72 52 68 73 48 61  v, OP_If, rRhsHa
11120 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c  sNull, destIfNul
11130 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
11140 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11150 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49  P_Goto, 0, destI
11160 66 46 61 6c 73 65 29 3b 0a 0a 20 20 20 20 20 20  fFalse);..      
11170 2f 2a 20 54 68 65 20 4f 50 5f 46 6f 75 6e 64 20  /* The OP_Found 
11180 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  at the top of th
11190 69 73 20 62 72 61 6e 63 68 20 6a 75 6d 70 73 20  is branch jumps 
111a0 68 65 72 65 20 77 68 65 6e 20 74 72 75 65 2c 20  here when true, 
111b0 0a 20 20 20 20 20 20 2a 2a 20 63 61 75 73 69 6e  .      ** causin
111c0 67 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 49 4e  g the overall IN
111d0 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
111e0 75 61 74 69 6f 6e 20 74 6f 20 66 61 6c 6c 20 74  uation to fall t
111f0 68 72 6f 75 67 68 2e 0a 20 20 20 20 20 20 2a 2f  hrough..      */
11200 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11210 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31  beJumpHere(v, j1
11220 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
11230 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
11240 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
11250 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
11260 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20  achePop(pParse, 
11270 31 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  1);.  VdbeCommen
11280 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78  t((v, "end IN ex
11290 70 72 22 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  pr"));.}.#endif 
112a0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
112b0 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a  UBQUERY */../*.*
112c0 2a 20 44 75 70 6c 69 63 61 74 65 20 61 6e 20 38  * Duplicate an 8
112d0 2d 62 79 74 65 20 76 61 6c 75 65 0a 2a 2f 0a 73  -byte value.*/.s
112e0 74 61 74 69 63 20 63 68 61 72 20 2a 64 75 70 38  tatic char *dup8
112f0 62 79 74 65 73 28 56 64 62 65 20 2a 76 2c 20 63  bytes(Vdbe *v, c
11300 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e 29 7b 0a  onst char *in){.
11310 20 20 63 68 61 72 20 2a 6f 75 74 20 3d 20 73 71    char *out = sq
11320 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
11330 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76  (sqlite3VdbeDb(v
11340 29 2c 20 38 29 3b 0a 20 20 69 66 28 20 6f 75 74  ), 8);.  if( out
11350 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 6f   ){.    memcpy(o
11360 75 74 2c 20 69 6e 2c 20 38 29 3b 0a 20 20 7d 0a  ut, in, 8);.  }.
11370 20 20 72 65 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a    return out;.}.
11380 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11390 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
113a0 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  INT./*.** Genera
113b0 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  te an instructio
113c0 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20  n that will put 
113d0 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  the floating poi
113e0 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63  nt.** value desc
113f0 72 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d  ribed by z[0..n-
11400 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  1] into register
11410 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   iMem..**.** The
11420 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c   z[] string will
11430 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65   probably not be
11440 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64   zero-terminated
11450 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a  .  But the .** z
11460 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69 73  [n] character is
11470 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
11480 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  e something that
11490 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a   does not look.*
114a0 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69  * like the conti
114b0 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  nuation of the n
114c0 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  umber..*/.static
114d0 20 76 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56   void codeReal(V
114e0 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68  dbe *v, const ch
114f0 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74  ar *z, int negat
11500 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29  eFlag, int iMem)
11510 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a  {.  if( ALWAYS(z
11520 21 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f 75 62  !=0) ){.    doub
11530 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 68  le value;.    ch
11540 61 72 20 2a 7a 56 3b 0a 20 20 20 20 73 71 6c 69  ar *zV;.    sqli
11550 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75  te3AtoF(z, &valu
11560 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
11570 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54  30(z), SQLITE_UT
11580 46 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  F8);.    assert(
11590 20 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76   !sqlite3IsNaN(v
115a0 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68 65 20  alue) ); /* The 
115b0 6e 65 77 20 41 74 6f 46 20 6e 65 76 65 72 20 72  new AtoF never r
115c0 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20  eturns NaN */.  
115d0 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67    if( negateFlag
115e0 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75   ) value = -valu
115f0 65 3b 0a 20 20 20 20 7a 56 20 3d 20 64 75 70 38  e;.    zV = dup8
11600 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29  bytes(v, (char*)
11610 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 73 71 6c  &value);.    sql
11620 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
11630 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d  , OP_Real, 0, iM
11640 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 52 45  em, 0, zV, P4_RE
11650 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  AL);.  }.}.#endi
11660 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  f.../*.** Genera
11670 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  te an instructio
11680 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20  n that will put 
11690 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73 63  the integer desc
116a0 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20  ribe by.** text 
116b0 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72  z[0..n-1] into r
116c0 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a  egister iMem..**
116d0 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65  .** Expr.u.zToke
116e0 6e 20 69 73 20 61 6c 77 61 79 73 20 55 54 46 38  n is always UTF8
116f0 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e   and zero-termin
11700 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ated..*/.static 
11710 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72  void codeInteger
11720 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
11730 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
11740 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d   negFlag, int iM
11750 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  em){.  Vdbe *v =
11760 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
11770 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
11780 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
11790 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20   ){.    int i = 
117a0 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b  pExpr->u.iValue;
117b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d  .    assert( i>=
117c0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 67  0 );.    if( neg
117d0 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20  Flag ) i = -i;. 
117e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
117f0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
11800 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20  er, i, iMem);.  
11810 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 63  }else{.    int c
11820 3b 0a 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b  ;.    i64 value;
11830 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
11840 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54  *z = pExpr->u.zT
11850 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74  oken;.    assert
11860 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63 20  ( z!=0 );.    c 
11870 3d 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28  = sqlite3Atoi64(
11880 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69 74  z, &value, sqlit
11890 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53  e3Strlen30(z), S
118a0 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
118b0 20 69 66 28 20 63 3d 3d 30 20 7c 7c 20 28 63 3d   if( c==0 || (c=
118c0 3d 32 20 26 26 20 6e 65 67 46 6c 61 67 29 20 29  =2 && negFlag) )
118d0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56  {.      char *zV
118e0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67 46  ;.      if( negF
118f0 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20 63  lag ){ value = c
11900 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49  ==2 ? SMALLEST_I
11910 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d  NT64 : -value; }
11920 0a 20 20 20 20 20 20 7a 56 20 3d 20 64 75 70 38  .      zV = dup8
11930 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29  bytes(v, (char*)
11940 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 73  &value);.      s
11950 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
11960 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c  (v, OP_Int64, 0,
11970 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34   iMem, 0, zV, P4
11980 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c  _INT64);.    }el
11990 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  se{.#ifdef SQLIT
119a0 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
119b0 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69  POINT.      sqli
119c0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
119d0 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69  se, "oversized i
119e0 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e  nteger: %s%s", n
119f0 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22  egFlag ? "-" : "
11a00 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 20  ", z);.#else.   
11a10 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a     codeReal(v, z
11a20 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29  , negFlag, iMem)
11a30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
11a40 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61   }.}../*.** Clea
11a50 72 20 61 20 63 61 63 68 65 20 65 6e 74 72 79 2e  r a cache entry.
11a60 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11a70 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28  cacheEntryClear(
11a80 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73  Parse *pParse, s
11a90 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
11aa0 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74 65  *p){.  if( p->te
11ab0 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66 28  mpReg ){.    if(
11ac0 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
11ad0 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72  g<ArraySize(pPar
11ae0 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b  se->aTempReg) ){
11af0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61  .      pParse->a
11b00 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e  TempReg[pParse->
11b10 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 2d  nTempReg++] = p-
11b20 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20  >iReg;.    }.   
11b30 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b   p->tempReg = 0;
11b40 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  .  }.}.../*.** R
11b50 65 63 6f 72 64 20 69 6e 20 74 68 65 20 63 6f 6c  ecord in the col
11b60 75 6d 6e 20 63 61 63 68 65 20 74 68 61 74 20 61  umn cache that a
11b70 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6c 75   particular colu
11b80 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72  mn from a.** par
11b90 74 69 63 75 6c 61 72 20 74 61 62 6c 65 20 69 73  ticular table is
11ba0 20 73 74 6f 72 65 64 20 69 6e 20 61 20 70 61 72   stored in a par
11bb0 74 69 63 75 6c 61 72 20 72 65 67 69 73 74 65 72  ticular register
11bc0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
11bd0 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
11be0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
11bf0 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 69 43 6f  nt iTab, int iCo
11c00 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20  l, int iReg){.  
11c10 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e  int i;.  int min
11c20 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72  Lru;.  int idxLr
11c30 75 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  u;.  struct yCol
11c40 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 61 73 73  Cache *p;..  ass
11c50 65 72 74 28 20 69 52 65 67 3e 30 20 29 3b 20 20  ert( iReg>0 );  
11c60 2f 2a 20 52 65 67 69 73 74 65 72 20 6e 75 6d 62  /* Register numb
11c70 65 72 73 20 61 72 65 20 61 6c 77 61 79 73 20 70  ers are always p
11c80 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 61 73 73  ositive */.  ass
11c90 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26  ert( iCol>=-1 &&
11ca0 20 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20   iCol<32768 );  
11cb0 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e  /* Finite column
11cc0 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f   numbers */..  /
11cd0 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c  * The SQLITE_Col
11ce0 75 6d 6e 43 61 63 68 65 20 66 6c 61 67 20 64 69  umnCache flag di
11cf0 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d  sables the colum
11d00 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 69  n cache.  This i
11d10 73 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20  s used.  ** for 
11d20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74  testing only - t
11d30 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 53 51  o verify that SQ
11d40 4c 69 74 65 20 61 6c 77 61 79 73 20 67 65 74 73  Lite always gets
11d50 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72   the same answer
11d60 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 64 20 77  .  ** with and w
11d70 69 74 68 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d  ithout the colum
11d80 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20  n cache..  */.  
11d90 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
11da0 44 69 73 61 62 6c 65 64 28 70 50 61 72 73 65 2d  Disabled(pParse-
11db0 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c 75  >db, SQLITE_Colu
11dc0 6d 6e 43 61 63 68 65 29 20 29 20 72 65 74 75 72  mnCache) ) retur
11dd0 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 72  n;..  /* First r
11de0 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73 74  eplace any exist
11df0 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a  ing entry..  **.
11e00 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74    ** Actually, t
11e10 68 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75 6d  he way the colum
11e20 6e 20 63 61 63 68 65 20 69 73 20 63 75 72 72 65  n cache is curre
11e30 6e 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61 72  ntly used, we ar
11e40 65 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20 2a  e guaranteed.  *
11e50 2a 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65 63  * that the objec
11e60 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72  t will never alr
11e70 65 61 64 79 20 62 65 20 69 6e 20 63 61 63 68 65  eady be in cache
11e80 2e 20 20 56 65 72 69 66 79 20 74 68 69 73 20 67  .  Verify this g
11e90 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23  uarantee..  */.#
11ea0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
11eb0 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
11ec0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
11ed0 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
11ee0 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
11ef0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 52 65    assert( p->iRe
11f00 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61 62 6c  g==0 || p->iTabl
11f10 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69 43  e!=iTab || p->iC
11f20 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20  olumn!=iCol );. 
11f30 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
11f40 46 69 6e 64 20 61 6e 20 65 6d 70 74 79 20 73 6c  Find an empty sl
11f50 6f 74 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69  ot and replace i
11f60 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20  t */.  for(i=0, 
11f70 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
11f80 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
11f90 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
11fa0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
11fb0 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iReg==0 ){.     
11fc0 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61   p->iLevel = pPa
11fd0 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
11fe0 3b 0a 20 20 20 20 20 20 70 2d 3e 69 54 61 62 6c  ;.      p->iTabl
11ff0 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20  e = iTab;.      
12000 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f  p->iColumn = iCo
12010 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67  l;.      p->iReg
12020 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 20 20 70   = iReg;.      p
12030 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  ->tempReg = 0;. 
12040 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50       p->lru = pP
12050 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b  arse->iCacheCnt+
12060 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  +;.      return;
12070 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
12080 20 52 65 70 6c 61 63 65 20 74 68 65 20 6c 61 73   Replace the las
12090 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64 20  t recently used 
120a0 2a 2f 0a 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78  */.  minLru = 0x
120b0 37 66 66 66 66 66 66 66 3b 0a 20 20 69 64 78 4c  7fffffff;.  idxL
120c0 72 75 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69  ru = -1;.  for(i
120d0 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
120e0 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
120f0 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
12100 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
12110 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29   p->lru<minLru )
12120 7b 0a 20 20 20 20 20 20 69 64 78 4c 72 75 20 3d  {.      idxLru =
12130 20 69 3b 0a 20 20 20 20 20 20 6d 69 6e 4c 72 75   i;.      minLru
12140 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d   = p->lru;.    }
12150 0a 20 20 7d 0a 20 20 69 66 28 20 41 4c 57 41 59  .  }.  if( ALWAY
12160 53 28 69 64 78 4c 72 75 3e 3d 30 29 20 29 7b 0a  S(idxLru>=0) ){.
12170 20 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d      p = &pParse-
12180 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72  >aColCache[idxLr
12190 75 5d 3b 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65  u];.    p->iLeve
121a0 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
121b0 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 70 2d 3e  heLevel;.    p->
121c0 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20  iTable = iTab;. 
121d0 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20     p->iColumn = 
121e0 69 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 52 65  iCol;.    p->iRe
121f0 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 70 2d  g = iReg;.    p-
12200 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
12210 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73    p->lru = pPars
12220 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a  e->iCacheCnt++;.
12230 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
12240 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74  }../*.** Indicat
12250 65 20 74 68 61 74 20 72 65 67 69 73 74 65 72 73  e that registers
12260 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e 2e 69   between iReg..i
12270 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65 20 62  Reg+nReg-1 are b
12280 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
12290 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 72  ..** Purge the r
122a0 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
122b0 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d  s from the colum
122c0 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64  n cache..*/.void
122d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
122e0 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20 2a 70  eRemove(Parse *p
122f0 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c  Parse, int iReg,
12300 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
12310 74 20 69 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74  t i;.  int iLast
12320 20 3d 20 69 52 65 67 20 2b 20 6e 52 65 67 20 2d   = iReg + nReg -
12330 20 31 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   1;.  struct yCo
12340 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72  lCache *p;.  for
12350 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
12360 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
12370 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
12380 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
12390 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a  nt r = p->iReg;.
123a0 20 20 20 20 69 66 28 20 72 3e 3d 69 52 65 67 20      if( r>=iReg 
123b0 26 26 20 72 3c 3d 69 4c 61 73 74 20 29 7b 0a 20  && r<=iLast ){. 
123c0 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43       cacheEntryC
123d0 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b  lear(pParse, p);
123e0 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d  .      p->iReg =
123f0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
12400 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20  ./*.** Remember 
12410 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75  the current colu
12420 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65 78 74  mn cache context
12430 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74 72 69  .  Any new entri
12440 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64 64 65  es added.** adde
12450 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d to the column 
12460 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
12470 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76 65   call are remove
12480 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f  d when the.** co
12490 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70 20  rresponding pop 
124a0 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20  occurs..*/.void 
124b0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
124c0 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72  Push(Parse *pPar
124d0 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 69  se){.  pParse->i
124e0 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 7d 0a  CacheLevel++;.}.
124f0 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66 72  ./*.** Remove fr
12500 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  om the column ca
12510 63 68 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20  che any entries 
12520 74 68 61 74 20 77 65 72 65 20 61 64 64 65 64 20  that were added 
12530 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68 65  since the.** the
12540 20 70 72 65 76 69 6f 75 73 20 4e 20 50 75 73 68   previous N Push
12550 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 49 6e   operations.  In
12560 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
12570 73 74 6f 72 65 20 74 68 65 20 63 61 63 68 65 0a  store the cache.
12580 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  ** to the state 
12590 69 74 20 77 61 73 20 69 6e 20 4e 20 50 75 73 68  it was in N Push
125a0 65 73 20 61 67 6f 2e 0a 2a 2f 0a 76 6f 69 64 20  es ago..*/.void 
125b0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
125c0 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  Pop(Parse *pPars
125d0 65 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74  e, int N){.  int
125e0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
125f0 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 61 73 73  lCache *p;.  ass
12600 65 72 74 28 20 4e 3e 30 20 29 3b 0a 20 20 61 73  ert( N>0 );.  as
12610 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43  sert( pParse->iC
12620 61 63 68 65 4c 65 76 65 6c 3e 3d 4e 20 29 3b 0a  acheLevel>=N );.
12630 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65    pParse->iCache
12640 4c 65 76 65 6c 20 2d 3d 20 4e 3b 0a 20 20 66 6f  Level -= N;.  fo
12650 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
12660 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
12670 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
12680 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
12690 69 66 28 20 70 2d 3e 69 52 65 67 20 26 26 20 70  if( p->iReg && p
126a0 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d  ->iLevel>pParse-
126b0 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a  >iCacheLevel ){.
126c0 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79        cacheEntry
126d0 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29  Clear(pParse, p)
126e0 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  ;.      p->iReg 
126f0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
12700 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63  ../*.** When a c
12710 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20  ached column is 
12720 72 65 75 73 65 64 2c 20 6d 61 6b 65 20 73 75 72  reused, make sur
12730 65 20 74 68 61 74 20 69 74 73 20 72 65 67 69 73  e that its regis
12740 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e  ter is.** no lon
12750 67 65 72 20 61 76 61 69 6c 61 62 6c 65 20 61 73  ger available as
12760 20 61 20 74 65 6d 70 20 72 65 67 69 73 74 65 72   a temp register
12770 2e 20 20 74 69 63 6b 65 74 20 23 33 38 37 39 3a  .  ticket #3879:
12780 20 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72    that same.** r
12790 65 67 69 73 74 65 72 20 6d 69 67 68 74 20 62 65  egister might be
127a0 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 69 6e   in the cache in
127b0 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73   multiple places
127c0 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f 0a  , so be sure to.
127d0 2a 2a 20 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e  ** get them all.
127e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
127f0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
12800 50 69 6e 52 65 67 69 73 74 65 72 28 50 61 72 73  PinRegister(Pars
12810 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
12820 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Reg){.  int i;. 
12830 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
12840 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  e *p;.  for(i=0,
12850 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
12860 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
12870 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
12880 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
12890 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20  >iReg==iReg ){. 
128a0 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20       p->tempReg 
128b0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
128c0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
128d0 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61 63 74   code to extract
128e0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
128f0 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
12900 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a   of a table..*/.
12910 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
12920 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
12930 61 62 6c 65 28 0a 20 20 56 64 62 65 20 2a 76 2c  able(.  Vdbe *v,
12940 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
12950 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  DBE under constr
12960 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c  uction */.  Tabl
12970 65 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20 54  e *pTab,    /* T
12980 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  he table contain
12990 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 2a 2f  ing the value */
129a0 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20  .  int iTabCur, 
129b0 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
129c0 63 75 72 73 6f 72 2e 20 20 4f 72 20 74 68 65 20  cursor.  Or the 
129d0 50 4b 20 63 75 72 73 6f 72 20 66 6f 72 20 57 49  PK cursor for WI
129e0 54 48 4f 55 54 20 52 4f 57 49 44 20 2a 2f 0a 20  THOUT ROWID */. 
129f0 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20   int iCol,      
12a00 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
12a10 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61   column to extra
12a20 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ct */.  int regO
12a30 75 74 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61  ut      /* Extra
12a40 63 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74  ct the value int
12a50 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  o this register 
12a60 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 43 6f 6c  */.){.  if( iCol
12a70 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62  <0 || iCol==pTab
12a80 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 73  ->iPKey ){.    s
12a90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12aa0 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54  (v, OP_Rowid, iT
12ab0 61 62 43 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a  abCur, regOut);.
12ac0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
12ad0 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c 28   op = IsVirtual(
12ae0 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75  pTab) ? OP_VColu
12af0 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a  mn : OP_Column;.
12b00 20 20 20 20 69 6e 74 20 78 20 3d 20 69 43 6f 6c      int x = iCol
12b10 3b 0a 20 20 20 20 69 66 28 20 21 48 61 73 52 6f  ;.    if( !HasRo
12b20 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20  wid(pTab) ){.   
12b30 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f     x = sqlite3Co
12b40 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69  lumnOfIndex(sqli
12b50 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
12b60 65 78 28 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b  ex(pTab), iCol);
12b70 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
12b80 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
12b90 6f 70 2c 20 69 54 61 62 43 75 72 2c 20 78 2c 20  op, iTabCur, x, 
12ba0 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69  regOut);.  }.  i
12bb0 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20  f( iCol>=0 ){.  
12bc0 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44    sqlite3ColumnD
12bd0 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20  efault(v, pTab, 
12be0 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20  iCol, regOut);. 
12bf0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
12c00 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
12c10 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65 20  ill extract the 
12c20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d  iColumn-th colum
12c30 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20  n from.** table 
12c40 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74  pTab and store t
12c50 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  he column value 
12c60 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e 20 20  in a register.  
12c70 41 6e 20 65 66 66 6f 72 74 0a 2a 2a 20 69 73 20  An effort.** is 
12c80 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68  made to store th
12c90 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
12ca0 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2c  n register iReg,
12cb0 20 62 75 74 20 74 68 69 73 20 69 73 0a 2a 2a 20   but this is.** 
12cc0 6e 6f 74 20 67 75 61 72 61 6e 74 65 65 64 2e 20  not guaranteed. 
12cd0 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
12ce0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   the column valu
12cf0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
12d00 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  *.** There must 
12d10 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f  be an open curso
12d20 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69 54 61  r to pTab in iTa
12d30 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ble when this ro
12d40 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
12d50 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c  ed.  If iColumn<
12d60 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67  0 then code is g
12d70 65 6e 65 72 61 74 65 64 20 74 68 61 74 20 65 78  enerated that ex
12d80 74 72 61 63 74 73 20 74 68 65 20 72 6f 77 69 64  tracts the rowid
12d90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12da0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
12db0 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
12dc0 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  se,   /* Parsing
12dd0 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
12de0 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
12df0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
12e00 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
12e10 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77  n of the table w
12e20 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 66 72  e are reading fr
12e30 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  om */.  int iCol
12e40 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65  umn,     /* Inde
12e50 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  x of the table c
12e60 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  olumn */.  int i
12e70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54  Table,      /* T
12e80 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69  he cursor pointi
12e90 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ng to the table 
12ea0 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20  */.  int iReg,  
12eb0 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72        /* Store r
12ec0 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20  esults here */. 
12ed0 20 75 38 20 70 35 20 20 20 20 20 20 20 20 20 20   u8 p5          
12ee0 20 20 2f 2a 20 50 35 20 76 61 6c 75 65 20 66 6f    /* P5 value fo
12ef0 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2a 2f 0a 29  r OP_Column */.)
12f00 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
12f10 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
12f20 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
12f30 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20  ColCache *p;..  
12f40 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
12f50 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
12f60 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
12f70 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
12f80 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3e 30 20    if( p->iReg>0 
12f90 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  && p->iTable==iT
12fa0 61 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75  able && p->iColu
12fb0 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  mn==iColumn ){. 
12fc0 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50       p->lru = pP
12fd0 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b  arse->iCacheCnt+
12fe0 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
12ff0 45 78 70 72 43 61 63 68 65 50 69 6e 52 65 67 69  ExprCachePinRegi
13000 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 2d 3e  ster(pParse, p->
13010 69 52 65 67 29 3b 0a 20 20 20 20 20 20 72 65 74  iReg);.      ret
13020 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20  urn p->iReg;.   
13030 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73 65 72   }.  }  .  asser
13040 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c  t( v!=0 );.  sql
13050 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
13060 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20  olumnOfTable(v, 
13070 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20 69 43  pTab, iTable, iC
13080 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20  olumn, iReg);.  
13090 69 66 28 20 70 35 20 29 7b 0a 20 20 20 20 73 71  if( p5 ){.    sq
130a0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
130b0 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d 65 6c 73  5(v, p5);.  }els
130c0 65 7b 20 20 20 0a 20 20 20 20 73 71 6c 69 74 65  e{   .    sqlite
130d0 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
130e0 70 50 61 72 73 65 2c 20 69 54 61 62 6c 65 2c 20  pParse, iTable, 
130f0 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a  iColumn, iReg);.
13100 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65    }.  return iRe
13110 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  g;.}../*.** Clea
13120 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63  r all column cac
13130 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76  he entries..*/.v
13140 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
13150 61 63 68 65 43 6c 65 61 72 28 50 61 72 73 65 20  acheClear(Parse 
13160 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
13170 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
13180 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72  Cache *p;..  for
13190 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
131a0 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
131b0 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
131c0 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
131d0 66 28 20 70 2d 3e 69 52 65 67 20 29 7b 0a 20 20  f( p->iReg ){.  
131e0 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c      cacheEntryCl
131f0 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ear(pParse, p);.
13200 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20        p->iReg = 
13210 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
13220 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  /*.** Record the
13230 20 66 61 63 74 20 74 68 61 74 20 61 6e 20 61 66   fact that an af
13240 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68 61  finity change ha
13250 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 69 43  s occurred on iC
13260 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65 72  ount.** register
13270 73 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  s starting with 
13280 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20  iStart..*/.void 
13290 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
132a0 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 50  AffinityChange(P
132b0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
132c0 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69 43  t iStart, int iC
132d0 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  ount){.  sqlite3
132e0 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
132f0 70 50 61 72 73 65 2c 20 69 53 74 61 72 74 2c 20  pParse, iStart, 
13300 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  iCount);.}../*.*
13310 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
13320 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20  to move content 
13330 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69  from registers i
13340 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65  From...iFrom+nRe
13350 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69  g-1.** over to i
13360 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20  To..iTo+nReg-1. 
13370 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Keep the column 
13380 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74 65  cache up-to-date
13390 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
133a0 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61  3ExprCodeMove(Pa
133b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
133c0 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c   iFrom, int iTo,
133d0 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
133e0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
133f0 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 61 73  olCache *p;.  as
13400 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f  sert( iFrom>=iTo
13410 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e  +nReg || iFrom+n
13420 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71  Reg<=iTo );.  sq
13430 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
13440 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
13450 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69  P_Move, iFrom, i
13460 54 6f 2c 20 6e 52 65 67 2d 31 29 3b 0a 20 20 66  To, nReg-1);.  f
13470 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
13480 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
13490 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
134a0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
134b0 20 69 6e 74 20 78 20 3d 20 70 2d 3e 69 52 65 67   int x = p->iReg
134c0 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 69 46 72  ;.    if( x>=iFr
134d0 6f 6d 20 26 26 20 78 3c 69 46 72 6f 6d 2b 6e 52  om && x<iFrom+nR
134e0 65 67 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  eg ){.      p->i
134f0 52 65 67 20 2b 3d 20 69 54 6f 2d 69 46 72 6f 6d  Reg += iTo-iFrom
13500 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
13510 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
13520 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
13530 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52  ned(SQLITE_COVER
13540 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  AGE_TEST)./*.** 
13550 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
13560 6e 79 20 72 65 67 69 73 74 65 72 20 69 6e 20 74  ny register in t
13570 68 65 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e  he range iFrom..
13580 69 54 6f 20 28 69 6e 63 6c 75 73 69 76 65 29 0a  iTo (inclusive).
13590 2a 2a 20 69 73 20 75 73 65 64 20 61 73 20 70 61  ** is used as pa
135a0 72 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  rt of the column
135b0 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
135c0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
135d0 65 64 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ed within assert
135e0 28 29 20 61 6e 64 20 74 65 73 74 63 61 73 65 28  () and testcase(
135f0 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a  ) macros only.**
13600 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61 70   and does not ap
13610 70 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c  pear in a normal
13620 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69   build..*/.stati
13630 63 20 69 6e 74 20 75 73 65 64 41 73 43 6f 6c 75  c int usedAsColu
13640 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  mnCache(Parse *p
13650 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d  Parse, int iFrom
13660 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e  , int iTo){.  in
13670 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
13680 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f  olCache *p;.  fo
13690 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
136a0 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
136b0 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
136c0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
136d0 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b  int r = p->iReg;
136e0 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 46 72 6f  .    if( r>=iFro
136f0 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29 20 72 65  m && r<=iTo ) re
13700 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f  turn 1;    /*NO_
13710 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  TEST*/.  }.  ret
13720 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
13730 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
13740 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45 52 41  || SQLITE_COVERA
13750 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a  GE_TEST */../*.*
13760 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 65 78 70  * Convert an exp
13770 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20  ression node to 
13780 61 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2f  a TK_REGISTER.*/
13790 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
137a0 72 54 6f 52 65 67 69 73 74 65 72 28 45 78 70 72  rToRegister(Expr
137b0 20 2a 70 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a   *p, int iReg){.
137c0 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70    p->op2 = p->op
137d0 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52  ;.  p->op = TK_R
137e0 45 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54  EGISTER;.  p->iT
137f0 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20 45  able = iReg;.  E
13800 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79  xprClearProperty
13810 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a  (p, EP_Skip);.}.
13820 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
13830 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75  code into the cu
13840 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76  rrent Vdbe to ev
13850 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65 6e  aluate the given
13860 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  .** expression. 
13870 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 6f 72   Attempt to stor
13880 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
13890 20 72 65 67 69 73 74 65 72 20 22 74 61 72 67 65   register "targe
138a0 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  t"..** Return th
138b0 65 20 72 65 67 69 73 74 65 72 20 77 68 65 72 65  e register where
138c0 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
138d0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  red..**.** With 
138e0 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68  this routine, th
138f0 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e  ere is no guaran
13900 74 65 65 20 74 68 61 74 20 72 65 73 75 6c 74 73  tee that results
13910 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72   will.** be stor
13920 65 64 20 69 6e 20 74 61 72 67 65 74 2e 20 20 54  ed in target.  T
13930 68 65 20 72 65 73 75 6c 74 20 6d 69 67 68 74 20  he result might 
13940 62 65 20 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d  be stored in som
13950 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69 73  e other.** regis
13960 74 65 72 20 69 66 20 69 74 20 69 73 20 63 6f 6e  ter if it is con
13970 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f  venient to do so
13980 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
13990 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  unction.** must 
139a0 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e  check the return
139b0 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20 74   code and move t
139c0 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68  he results to th
139d0 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 72 65 67  e desired.** reg
139e0 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ister..*/.int sq
139f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
13a00 67 65 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  get(Parse *pPars
13a10 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
13a20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56  int target){.  V
13a30 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
13a40 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68 65 20  >pVdbe;  /* The 
13a50 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  VM under constru
13a60 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f  ction */.  int o
13a70 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
13a80 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f       /* The opco
13a90 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  de being coded *
13aa0 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20  /.  int inReg = 
13ab0 74 61 72 67 65 74 3b 20 20 20 20 20 20 20 2f 2a  target;       /*
13ac0 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65 64 20   Results stored 
13ad0 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e 52 65  in register inRe
13ae0 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  g */.  int regFr
13af0 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ee1 = 0;        
13b00 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20   /* If non-zero 
13b10 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72  free this tempor
13b20 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ary register */.
13b30 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
13b40 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   0;         /* I
13b50 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20  f non-zero free 
13b60 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72  this temporary r
13b70 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
13b80 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 72 34 3b   r1, r2, r3, r4;
13b90 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75         /* Variou
13ba0 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  s register numbe
13bb0 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  rs */.  sqlite3 
13bc0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
13bd0 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73  ; /* The databas
13be0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
13bf0 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
13c00 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70  t>0 && target<=p
13c10 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  Parse->nMem );. 
13c20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
13c30 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
13c40 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
13c50 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  d );.    return 
13c60 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 45  0;.  }..  if( pE
13c70 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70  xpr==0 ){.    op
13c80 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65   = TK_NULL;.  }e
13c90 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45  lse{.    op = pE
13ca0 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73  xpr->op;.  }.  s
13cb0 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
13cc0 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
13cd0 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67  UMN: {.      Agg
13ce0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d  Info *pAggInfo =
13cf0 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
13d00 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 41  ;.      struct A
13d10 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
13d20 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43   = &pAggInfo->aC
13d30 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b  ol[pExpr->iAgg];
13d40 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67  .      if( !pAgg
13d50 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
13d60 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
13d70 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30  rt( pCol->iMem>0
13d80 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65   );.        inRe
13d90 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a  g = pCol->iMem;.
13da0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
13db0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
13dc0 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74  AggInfo->useSort
13dd0 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ingIdx ){.      
13de0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13df0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
13e00 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74  , pAggInfo->sort
13e10 69 6e 67 49 64 78 50 54 61 62 2c 0a 20 20 20 20  ingIdxPTab,.    
13e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e30 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
13e40 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74  iSorterColumn, t
13e50 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
13e60 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
13e70 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73       /* Otherwis
13e80 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74  e, fall thru int
13e90 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20  o the TK_COLUMN 
13ea0 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  case */.    }.  
13eb0 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
13ec0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54  : {.      int iT
13ed0 61 62 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  ab = pExpr->iTab
13ee0 6c 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54  le;.      if( iT
13ef0 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ab<0 ){.        
13f00 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6b 42 61  if( pParse->ckBa
13f10 73 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  se>0 ){.        
13f20 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20    /* Generating 
13f30 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
13f40 73 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 69  s or inserting i
13f50 6e 74 6f 20 70 61 72 74 69 61 6c 20 69 6e 64 65  nto partial inde
13f60 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  x */.          i
13f70 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 43  nReg = pExpr->iC
13f80 6f 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e  olumn + pParse->
13f90 63 6b 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  ckBase;.        
13fa0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
13fb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13fc0 20 20 2f 2a 20 44 65 6c 65 74 69 6e 67 20 66 72    /* Deleting fr
13fd0 6f 6d 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64  om a partial ind
13fe0 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ex */.          
13ff0 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 69  iTab = pParse->i
14000 50 61 72 74 49 64 78 54 61 62 3b 0a 20 20 20 20  PartIdxTab;.    
14010 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
14020 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
14030 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
14040 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78  lumn(pParse, pEx
14050 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20  pr->pTab,.      
14060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14070 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
14080 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 74  iColumn, iTab, t
14090 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
140a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140b0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32        pExpr->op2
140c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
140d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
140e0 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  K_INTEGER: {.   
140f0 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70     codeInteger(p
14100 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c  Parse, pExpr, 0,
14110 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
14120 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
14130 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14140 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
14150 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41      case TK_FLOA
14160 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
14170 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
14180 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
14190 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
141a0 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78   codeReal(v, pEx
141b0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c  pr->u.zToken, 0,
141c0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
141d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
141e0 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
141f0 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
14200 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
14210 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
14220 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
14230 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14240 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74  eAddOp4(v, OP_St
14250 72 69 6e 67 38 2c 20 30 2c 20 74 61 72 67 65 74  ring8, 0, target
14260 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  , 0, pExpr->u.zT
14270 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  oken, 0);.      
14280 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
14290 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b   case TK_NULL: {
142a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
142b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
142c0 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
142d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
142e0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
142f0 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54  TE_OMIT_BLOB_LIT
14300 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b  ERAL.    case TK
14310 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69  _BLOB: {.      i
14320 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73  nt n;.      cons
14330 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20  t char *z;.     
14340 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20   char *zBlob;.  
14350 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
14360 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
14370 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
14380 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14390 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
143a0 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78  n[0]=='x' || pEx
143b0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d  pr->u.zToken[0]=
143c0 3d 27 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73  ='X' );.      as
143d0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
143e0 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29  Token[1]=='\'' )
143f0 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26 70 45 78  ;.      z = &pEx
14400 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b  pr->u.zToken[2];
14410 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  .      n = sqlit
14420 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20  e3Strlen30(z) - 
14430 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
14440 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20   z[n]=='\'' );. 
14450 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c       zBlob = sql
14460 69 74 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71  ite3HexToBlob(sq
14470 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20  lite3VdbeDb(v), 
14480 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  z, n);.      sql
14490 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
144a0 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20  , OP_Blob, n/2, 
144b0 74 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62  target, 0, zBlob
144c0 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
144d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
144e0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
144f0 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b  e TK_VARIABLE: {
14500 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
14510 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
14520 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
14530 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ue) );.      ass
14540 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
14550 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20  oken!=0 );.     
14560 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
14570 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29  u.zToken[0]!=0 )
14580 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
14590 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
145a0 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d  Variable, pExpr-
145b0 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74  >iColumn, target
145c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
145d0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21  pr->u.zToken[1]!
145e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
145f0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
14600 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 0a 20  Token[0]=='?' . 
14610 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
14620 74 72 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  trcmp(pExpr->u.z
14630 54 6f 6b 65 6e 2c 20 70 50 61 72 73 65 2d 3e 61  Token, pParse->a
14640 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  zVar[pExpr->iCol
14650 75 6d 6e 2d 31 5d 29 3d 3d 30 20 29 3b 0a 20 20  umn-1])==0 );.  
14660 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14670 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
14680 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70   pParse->azVar[p
14690 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d  Expr->iColumn-1]
146a0 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
146b0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
146c0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
146d0 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b  e TK_REGISTER: {
146e0 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70  .      inReg = p
146f0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
14700 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14710 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a  .    case TK_AS:
14720 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   {.      inReg =
14730 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
14740 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
14750 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
14760 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
14770 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
14780 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
14790 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  T.    case TK_CA
147a0 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  ST: {.      /* E
147b0 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
147c0 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70  e form:   CAST(p
147d0 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a  Left AS token) *
147e0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 2c  /.      int aff,
147f0 20 74 6f 5f 6f 70 3b 0a 20 20 20 20 20 20 69 6e   to_op;.      in
14800 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
14810 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
14820 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
14830 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
14840 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
14850 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
14860 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
14870 0a 20 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c  .      aff = sql
14880 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
14890 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
148a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 74 6f 5f 6f  , 0);.      to_o
148b0 70 20 3d 20 61 66 66 20 2d 20 53 51 4c 49 54 45  p = aff - SQLITE
148c0 5f 41 46 46 5f 54 45 58 54 20 2b 20 4f 50 5f 54  _AFF_TEXT + OP_T
148d0 6f 54 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73  oText;.      ass
148e0 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ert( to_op==OP_T
148f0 6f 54 65 78 74 20 20 20 20 7c 7c 20 61 66 66 21  oText    || aff!
14900 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
14910 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
14920 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ert( to_op==OP_T
14930 6f 42 6c 6f 62 20 20 20 20 7c 7c 20 61 66 66 21  oBlob    || aff!
14940 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
14950 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
14960 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ert( to_op==OP_T
14970 6f 4e 75 6d 65 72 69 63 20 7c 7c 20 61 66 66 21  oNumeric || aff!
14980 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
14990 52 49 43 20 29 3b 0a 20 20 20 20 20 20 61 73 73  RIC );.      ass
149a0 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ert( to_op==OP_T
149b0 6f 49 6e 74 20 20 20 20 20 7c 7c 20 61 66 66 21  oInt     || aff!
149c0 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45  =SQLITE_AFF_INTE
149d0 47 45 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73  GER );.      ass
149e0 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ert( to_op==OP_T
149f0 6f 52 65 61 6c 20 20 20 20 7c 7c 20 61 66 66 21  oReal    || aff!
14a00 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
14a10 20 20 20 20 29 3b 0a 20 20 20 20 20 20 74 65 73      );.      tes
14a20 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50  tcase( to_op==OP
14a30 5f 54 6f 54 65 78 74 20 29 3b 0a 20 20 20 20 20  _ToText );.     
14a40 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70   testcase( to_op
14a50 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 29 3b 0a 20  ==OP_ToBlob );. 
14a60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74       testcase( t
14a70 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72  o_op==OP_ToNumer
14a80 69 63 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ic );.      test
14a90 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  case( to_op==OP_
14aa0 54 6f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 74  ToInt );.      t
14ab0 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d  estcase( to_op==
14ac0 4f 50 5f 54 6f 52 65 61 6c 20 29 3b 0a 20 20 20  OP_ToReal );.   
14ad0 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61     if( inReg!=ta
14ae0 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  rget ){.        
14af0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14b00 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69  2(v, OP_SCopy, i
14b10 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20  nReg, target);. 
14b20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74         inReg = t
14b30 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20  arget;.      }. 
14b40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14b50 41 64 64 4f 70 31 28 76 2c 20 74 6f 5f 6f 70 2c  AddOp1(v, to_op,
14b60 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 74   inReg);.      t
14b70 65 73 74 63 61 73 65 28 20 75 73 65 64 41 73 43  estcase( usedAsC
14b80 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73  olumnCache(pPars
14b90 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29  e, inReg, inReg)
14ba0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
14bb0 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
14bc0 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
14bd0 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20 20   inReg, 1);.    
14be0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
14bf0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
14c00 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20  OMIT_CAST */.   
14c10 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
14c20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
14c30 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
14c40 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
14c50 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
14c60 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
14c70 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
14c80 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20  LT==OP_Lt );.   
14c90 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45     assert( TK_LE
14ca0 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20  ==OP_Le );.     
14cb0 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d   assert( TK_GT==
14cc0 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61  OP_Gt );.      a
14cd0 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50  ssert( TK_GE==OP
14ce0 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Ge );.      ass
14cf0 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45  ert( TK_EQ==OP_E
14d00 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  q );.      asser
14d10 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20  t( TK_NE==OP_Ne 
14d20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14d30 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a  e( op==TK_LT );.
14d40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14d50 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20  op==TK_LE );.   
14d60 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14d70 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20  =TK_GT );.      
14d80 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
14d90 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GE );.      tes
14da0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51  tcase( op==TK_EQ
14db0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14dc0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b  se( op==TK_NE );
14dd0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
14de0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
14df0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
14e00 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
14e10 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
14e20 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
14e30 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
14e40 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
14e50 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  2);.      codeCo
14e60 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
14e70 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
14e80 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
14e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ea0 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20   r1, r2, inReg, 
14eb0 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b  SQLITE_STOREP2);
14ec0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14ed0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
14ee0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14ef0 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
14f00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14f10 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
14f20 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  :.    case TK_IS
14f30 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
14f40 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
14f50 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14f60 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  se( op==TK_ISNOT
14f70 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
14f80 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
14f90 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
14fa0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
14fb0 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
14fc0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
14fd0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
14fe0 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
14ff0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20  ree2);.      op 
15000 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20  = (op==TK_IS) ? 
15010 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20  TK_EQ : TK_NE;. 
15020 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
15030 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
15040 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
15050 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
15060 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
15070 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54  r2, inReg, SQLIT
15080 45 5f 53 54 4f 52 45 50 32 20 7c 20 53 51 4c 49  E_STOREP2 | SQLI
15090 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
150a0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
150b0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
150c0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
150d0 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
150e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
150f0 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20   case TK_AND:.  
15100 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20    case TK_OR:.  
15110 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a    case TK_PLUS:.
15120 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52      case TK_STAR
15130 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49  :.    case TK_MI
15140 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NUS:.    case TK
15150 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54  _REM:.    case T
15160 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61  K_BITAND:.    ca
15170 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20  se TK_BITOR:.   
15180 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a   case TK_SLASH:.
15190 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
151a0 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  FT:.    case TK_
151b0 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73  RSHIFT: .    cas
151c0 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20  e TK_CONCAT: {. 
151d0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
151e0 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20  AND==OP_And );. 
151f0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
15200 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20 20  OR==OP_Or );.   
15210 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c     assert( TK_PL
15220 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20 20  US==OP_Add );.  
15230 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d      assert( TK_M
15240 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63  INUS==OP_Subtrac
15250 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
15260 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65  t( TK_REM==OP_Re
15270 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20 20 20 20  mainder );.     
15280 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41   assert( TK_BITA
15290 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b  ND==OP_BitAnd );
152a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
152b0 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f  K_BITOR==OP_BitO
152c0 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
152d0 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f  t( TK_SLASH==OP_
152e0 44 69 76 69 64 65 20 29 3b 0a 20 20 20 20 20 20  Divide );.      
152f0 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46  assert( TK_LSHIF
15300 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20  T==OP_ShiftLeft 
15310 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15320 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_RSHIFT==OP_S
15330 68 69 66 74 52 69 67 68 74 20 29 3b 0a 20 20 20  hiftRight );.   
15340 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f     assert( TK_CO
15350 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20  NCAT==OP_Concat 
15360 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
15370 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b  e( op==TK_AND );
15380 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15390 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20   op==TK_OR );.  
153a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
153b0 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20  ==TK_PLUS );.   
153c0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
153d0 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20  =TK_MINUS );.   
153e0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
153f0 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20  =TK_REM );.     
15400 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
15410 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20  K_BITAND );.    
15420 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
15430 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20  TK_BITOR );.    
15440 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
15450 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20  TK_SLASH );.    
15460 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
15470 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20  TK_LSHIFT );.   
15480 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
15490 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20  =TK_RSHIFT );.  
154a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
154b0 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20  ==TK_CONCAT );. 
154c0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
154d0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
154e0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
154f0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
15500 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
15510 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
15520 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
15530 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
15540 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
15550 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
15560 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29   r2, r1, target)
15570 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
15580 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
15590 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
155a0 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
155b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
155c0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
155d0 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45  MINUS: {.      E
155e0 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
155f0 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
15600 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
15610 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
15620 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  t->op==TK_INTEGE
15630 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  R ){.        cod
15640 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c  eInteger(pParse,
15650 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65   pLeft, 1, targe
15660 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t);.#ifndef SQLI
15670 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
15680 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c  _POINT.      }el
15690 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70  se if( pLeft->op
156a0 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20  ==TK_FLOAT ){.  
156b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
156c0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
156d0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
156e0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  e) );.        co
156f0 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d  deReal(v, pLeft-
15700 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61  >u.zToken, 1, ta
15710 72 67 65 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rget);.#endif.  
15720 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15730 20 20 20 72 65 67 46 72 65 65 31 20 3d 20 72 31     regFree1 = r1
15740 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
15750 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
15760 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15770 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
15780 74 65 67 65 72 2c 20 30 2c 20 72 31 29 3b 0a 20  teger, 0, r1);. 
15790 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69         r2 = sqli
157a0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
157b0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
157c0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 32 29  Left, &regFree2)
157d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
157e0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
157f0 50 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c 20  P_Subtract, r2, 
15800 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  r1, target);.   
15810 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
15820 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
15830 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65      }.      inRe
15840 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20  g = target;.    
15850 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
15860 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f     case TK_BITNO
15870 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  T:.    case TK_N
15880 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  OT: {.      asse
15890 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f  rt( TK_BITNOT==O
158a0 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20 20 20 20  P_BitNot );.    
158b0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
158c0 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20 20 20  ==OP_Not );.    
158d0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
158e0 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20  TK_BITNOT );.   
158f0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
15900 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20  =TK_NOT );.     
15910 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
15920 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
15930 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
15940 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
15950 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
15960 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
15970 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
15980 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15990 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
159a0 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20  r1, inReg);.    
159b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
159c0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
159d0 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
159e0 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
159f0 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
15a00 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c  assert( TK_ISNUL
15a10 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a  L==OP_IsNull );.
15a20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
15a30 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74  _NOTNULL==OP_Not
15a40 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 74 65  Null );.      te
15a50 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
15a60 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74  SNULL );.      t
15a70 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
15a80 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  NOTNULL );.     
15a90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15aa0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
15ab0 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
15ac0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
15ad0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
15ae0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
15af0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
15b00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
15b10 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
15b20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
15b30 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
15b40 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  op, r1);.      s
15b50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15b60 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74  (v, OP_AddImm, t
15b70 61 72 67 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20  arget, -1);.    
15b80 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
15b90 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
15ba0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15bb0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
15bc0 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
15bd0 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49       AggInfo *pI
15be0 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
15bf0 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28  gInfo;.      if(
15c00 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20   pInfo==0 ){.   
15c10 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
15c20 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
15c30 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
15c40 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) );.        sql
15c50 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
15c60 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20  rse, "misuse of 
15c70 61 67 67 72 65 67 61 74 65 3a 20 25 73 28 29 22  aggregate: %s()"
15c80 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
15c90 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
15ca0 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
15cb0 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45   pInfo->aFunc[pE
15cc0 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b  xpr->iAgg].iMem;
15cd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
15ce0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
15cf0 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55  case TK_CONST_FU
15d00 4e 43 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NC:.    case TK_
15d10 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
15d20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72    ExprList *pFar
15d30 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  g;       /* List
15d40 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
15d50 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  uments */.      
15d60 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20 20  int nFarg;      
15d70 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
15d80 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
15d90 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  uments */.      
15da0 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20  FuncDef *pDef;  
15db0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75         /* The fu
15dc0 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f  nction definitio
15dd0 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  n object */.    
15de0 20 20 69 6e 74 20 6e 49 64 3b 20 20 20 20 20 20    int nId;      
15df0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
15e00 74 68 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  th of the functi
15e10 6f 6e 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73  on name in bytes
15e20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
15e30 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20  char *zId;      
15e40 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e   /* The function
15e50 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 69   name */.      i
15e60 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30  nt constMask = 0
15e70 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66  ;     /* Mask of
15e80 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
15e90 6e 74 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e  nts that are con
15ea0 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69  stant */.      i
15eb0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
15ec0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
15ed0 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 75  unter */.      u
15ee0 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  8 enc = ENC(db);
15ef0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78        /* The tex
15f00 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20  t encoding used 
15f10 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65  by this database
15f20 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   */.      CollSe
15f30 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20  q *pColl = 0;   
15f40 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20   /* A collating 
15f50 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20  sequence */..   
15f60 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
15f70 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
15f80 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
15f90 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
15fa0 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 53 54  se( op==TK_CONST
15fb0 5f 46 55 4e 43 20 29 3b 0a 20 20 20 20 20 20 74  _FUNC );.      t
15fc0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
15fd0 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
15fe0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
15ff0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
16000 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
16010 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b        pFarg = 0;
16020 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16030 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 70 45        pFarg = pE
16040 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
16050 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61 72      }.      nFar
16060 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61 72  g = pFarg ? pFar
16070 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  g->nExpr : 0;.  
16080 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
16090 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
160a0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
160b0 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20   );.      zId = 
160c0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
160d0 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 73 71 6c  .      nId = sql
160e0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 64  ite3Strlen30(zId
160f0 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20  );.      pDef = 
16100 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
16110 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 49 64  ion(db, zId, nId
16120 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29  , nFarg, enc, 0)
16130 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  ;.      if( pDef
16140 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
16150 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
16160 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20  Parse, "unknown 
16170 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 28 29  function: %.*s()
16180 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20  ", nId, zId);.  
16190 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
161a0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41     }..      /* A
161b0 74 74 65 6d 70 74 20 61 20 64 69 72 65 63 74 20  ttempt a direct 
161c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
161d0 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 43  f the built-in C
161e0 4f 41 4c 45 53 43 45 28 29 20 61 6e 64 0a 20 20  OALESCE() and.  
161f0 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20      ** IFNULL() 
16200 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73  functions.  This
16210 20 61 76 6f 69 64 73 20 75 6e 6e 65 63 65 73 73   avoids unnecess
16220 61 72 79 20 65 76 61 6c 61 74 69 6f 6e 20 6f 66  ary evalation of
16230 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 75 6d 65  .      ** argume
16240 6e 74 73 20 70 61 73 74 20 74 68 65 20 66 69 72  nts past the fir
16250 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75  st non-NULL argu
16260 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ment..      */. 
16270 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
16280 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
16290 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20  E_FUNC_COALESCE 
162a0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65  ){.        int e
162b0 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c  ndCoalesce = sql
162c0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
162d0 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 61 73  l(v);.        as
162e0 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 32 20 29  sert( nFarg>=2 )
162f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
16300 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
16310 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  , pFarg->a[0].pE
16320 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
16330 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
16340 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  <nFarg; i++){.  
16350 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16360 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16370 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c  NotNull, target,
16380 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20   endCoalesce);. 
16390 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
163a0 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
163b0 70 50 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20  pParse, target, 
163c0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  1);.          sq
163d0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
163e0 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
163f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16400 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46  rCode(pParse, pF
16410 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  arg->a[i].pExpr,
16420 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
16430 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
16440 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20  achePop(pParse, 
16450 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
16460 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16470 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
16480 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20   endCoalesce);. 
16490 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
164a0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
164b0 54 68 65 20 55 4e 4c 49 4b 45 4c 59 28 29 20 66  The UNLIKELY() f
164c0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
164d0 6f 70 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  op.  The result 
164e0 69 73 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20  is the value.   
164f0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72     ** of the fir
16500 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20  st argument..   
16510 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
16520 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
16530 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e  & SQLITE_FUNC_UN
16540 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20 20  LIKELY ){.      
16550 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e    assert( nFarg>
16560 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =1 );.        sq
16570 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
16580 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30  arse, pFarg->a[0
16590 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
165a0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
165b0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
165c0 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20  if( pFarg ){.   
165d0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
165e0 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
165f0 61 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 0a 20  arse, nFarg);.. 
16600 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65         /* For le
16610 6e 67 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f  ngth() and typeo
16620 66 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 77 69  f() functions wi
16630 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75  th a column argu
16640 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a  ment,.        **
16650 20 73 65 74 20 74 68 65 20 50 35 20 70 61 72 61   set the P5 para
16660 6d 65 74 65 72 20 74 6f 20 74 68 65 20 4f 50 5f  meter to the OP_
16670 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f  Column opcode to
16680 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52   OPFLAG_LENGTHAR
16690 47 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20  G.        ** or 
166a0 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
166b0 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 74   respectively, t
166c0 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73  o avoid unnecess
166d0 61 72 79 20 64 61 74 61 0a 20 20 20 20 20 20 20  ary data.       
166e0 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20   ** loading..   
166f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
16700 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46  if( (pDef->funcF
16710 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46  lags & (SQLITE_F
16720 55 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54  UNC_LENGTH|SQLIT
16730 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 29 21  E_FUNC_TYPEOF))!
16740 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
16750 75 38 20 65 78 70 72 4f 70 3b 0a 20 20 20 20 20  u8 exprOp;.     
16760 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61       assert( nFa
16770 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  rg==1 );.       
16780 20 20 20 61 73 73 65 72 74 28 20 70 46 61 72 67     assert( pFarg
16790 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20  ->a[0].pExpr!=0 
167a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70  );.          exp
167b0 72 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30  rOp = pFarg->a[0
167c0 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20  ].pExpr->op;.   
167d0 20 20 20 20 20 20 20 69 66 28 20 65 78 70 72 4f         if( exprO
167e0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p==TK_COLUMN || 
167f0 65 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43  exprOp==TK_AGG_C
16800 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
16810 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c       assert( SQL
16820 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d  ITE_FUNC_LENGTH=
16830 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52  =OPFLAG_LENGTHAR
16840 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  G );.           
16850 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
16860 46 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46  FUNC_TYPEOF==OPF
16870 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 29 3b  LAG_TYPEOFARG );
16880 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
16890 74 63 61 73 65 28 20 28 70 44 65 66 2d 3e 66 75  tcase( (pDef->fu
168a0 6e 63 46 6c 61 67 73 26 7e 53 51 4c 49 54 45 5f  ncFlags&~SQLITE_
168b0 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 0a 20 20  FUNC_ENCMASK).  
168c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168d0 20 20 20 20 20 3d 3d 53 51 4c 49 54 45 5f 46 55       ==SQLITE_FU
168e0 4e 43 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 20  NC_LENGTH );.   
168f0 20 20 20 20 20 20 20 20 20 70 46 61 72 67 2d 3e           pFarg->
16900 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20  a[0].pExpr->op2 
16910 3d 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  = pDef->funcFlag
16920 73 26 7e 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45  s&~SQLITE_FUNC_E
16930 4e 43 4d 41 53 4b 3b 0a 20 20 20 20 20 20 20 20  NCMASK;.        
16940 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20    }.        }.. 
16950 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
16960 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
16970 73 65 29 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b  se);     /* Tick
16980 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65 20  et 2ea2425d34be 
16990 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
169a0 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
169b0 73 74 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  st(pParse, pFarg
169c0 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r1, 1);.      
169d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
169e0 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
169f0 3b 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65  ;   /* Ticket 2e
16a00 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20  a2425d34be */.  
16a10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16a20 20 20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20     r1 = 0;.     
16a30 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
16a40 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
16a50 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73  BLE.      /* Pos
16a60 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74  sibly overload t
16a70 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74  he function if t
16a80 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
16a90 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  t is.      ** a 
16aa0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f  virtual table co
16ab0 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  lumn..      **. 
16ac0 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69       ** For infi
16ad0 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b  x functions (LIK
16ae0 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c  E, GLOB, REGEXP,
16af0 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20   and MATCH) use 
16b00 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63  the.      ** sec
16b10 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f  ond argument, no
16b20 74 20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20  t the first, as 
16b30 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
16b40 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a  test to.      **
16b50 20 73 65 65 20 69 66 20 69 74 20 69 73 20 61 20   see if it is a 
16b60 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74  column in a virt
16b70 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ual table.  This
16b80 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65   is done because
16b90 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65  .      ** the le
16ba0 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e  ft operand of in
16bb0 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74  fix functions (t
16bc0 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61  he operand we wa
16bd0 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63  nt to.      ** c
16be0 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69  ontrol overloadi
16bf0 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73 20 74  ng) ends up as t
16c00 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
16c10 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  nt to the.      
16c20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  ** function.  Th
16c30 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20  e expression "A 
16c40 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69 76  glob B" is equiv
16c50 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20  alent to .      
16c60 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20  ** "glob(B,A).  
16c70 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74  We want to use t
16c80 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20  he A in "A glob 
16c90 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20  B" to test.     
16ca0 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e   ** for function
16cb0 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42   overloading.  B
16cc0 75 74 20 77 65 20 75 73 65 20 74 68 65 20 42 20  ut we use the B 
16cd0 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c  term in "glob(B,
16ce0 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  A)"..      */.  
16cf0 20 20 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32      if( nFarg>=2
16d00 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67   && (pExpr->flag
16d10 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63  s & EP_InfixFunc
16d20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  ) ){.        pDe
16d30 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
16d40 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
16d50 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c  db, pDef, nFarg,
16d60 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78   pFarg->a[1].pEx
16d70 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  pr);.      }else
16d80 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a   if( nFarg>0 ){.
16d90 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
16da0 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f  qlite3VtabOverlo
16db0 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  adFunction(db, p
16dc0 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72  Def, nFarg, pFar
16dd0 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  g->a[0].pExpr);.
16de0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
16df0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
16e00 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFarg; i++){.   
16e10 20 20 20 20 20 69 66 28 20 69 3c 33 32 20 26 26       if( i<32 &&
16e20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
16e30 6e 73 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b  nstant(pFarg->a[
16e40 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
16e50 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b         constMask
16e60 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20   |= (1<<i);.    
16e70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
16e80 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  ( (pDef->funcFla
16e90 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
16ea0 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26  _NEEDCOLL)!=0 &&
16eb0 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
16ec0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
16ed0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
16ee0 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
16ef0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
16f00 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
16f10 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
16f20 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
16f30 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
16f40 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  {.        if( !p
16f50 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
16f60 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20  b->pDfltColl; . 
16f70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16f80 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
16f90 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c  ollSeq, 0, 0, 0,
16fa0 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
16fb0 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
16fc0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
16fd0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
16fe0 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e  OP_Function, con
16ff0 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72 67  stMask, r1, targ
17000 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  et,.            
17010 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
17020 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43  r*)pDef, P4_FUNC
17030 44 45 46 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  DEF);.      sqli
17040 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
17050 76 2c 20 28 75 38 29 6e 46 61 72 67 29 3b 0a 20  v, (u8)nFarg);. 
17060 20 20 20 20 20 69 66 28 20 6e 46 61 72 67 20 29       if( nFarg )
17070 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
17080 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
17090 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 46  e(pParse, r1, nF
170a0 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  arg);.      }.  
170b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
170c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
170d0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
170e0 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
170f0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  :.    case TK_SE
17100 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  LECT: {.      te
17110 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45  stcase( op==TK_E
17120 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74  XISTS );.      t
17130 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
17140 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20  SELECT );.      
17150 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 43  inReg = sqlite3C
17160 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
17170 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30  rse, pExpr, 0, 0
17180 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
17190 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
171a0 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
171b0 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20  t destIfFalse = 
171c0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
171d0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
171e0 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20  nt destIfNull = 
171f0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
17200 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73  abel(v);.      s
17210 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17220 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
17230 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
17240 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
17250 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
17260 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73  destIfFalse, des
17270 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
17280 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17290 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
172a0 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
172b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
172c0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
172d0 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
172e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
172f0 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
17300 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20  , target, 0);.  
17310 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
17320 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
17330 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
17340 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
17350 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
17360 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
17370 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ...    /*.    **
17380 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20      x BETWEEN y 
17390 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20  AND z.    **.   
173a0 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69   ** This is equi
173b0 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a  valent to.    **
173c0 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20  .    **    x>=y 
173d0 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a  AND x<=z.    **.
173e0 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72      ** X is stor
173f0 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65  ed in pExpr->pLe
17400 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20  ft..    ** Y is 
17410 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
17420 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
17430 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20  pr..    ** Z is 
17440 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
17450 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  >pList->a[1].pEx
17460 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  pr..    */.    c
17470 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
17480 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  {.      Expr *pL
17490 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
174a0 66 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  ft;.      struct
174b0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
174c0 70 4c 49 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e  pLItem = pExpr->
174d0 78 2e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  x.pList->a;.    
174e0 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
174f0 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a   pLItem->pExpr;.
17500 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
17510 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
17520 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26  pParse, pLeft, &
17530 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
17540 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
17550 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
17560 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  , pRight, &regFr
17570 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee2);.      test
17580 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
17590 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
175a0 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
175b0 20 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 73   );.      r3 = s
175c0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
175d0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
175e0 72 34 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r4 = sqlite3GetT
175f0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
17600 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
17610 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
17620 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 0a   pRight, OP_Ge,.
17630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17640 20 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 53 51    r1, r2, r3, SQ
17650 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20  LITE_STOREP2);. 
17660 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20       pLItem++;. 
17670 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c       pRight = pL
17680 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
17690 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
176a0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
176b0 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20   regFree2);.    
176c0 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
176d0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
176e0 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67 46  e, pRight, &regF
176f0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73  ree2);.      tes
17700 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
17710 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  =0 );.      code
17720 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
17730 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
17740 50 5f 4c 65 2c 20 72 31 2c 20 72 32 2c 20 72 34  P_Le, r1, r2, r4
17750 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  , SQLITE_STOREP2
17760 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17770 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
17780 5f 41 6e 64 2c 20 72 33 2c 20 72 34 2c 20 74 61  _And, r3, r4, ta
17790 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
177a0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
177b0 65 67 28 70 50 61 72 73 65 2c 20 72 33 29 3b 0a  eg(pParse, r3);.
177c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
177d0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
177e0 73 65 2c 20 72 34 29 3b 0a 20 20 20 20 20 20 62  se, r4);.      b
177f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
17800 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a  case TK_COLLATE:
17810 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50   .    case TK_UP
17820 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52  LUS: {.      inR
17830 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
17840 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
17850 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
17860 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
17870 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
17880 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45    case TK_TRIGGE
17890 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  R: {.      /* If
178a0 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54   the opcode is T
178b0 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20  K_TRIGGER, then 
178c0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
178d0 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20  s a reference.  
178e0 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75      ** to a colu
178f0 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20  mn in the new.* 
17900 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  or old.* pseudo-
17910 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65  tables available
17920 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69   to.      ** tri
17930 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49  gger programs. I
17940 6e 20 74 68 69 73 20 63 61 73 65 20 45 78 70 72  n this case Expr
17950 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74  .iTable is set t
17960 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20  o 1 for the.    
17970 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64    ** new.* pseud
17980 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f  o-table, or 0 fo
17990 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75  r the old.* pseu
179a0 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69  do-table. Expr.i
179b0 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20  Column.      ** 
179c0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  is set to the co
179d0 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75  lumn of the pseu
179e0 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64  do-table to read
179f0 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20  , or to -1 to.  
17a00 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20      ** read the 
17a10 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20  rowid field..   
17a20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
17a30 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
17a40 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69   implemented usi
17a50 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f  ng an OP_Param o
17a60 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20  pcode. The p1.  
17a70 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72      ** parameter
17a80 20 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72   is set to 0 for
17a90 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65   an old.rowid re
17aa0 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28  ference, or to (
17ab0 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f  i+1).      ** to
17ac0 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68   reference anoth
17ad0 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  er column of the
17ae0 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61   old.* pseudo-ta
17af0 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20  ble, where .    
17b00 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e    ** i is the in
17b10 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
17b20 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77  n. For a new.row
17b30 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31  id reference, p1
17b40 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74   is.      ** set
17b50 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65   to (n+1), where
17b60 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   n is the number
17b70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65   of columns in e
17b80 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  ach pseudo-table
17b90 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  ..      ** For a
17ba0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e   reference to an
17bb0 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69  y other column i
17bc0 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75  n the new.* pseu
17bd0 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20  do-table, p1.   
17be0 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20     ** is set to 
17bf0 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e  (n+2+i), where n
17c00 20 61 6e 64 20 69 20 61 72 65 20 61 73 20 64 65   and i are as de
17c10 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79  fined previously
17c20 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65  . For.      ** e
17c30 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74  xample, if the t
17c40 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72  able on which tr
17c50 69 67 67 65 72 73 20 61 72 65 20 62 65 69 6e 67  iggers are being
17c60 20 66 69 72 65 64 20 69 73 0a 20 20 20 20 20 20   fired is.      
17c70 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a  ** declared as:.
17c80 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
17c90 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
17ca0 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
17cb0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
17cc0 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70 72 65  n p1 is interpre
17cd0 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
17ce0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
17cf0 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20  *   p1==0   ->  
17d00 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20    old.rowid     
17d10 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65  p1==3   ->    ne
17d20 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a  w.rowid.      **
17d30 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20     p1==1   ->   
17d40 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70   old.a         p
17d50 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==4   ->    new
17d60 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31  .a.      **   p1
17d70 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e  ==2   ->    old.
17d80 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20  b         p1==5 
17d90 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20    ->    new.b   
17da0 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20      .      */.  
17db0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
17dc0 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20  = pExpr->pTab;. 
17dd0 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45       int p1 = pE
17de0 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70  xpr->iTable * (p
17df0 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31  Tab->nCol+1) + 1
17e00 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   + pExpr->iColum
17e10 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  n;..      assert
17e20 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
17e30 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61  =0 || pExpr->iTa
17e40 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ble==1 );.      
17e50 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69  assert( pExpr->i
17e60 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45  Column>=-1 && pE
17e70 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61  xpr->iColumn<pTa
17e80 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  b->nCol );.     
17e90 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69   assert( pTab->i
17ea0 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d  PKey<0 || pExpr-
17eb0 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e  >iColumn!=pTab->
17ec0 69 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61  iPKey );.      a
17ed0 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20  ssert( p1>=0 && 
17ee0 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32  p1<(pTab->nCol*2
17ef0 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71  +2) );..      sq
17f00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17f10 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c  v, OP_Param, p1,
17f20 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
17f30 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
17f40 22 25 73 2e 25 73 20 2d 3e 20 24 25 64 22 2c 0a  "%s.%s -> $%d",.
17f50 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e          (pExpr->
17f60 69 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a  iTable ? "new" :
17f70 20 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20 20   "old"),.       
17f80 20 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e   (pExpr->iColumn
17f90 3c 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70  <0 ? "rowid" : p
17fa0 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  Expr->pTab->aCol
17fb0 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
17fc0 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20  .zName),.       
17fd0 20 74 61 72 67 65 74 0a 20 20 20 20 20 20 29 29   target.      ))
17fe0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
17ff0 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
18000 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49  POINT.      /* I
18010 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73  f the column has
18020 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c 20   REAL affinity, 
18030 69 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79  it may currently
18040 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 6e   be stored as an
18050 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  .      ** intege
18060 72 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41 66  r. Use OP_RealAf
18070 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 73  finity to make s
18080 75 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c 79  ure it is really
18090 20 72 65 61 6c 2e 20 20 2a 2f 0a 20 20 20 20 20   real.  */.     
180a0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
180b0 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20 26  umn>=0 .       &
180c0 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78  & pTab->aCol[pEx
180d0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66  pr->iColumn].aff
180e0 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
180f0 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a  F_REAL.      ){.
18100 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18110 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
18120 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74 61  RealAffinity, ta
18130 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  rget);.      }.#
18140 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61  endif.      brea
18150 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f  k;.    }...    /
18160 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a  *.    ** Form A:
18170 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78  .    **   CASE x
18180 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31   WHEN e1 THEN r1
18190 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32   WHEN e2 THEN r2
181a0 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45   ... WHEN eN THE
181b0 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a  N rN ELSE y END.
181c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
181d0 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43  rm B:.    **   C
181e0 41 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e  ASE WHEN e1 THEN
181f0 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e   r1 WHEN e2 THEN
18200 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20   r2 ... WHEN eN 
18210 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45  THEN rN ELSE y E
18220 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ND.    **.    **
18230 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62   Form A is can b
18240 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  e transformed in
18250 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  to the equivalen
18260 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c  t form B as foll
18270 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  ows:.    **   CA
18280 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45  SE WHEN x=e1 THE
18290 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54  N r1 WHEN x=e2 T
182a0 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a  HEN r2 ....    *
182b0 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d  *        WHEN x=
182c0 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
182d0 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
182e0 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69   ** X (if it exi
182f0 73 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72  sts) is in pExpr
18300 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20  ->pLeft..    ** 
18310 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73 74  Y is in the last
18320 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78 70   element of pExp
18330 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70 45  r->x.pList if pE
18340 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
18350 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64  xpr is.    ** od
18360 64 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c 73  d.  The Y is als
18370 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20  o optional.  If 
18380 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
18390 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73  ements in x.pLis
183a0 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65 6e  t.    ** is even
183b0 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69 74  , then Y is omit
183c0 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74 68  ted and the "oth
183d0 65 72 77 69 73 65 22 20 72 65 73 75 6c 74 20 69  erwise" result i
183e0 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45  s NULL..    ** E
183f0 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70  i is in pExpr->p
18400 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64  List->a[i*2] and
18410 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c   Ri is pExpr->pL
18420 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20  ist->a[i*2+1].. 
18430 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
18440 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65   result of the e
18450 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65  xpression is the
18460 20 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73   Ri for the firs
18470 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20  t matching Ei,. 
18480 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72     ** or if ther
18490 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67  e is no matching
184a0 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65   Ei, the ELSE te
184b0 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72  rm Y, or if ther
184c0 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45  e is.    ** no E
184d0 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a  LSE term, NULL..
184e0 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
184f0 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  lt: assert( op==
18500 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20  TK_CASE ); {.   
18510 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b     int endLabel;
18520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18530 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
18540 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41  el for end of CA
18550 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20  SE stmt */.     
18560 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20   int nextCase;  
18570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18580 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c     /* GOTO label
18590 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63   for next WHEN c
185a0 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  lause */.      i
185b0 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20  nt nExpr;       
185c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185d0 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66   /* 2x number of
185e0 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
185f0 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
18600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18610 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
18620 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
18630 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
18640 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18650 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45    /* List of WHE
18660 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
18670 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
18680 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d  _item *aListelem
18690 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57  ;  /* Array of W
186a0 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
186b0 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72     Expr opCompar
186c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
186d0 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45       /* The X==E
186e0 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  i expression */.
186f0 20 20 20 20 20 20 45 78 70 72 20 63 61 63 68 65        Expr cache
18700 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
18710 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65          /* Cache
18720 64 20 65 78 70 72 65 73 73 69 6f 6e 20 58 20 2a  d expression X *
18730 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  /.      Expr *pX
18740 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18760 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f   X expression */
18770 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65  .      Expr *pTe
18780 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
18790 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45           /* X==E
187a0 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75  i (form A) or ju
187b0 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a  st Ei (form B) *
187c0 2f 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59  /.      VVA_ONLY
187d0 28 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65  ( int iCacheLeve
187e0 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
187f0 68 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20  heLevel; )..    
18800 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
18810 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
18820 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
18830 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  && pExpr->x.pLis
18840 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
18850 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  t(pExpr->x.pList
18860 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20  ->nExpr > 0);.  
18870 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78      pEList = pEx
18880 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
18890 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70     aListelem = p
188a0 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  EList->a;.      
188b0 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  nExpr = pEList->
188c0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64  nExpr;.      end
188d0 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56  Label = sqlite3V
188e0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
188f0 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d  .      if( (pX =
18900 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d   pExpr->pLeft)!=
18910 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 63  0 ){.        cac
18920 68 65 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20  heX = *pX;.     
18930 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
18940 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
18950 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
18960 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 52  se( pX->op==TK_R
18970 45 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20  EGISTER );.     
18980 20 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65     exprToRegiste
18990 72 28 26 63 61 63 68 65 58 2c 20 73 71 6c 69 74  r(&cacheX, sqlit
189a0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
189b0 50 61 72 73 65 2c 20 70 58 2c 20 26 72 65 67 46  Parse, pX, &regF
189c0 72 65 65 31 29 29 3b 0a 20 20 20 20 20 20 20 20  ree1));.        
189d0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
189e0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e1==0 );.       
189f0 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20   opCompare.op = 
18a00 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f  TK_EQ;.        o
18a10 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d  pCompare.pLeft =
18a20 20 26 63 61 63 68 65 58 3b 0a 20 20 20 20 20 20   &cacheX;.      
18a30 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d    pTest = &opCom
18a40 70 61 72 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a  pare;.        /*
18a50 20 54 69 63 6b 65 74 20 62 33 35 31 64 39 35 66   Ticket b351d95f
18a60 39 63 64 35 65 66 31 37 65 39 64 39 64 62 61 65  9cd5ef17e9d9dbae
18a70 31 38 66 35 63 61 38 36 31 31 31 39 30 30 30 31  18f5ca8611190001
18a80 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  :.        ** The
18a90 20 76 61 6c 75 65 20 69 6e 20 72 65 67 46 72 65   value in regFre
18aa0 65 31 20 6d 69 67 68 74 20 67 65 74 20 53 43 6f  e1 might get SCo
18ab0 70 79 2d 65 64 20 69 6e 74 6f 20 74 68 65 20 66  py-ed into the f
18ac0 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20 20 20  ile result..    
18ad0 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73      ** So make s
18ae0 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65 67  ure that the reg
18af0 46 72 65 65 31 20 72 65 67 69 73 74 65 72 20 69  Free1 register i
18b00 73 20 6e 6f 74 20 72 65 75 73 65 64 20 66 6f 72  s not reused for
18b10 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a   other.        *
18b20 2a 20 70 75 72 70 6f 73 65 73 20 61 6e 64 20 70  * purposes and p
18b30 6f 73 73 69 62 6c 79 20 6f 76 65 72 77 72 69 74  ossibly overwrit
18b40 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ten.  */.       
18b50 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
18b60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
18b70 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 2d 31 3b  (i=0; i<nExpr-1;
18b80 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20   i=i+2){.       
18b90 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
18ba0 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
18bb0 20 20 20 20 20 20 20 69 66 28 20 70 58 20 29 7b         if( pX ){
18bc0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
18bd0 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a 20  t( pTest!=0 );. 
18be0 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61           opCompa
18bf0 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73  re.pRight = aLis
18c00 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a  telem[i].pExpr;.
18c10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
18c20 20 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d           pTest =
18c30 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
18c40 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xpr;.        }. 
18c50 20 20 20 20 20 20 20 6e 65 78 74 43 61 73 65 20         nextCase 
18c60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
18c70 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
18c80 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
18c90 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  st->op==TK_COLUM
18ca0 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  N );.        sql
18cb0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
18cc0 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e  pParse, pTest, n
18cd0 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f  extCase, SQLITE_
18ce0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
18cf0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
18d00 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45  Listelem[i+1].pE
18d10 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
18d20 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  MN );.        te
18d30 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65  stcase( aListele
18d40 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70  m[i+1].pExpr->op
18d50 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b  ==TK_REGISTER );
18d60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18d70 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
18d80 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
18d90 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
18da0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18db0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18dc0 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 4c 61 62 65  Goto, 0, endLabe
18dd0 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
18de0 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
18df0 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20  pParse, 1);.    
18e00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
18e10 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e  esolveLabel(v, n
18e20 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20  extCase);.      
18e30 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6e 45 78  }.      if( (nEx
18e40 70 72 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20  pr&1)!=0 ){.    
18e50 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
18e60 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
18e70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18e80 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
18e90 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70  , pEList->a[nExp
18ea0 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  r-1].pExpr, targ
18eb0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  et);.        sql
18ec0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
18ed0 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20  (pParse, 1);.   
18ee0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18ef0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18f00 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
18f10 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
18f20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
18f30 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
18f40 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ed || pParse->nE
18f50 72 72 3e 30 20 0a 20 20 20 20 20 20 20 20 20 20  rr>0 .          
18f60 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69 43 61 63   || pParse->iCac
18f70 68 65 4c 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c  heLevel==iCacheL
18f80 65 76 65 6c 20 29 3b 0a 20 20 20 20 20 20 73 71  evel );.      sq
18f90 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
18fa0 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65  Label(v, endLabe
18fb0 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
18fc0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
18fd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
18fe0 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  ER.    case TK_R
18ff0 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73  AISE: {.      as
19000 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66  sert( pExpr->aff
19010 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61  inity==OE_Rollba
19020 63 6b 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ck .           |
19030 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  | pExpr->affinit
19040 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20  y==OE_Abort.    
19050 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
19060 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61  >affinity==OE_Fa
19070 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  il.           ||
19080 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
19090 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20  ==OE_Ignore.    
190a0 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21    );.      if( !
190b0 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72  pParse->pTrigger
190c0 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Tab ){.        s
190d0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
190e0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
190f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52                "R
19100 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20  AISE() may only 
19110 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61  be used within a
19120 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d   trigger-program
19130 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
19140 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
19150 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61      if( pExpr->a
19160 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72  ffinity==OE_Abor
19170 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
19180 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
19190 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rse);.      }.  
191a0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
191b0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
191c0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
191d0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
191e0 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
191f0 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20  E_Ignore ){.    
19200 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19210 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20  ddOp4(.         
19220 20 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53     v, OP_Halt, S
19230 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e  QLITE_OK, OE_Ign
19240 6f 72 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75  ore, 0, pExpr->u
19250 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20  .zToken,0);.    
19260 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
19270 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73   sqlite3HaltCons
19280 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 53  traint(pParse, S
19290 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
192a0 5f 54 52 49 47 47 45 52 2c 0a 20 20 20 20 20 20  _TRIGGER,.      
192b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192c0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61          pExpr->a
192d0 66 66 69 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e  ffinity, pExpr->
192e0 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b  u.zToken, 0, 0);
192f0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
19300 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
19310 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  dif.  }.  sqlite
19320 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
19330 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
19340 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
19350 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
19360 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20  e, regFree2);.  
19370 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a  return inReg;.}.
19380 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
19390 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
193a0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61   an expression a
193b0 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
193c0 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72  ults.** into a r
193d0 65 67 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e  egister.  Return
193e0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75   the register nu
193f0 6d 62 65 72 20 77 68 65 72 65 20 74 68 65 20 72  mber where the r
19400 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74  esults.** are st
19410 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ored..**.** If t
19420 68 65 20 72 65 67 69 73 74 65 72 20 69 73 20 61  he register is a
19430 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
19440 74 65 72 20 74 68 61 74 20 63 61 6e 20 62 65 20  ter that can be 
19450 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20  deallocated,.** 
19460 74 68 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e  then write its n
19470 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67  umber into *pReg
19480 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74  .  If the result
19490 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74   register is not
194a0 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c  .** a temporary,
194b0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20   then set *pReg 
194c0 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20  to zero..*/.int 
194d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
194e0 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  emp(Parse *pPars
194f0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
19500 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e  int *pReg){.  in
19510 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
19520 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
19530 3b 0a 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c  ;.  int r2 = sql
19540 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
19550 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
19560 2c 20 72 31 29 3b 0a 20 20 69 66 28 20 72 32 3d  , r1);.  if( r2=
19570 3d 72 31 20 29 7b 0a 20 20 20 20 2a 70 52 65 67  =r1 ){.    *pReg
19580 20 3d 20 72 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = r1;.  }else{.
19590 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
195a0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
195b0 2c 20 72 31 29 3b 0a 20 20 20 20 2a 70 52 65 67  , r1);.    *pReg
195c0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
195d0 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn r2;.}../*.** 
195e0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
195f0 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65  at will evaluate
19600 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
19610 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a  r and store the.
19620 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  ** results in re
19630 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20  gister target.  
19640 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
19650 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70  guaranteed to ap
19660 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73  pear.** in regis
19670 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 69  ter target..*/.i
19680 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
19690 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  de(Parse *pParse
196a0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
196b0 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 6e  nt target){.  in
196c0 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65  t inReg;..  asse
196d0 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20  rt( target>0 && 
196e0 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e  target<=pParse->
196f0 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 70 45  nMem );.  if( pE
19700 78 70 72 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  xpr && pExpr->op
19710 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b  ==TK_REGISTER ){
19720 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19730 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
19740 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  Vdbe, OP_Copy, p
19750 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61  Expr->iTable, ta
19760 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rget);.  }else{.
19770 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
19780 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
19790 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
197a0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 61 73   target);.    as
197b0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56  sert( pParse->pV
197c0 64 62 65 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  dbe || pParse->d
197d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
197e0 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67  );.    if( inReg
197f0 21 3d 74 61 72 67 65 74 20 26 26 20 70 50 61 72  !=target && pPar
19800 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20  se->pVdbe ){.   
19810 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19820 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp2(pParse->pVd
19830 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e  be, OP_SCopy, in
19840 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  Reg, target);.  
19850 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
19860 20 74 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   target;.}../*.*
19870 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
19880 74 68 61 74 20 65 76 61 6c 75 74 65 73 20 74 68  that evalutes th
19890 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
198a0 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68 65 20  on and puts the 
198b0 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67  result.** in reg
198c0 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a  ister target..**
198d0 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20  .** Also make a 
198e0 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72  copy of the expr
198f0 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73 20 69  ession results i
19900 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63 61 63  nto another "cac
19910 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a 2a 20  he" register.** 
19920 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20 65  and modify the e
19930 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74 68 61  xpression so tha
19940 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  t the next time 
19950 69 74 20 69 73 20 65 76 61 6c 75 61 74 65 64 2c  it is evaluated,
19960 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69  .** the result i
19970 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
19980 63 61 63 68 65 20 72 65 67 69 73 74 65 72 2e 0a  cache register..
19990 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
199a0 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 65  ne is used for e
199b0 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
199c0 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69 70 6c  are used multipl
199d0 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68  e .** times.  Th
199e0 65 79 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ey are evaluated
199f0 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72 65   once and the re
19a00 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65 78 70  sults of the exp
19a10 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72  ression.** are r
19a20 65 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eused..*/.int sq
19a30 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64  lite3ExprCodeAnd
19a40 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61  Cache(Parse *pPa
19a50 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
19a60 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
19a70 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
19a80 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
19a90 69 6e 52 65 67 3b 0a 20 20 69 6e 52 65 67 20 3d  inReg;.  inReg =
19aa0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
19ab0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
19ac0 74 61 72 67 65 74 29 3b 0a 20 20 61 73 73 65 72  target);.  asser
19ad0 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20  t( target>0 );. 
19ae0 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
19af0 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74   is called for t
19b00 65 72 6d 73 20 74 6f 20 49 4e 53 45 52 54 20 6f  erms to INSERT o
19b10 72 20 55 50 44 41 54 45 2e 20 20 41 6e 64 20 74  r UPDATE.  And t
19b20 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68  he only.  ** oth
19b30 65 72 20 70 6c 61 63 65 20 77 68 65 72 65 20 65  er place where e
19b40 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62  xpressions can b
19b50 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
19b60 20 54 4b 5f 52 45 47 49 53 54 45 52 20 69 73 0a   TK_REGISTER is.
19b70 20 20 2a 2a 20 69 6e 20 57 48 45 52 45 20 63 6c    ** in WHERE cl
19b80 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
19b90 20 20 53 6f 20 61 73 20 63 75 72 72 65 6e 74 6c    So as currentl
19ba0 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2c 20 74  y implemented, t
19bb0 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6e 6f 20  here is.  ** no 
19bc0 77 61 79 20 66 6f 72 20 61 20 54 4b 5f 52 45 47  way for a TK_REG
19bd0 49 53 54 45 52 20 74 6f 20 65 78 69 73 74 20 68  ISTER to exist h
19be0 65 72 65 2e 20 20 42 75 74 20 69 74 20 73 65 65  ere.  But it see
19bf0 6d 73 20 70 72 75 64 65 6e 74 20 74 6f 0a 20 20  ms prudent to.  
19c00 2a 2a 20 6b 65 65 70 20 74 68 65 20 41 4c 57 41  ** keep the ALWA
19c10 59 53 28 29 20 69 6e 20 63 61 73 65 20 74 68 65  YS() in case the
19c20 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76   conditions abov
19c30 65 20 63 68 61 6e 67 65 20 77 69 74 68 20 66 75  e change with fu
19c40 74 75 72 65 0a 20 20 2a 2a 20 6d 6f 64 69 66 69  ture.  ** modifi
19c50 63 61 74 69 6f 6e 73 20 6f 72 20 65 6e 68 61 6e  cations or enhan
19c60 63 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66  cements. */.  if
19c70 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e  ( ALWAYS(pExpr->
19c80 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 29  op!=TK_REGISTER)
19c90 20 29 7b 20 20 0a 20 20 20 20 69 6e 74 20 69 4d   ){  .    int iM
19ca0 65 6d 3b 0a 20 20 20 20 69 4d 65 6d 20 3d 20 2b  em;.    iMem = +
19cb0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
19cc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19cd0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
19ce0 20 69 6e 52 65 67 2c 20 69 4d 65 6d 29 3b 0a 20   inReg, iMem);. 
19cf0 20 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65     exprToRegiste
19d00 72 28 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a  r(pExpr, iMem);.
19d10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e 52    }.  return inR
19d20 65 67 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  eg;.}..#if defin
19d30 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
19d40 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f  _TREE_EXPLAIN)./
19d50 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
19d60 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65  human-readable e
19d70 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 61 6e  xplanation of an
19d80 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
19d90 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
19da0 33 45 78 70 6c 61 69 6e 45 78 70 72 28 56 64 62  3ExplainExpr(Vdb
19db0 65 20 2a 70 4f 75 74 2c 20 45 78 70 72 20 2a 70  e *pOut, Expr *p
19dc0 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 6f 70 3b  Expr){.  int op;
19dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19de0 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
19df0 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
19e00 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42    const char *zB
19e10 69 6e 4f 70 20 3d 20 30 3b 20 20 20 2f 2a 20 42  inOp = 0;   /* B
19e20 69 6e 61 72 79 20 6f 70 65 72 61 74 6f 72 20 2a  inary operator *
19e30 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
19e40 7a 55 6e 69 4f 70 20 3d 20 30 3b 20 20 20 2f 2a  zUniOp = 0;   /*
19e50 20 55 6e 61 72 79 20 6f 70 65 72 61 74 6f 72 20   Unary operator 
19e60 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  */.  if( pExpr==
19e70 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b  0 ){.    op = TK
19e80 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NULL;.  }else{.
19e90 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e      op = pExpr->
19ea0 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68  op;.  }.  switch
19eb0 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
19ec0 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20   TK_AGG_COLUMN: 
19ed0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
19ee0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
19ef0 74 2c 20 22 41 47 47 7b 25 64 3a 25 64 7d 22 2c  t, "AGG{%d:%d}",
19f00 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
19f10 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70  pr->iTable, pExp
19f20 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  r->iColumn);.   
19f30 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
19f40 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
19f50 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  MN: {.      if( 
19f60 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20  pExpr->iTable<0 
19f70 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
19f80 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
19f90 77 68 65 6e 20 63 6f 64 69 6e 67 20 63 68 65 63  when coding chec
19fa0 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  k constraints */
19fb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19fc0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
19fd0 75 74 2c 20 22 43 4f 4c 55 4d 4e 28 25 64 29 22  ut, "COLUMN(%d)"
19fe0 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
19ff0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1a000 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1a010 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1a020 74 2c 20 22 7b 25 64 3a 25 64 7d 22 2c 0a 20 20  t, "{%d:%d}",.  
1a030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a040 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1a050 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72 2d  ->iTable, pExpr-
1a060 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
1a070 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
1a080 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1a090 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  K_INTEGER: {.   
1a0a0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c     if( pExpr->fl
1a0b0 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
1a0c0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
1a0d0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1a0e0 66 28 70 4f 75 74 2c 20 22 25 64 22 2c 20 70 45  f(pOut, "%d", pE
1a0f0 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b 0a  xpr->u.iValue);.
1a100 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a110 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1a120 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1a130 22 25 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  "%s", pExpr->u.z
1a140 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  Token);.      }.
1a150 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a160 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1a170 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
1a180 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54  POINT.    case T
1a190 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  K_FLOAT: {.     
1a1a0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1a1b0 72 69 6e 74 66 28 70 4f 75 74 2c 22 25 73 22 2c  rintf(pOut,"%s",
1a1c0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1a1d0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1a1e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1a1f0 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
1a200 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1a210 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1a220 75 74 2c 22 25 51 22 2c 20 70 45 78 70 72 2d 3e  ut,"%Q", pExpr->
1a230 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1a240 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1a250 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20    case TK_NULL: 
1a260 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1a270 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1a280 74 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20  t,"NULL");.     
1a290 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
1a2a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a2b0 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20  T_BLOB_LITERAL. 
1a2c0 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a     case TK_BLOB:
1a2d0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1a2e0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1a2f0 75 74 2c 22 25 73 22 2c 20 70 45 78 70 72 2d 3e  ut,"%s", pExpr->
1a300 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1a310 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
1a320 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
1a330 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20  _VARIABLE: {.   
1a340 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1a350 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 56 41  nPrintf(pOut,"VA
1a360 52 49 41 42 4c 45 28 25 73 2c 25 64 29 22 2c 0a  RIABLE(%s,%d)",.
1a370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a380 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1a390 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 45 78 70  ->u.zToken, pExp
1a3a0 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  r->iColumn);.   
1a3b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1a3c0 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49      case TK_REGI
1a3d0 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71  STER: {.      sq
1a3e0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1a3f0 74 66 28 70 4f 75 74 2c 22 52 45 47 49 53 54 45  tf(pOut,"REGISTE
1a400 52 28 25 64 29 22 2c 20 70 45 78 70 72 2d 3e 69  R(%d)", pExpr->i
1a410 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72  Table);.      br
1a420 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1a430 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20  ase TK_AS: {.   
1a440 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1a450 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70  nExpr(pOut, pExp
1a460 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
1a470 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
1a480 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a490 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20  T_CAST.    case 
1a4a0 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20  TK_CAST: {.     
1a4b0 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
1a4c0 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43  of the form:   C
1a4d0 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b  AST(pLeft AS tok
1a4e0 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  en) */.      con
1a4f0 73 74 20 63 68 61 72 20 2a 7a 41 66 66 20 3d 20  st char *zAff = 
1a500 22 75 6e 6b 22 3b 0a 20 20 20 20 20 20 73 77 69  "unk";.      swi
1a510 74 63 68 28 20 73 71 6c 69 74 65 33 41 66 66 69  tch( sqlite3Affi
1a520 6e 69 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e  nityType(pExpr->
1a530 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 20 29 7b 0a  u.zToken, 0) ){.
1a540 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
1a550 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 20 20 20  ITE_AFF_TEXT:   
1a560 20 7a 41 66 66 20 3d 20 22 54 45 58 54 22 3b 20   zAff = "TEXT"; 
1a570 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1a580 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
1a590 46 46 5f 4e 4f 4e 45 3a 20 20 20 20 7a 41 66 66  FF_NONE:    zAff
1a5a0 20 3d 20 22 4e 4f 4e 45 22 3b 20 20 20 20 20 62   = "NONE";     b
1a5b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
1a5c0 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  se SQLITE_AFF_NU
1a5d0 4d 45 52 49 43 3a 20 7a 41 66 66 20 3d 20 22 4e  MERIC: zAff = "N
1a5e0 55 4d 45 52 49 43 22 3b 20 20 62 72 65 61 6b 3b  UMERIC";  break;
1a5f0 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
1a600 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
1a610 3a 20 7a 41 66 66 20 3d 20 22 49 4e 54 45 47 45  : zAff = "INTEGE
1a620 52 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  R";  break;.    
1a630 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1a640 41 46 46 5f 52 45 41 4c 3a 20 20 20 20 7a 41 66  AFF_REAL:    zAf
1a650 66 20 3d 20 22 52 45 41 4c 22 3b 20 20 20 20 20  f = "REAL";     
1a660 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1a670 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1a680 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1a690 22 43 41 53 54 2d 25 73 28 22 2c 20 7a 41 66 66  "CAST-%s(", zAff
1a6a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a6b0 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74  ExplainExpr(pOut
1a6c0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
1a6d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1a6e0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1a6f0 2c 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72  , ")");.      br
1a700 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
1a710 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1a720 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73  _CAST */.    cas
1a730 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a 42  e TK_LT:      zB
1a740 69 6e 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20 20  inOp = "LT";    
1a750 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1a760 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 42 69   TK_LE:      zBi
1a770 6e 4f 70 20 3d 20 22 4c 45 22 3b 20 20 20 20 20  nOp = "LE";     
1a780 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1a790 54 4b 5f 47 54 3a 20 20 20 20 20 20 7a 42 69 6e  TK_GT:      zBin
1a7a0 4f 70 20 3d 20 22 47 54 22 3b 20 20 20 20 20 62  Op = "GT";     b
1a7b0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1a7c0 4b 5f 47 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f  K_GE:      zBinO
1a7d0 70 20 3d 20 22 47 45 22 3b 20 20 20 20 20 62 72  p = "GE";     br
1a7e0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1a7f0 5f 4e 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70  _NE:      zBinOp
1a800 20 3d 20 22 4e 45 22 3b 20 20 20 20 20 62 72 65   = "NE";     bre
1a810 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1a820 45 51 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20  EQ:      zBinOp 
1a830 3d 20 22 45 51 22 3b 20 20 20 20 20 62 72 65 61  = "EQ";     brea
1a840 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
1a850 53 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d  S:      zBinOp =
1a860 20 22 49 53 22 3b 20 20 20 20 20 62 72 65 61 6b   "IS";     break
1a870 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  ;.    case TK_IS
1a880 4e 4f 54 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20  NOT:   zBinOp = 
1a890 22 49 53 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b  "ISNOT";  break;
1a8a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
1a8b0 3a 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22  :     zBinOp = "
1a8c0 41 4e 44 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  AND";    break;.
1a8d0 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
1a8e0 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4f       zBinOp = "O
1a8f0 52 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  R";     break;. 
1a900 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
1a910 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 41 44      zBinOp = "AD
1a920 44 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  D";    break;.  
1a930 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 20    case TK_STAR: 
1a940 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4d 55 4c     zBinOp = "MUL
1a950 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
1a960 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20   case TK_MINUS: 
1a970 20 20 7a 42 69 6e 4f 70 20 3d 20 22 53 55 42 22    zBinOp = "SUB"
1a980 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
1a990 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20  case TK_REM:    
1a9a0 20 7a 42 69 6e 4f 70 20 3d 20 22 52 45 4d 22 3b   zBinOp = "REM";
1a9b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1a9c0 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20  ase TK_BITAND:  
1a9d0 7a 42 69 6e 4f 70 20 3d 20 22 42 49 54 41 4e 44  zBinOp = "BITAND
1a9e0 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
1a9f0 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 7a  se TK_BITOR:   z
1aa00 42 69 6e 4f 70 20 3d 20 22 42 49 54 4f 52 22 3b  BinOp = "BITOR";
1aa10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1aa20 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a 42  e TK_SLASH:   zB
1aa30 69 6e 4f 70 20 3d 20 22 44 49 56 22 3b 20 20 20  inOp = "DIV";   
1aa40 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1aa50 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 42 69   TK_LSHIFT:  zBi
1aa60 6e 4f 70 20 3d 20 22 4c 53 48 49 46 54 22 3b 20  nOp = "LSHIFT"; 
1aa70 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1aa80 54 4b 5f 52 53 48 49 46 54 3a 20 20 7a 42 69 6e  TK_RSHIFT:  zBin
1aa90 4f 70 20 3d 20 22 52 53 48 49 46 54 22 3b 20 62  Op = "RSHIFT"; b
1aaa0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1aab0 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a 42 69 6e 4f  K_CONCAT:  zBinO
1aac0 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 62 72  p = "CONCAT"; br
1aad0 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54  eak;..    case T
1aae0 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 55 6e 69 4f  K_UMINUS:  zUniO
1aaf0 70 20 3d 20 22 55 4d 49 4e 55 53 22 3b 20 62 72  p = "UMINUS"; br
1ab00 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1ab10 5f 55 50 4c 55 53 3a 20 20 20 7a 55 6e 69 4f 70  _UPLUS:   zUniOp
1ab20 20 3d 20 22 55 50 4c 55 53 22 3b 20 20 62 72 65   = "UPLUS";  bre
1ab30 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1ab40 42 49 54 4e 4f 54 3a 20 20 7a 55 6e 69 4f 70 20  BITNOT:  zUniOp 
1ab50 3d 20 22 42 49 54 4e 4f 54 22 3b 20 62 72 65 61  = "BITNOT"; brea
1ab60 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
1ab70 4f 54 3a 20 20 20 20 20 7a 55 6e 69 4f 70 20 3d  OT:     zUniOp =
1ab80 20 22 4e 4f 54 22 3b 20 20 20 20 62 72 65 61 6b   "NOT";    break
1ab90 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  ;.    case TK_IS
1aba0 4e 55 4c 4c 3a 20 20 7a 55 6e 69 4f 70 20 3d 20  NULL:  zUniOp = 
1abb0 22 49 53 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b  "ISNULL"; break;
1abc0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
1abd0 4e 55 4c 4c 3a 20 7a 55 6e 69 4f 70 20 3d 20 22  NULL: zUniOp = "
1abe0 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b  NOTNULL"; break;
1abf0 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  ..    case TK_CO
1ac00 4c 4c 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 73  LLATE: {.      s
1ac10 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1ac20 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70  r(pOut, pExpr->p
1ac30 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
1ac40 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1ac50 66 28 70 4f 75 74 2c 22 2e 43 4f 4c 4c 41 54 45  f(pOut,".COLLATE
1ac60 28 25 73 29 22 2c 70 45 78 70 72 2d 3e 75 2e 7a  (%s)",pExpr->u.z
1ac70 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
1ac80 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1ac90 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
1aca0 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  TION:.    case T
1acb0 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20  K_CONST_FUNC:.  
1acc0 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
1acd0 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  ON: {.      Expr
1ace0 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20  List *pFarg;    
1acf0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75     /* List of fu
1ad00 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
1ad10 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78   */.      if( Ex
1ad20 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1ad30 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
1ad40 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  y) ){.        pF
1ad50 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  arg = 0;.      }
1ad60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46  else{.        pF
1ad70 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  arg = pExpr->x.p
1ad80 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  List;.      }.  
1ad90 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41      if( op==TK_A
1ada0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20  GG_FUNCTION ){. 
1adb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1adc0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1add0 2c 20 22 41 47 47 5f 46 55 4e 43 54 49 4f 4e 25  , "AGG_FUNCTION%
1ade0 64 3a 25 73 28 22 2c 0a 20 20 20 20 20 20 20 20  d:%s(",.        
1adf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae00 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 2c       pExpr->op2,
1ae10 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1ae20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1ae30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1ae40 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1ae50 74 2c 20 22 46 55 4e 43 54 49 4f 4e 3a 25 73 28  t, "FUNCTION:%s(
1ae60 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  ", pExpr->u.zTok
1ae70 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  en);.      }.   
1ae80 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a     if( pFarg ){.
1ae90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1aea0 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70  xplainExprList(p
1aeb0 4f 75 74 2c 20 70 46 61 72 67 29 3b 0a 20 20 20  Out, pFarg);.   
1aec0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1aed0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1aee0 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20 20 20  pOut, ")");.    
1aef0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1af00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1af10 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
1af20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 20  case TK_EXISTS: 
1af30 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1af40 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1af50 74 2c 20 22 45 58 49 53 54 53 28 22 29 3b 0a 20  t, "EXISTS(");. 
1af60 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1af70 61 69 6e 53 65 6c 65 63 74 28 70 4f 75 74 2c 20  ainSelect(pOut, 
1af80 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1af90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1afa0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1afb0 75 74 2c 22 29 22 29 3b 0a 20 20 20 20 20 20 62  ut,")");.      b
1afc0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1afd0 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
1afe0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1aff0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1b000 74 2c 20 22 28 22 29 3b 0a 20 20 20 20 20 20 73  t, "(");.      s
1b010 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65 6c  qlite3ExplainSel
1b020 65 63 74 28 70 4f 75 74 2c 20 70 45 78 70 72 2d  ect(pOut, pExpr-
1b030 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  >x.pSelect);.   
1b040 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1b050 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 29  nPrintf(pOut, ")
1b060 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
1b070 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1b080 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 73  TK_IN: {.      s
1b090 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1b0a0 6e 74 66 28 70 4f 75 74 2c 20 22 49 4e 28 22 29  ntf(pOut, "IN(")
1b0b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1b0c0 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c  xplainExpr(pOut,
1b0d0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
1b0e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b0f0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1b100 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 69 66 28   ",");.      if(
1b110 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1b120 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1b130 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
1b140 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53   sqlite3ExplainS
1b150 65 6c 65 63 74 28 70 4f 75 74 2c 20 70 45 78 70  elect(pOut, pExp
1b160 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  r->x.pSelect);. 
1b170 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b180 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1b190 69 6e 45 78 70 72 4c 69 73 74 28 70 4f 75 74 2c  inExprList(pOut,
1b1a0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29   pExpr->x.pList)
1b1b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b1c0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1b1d0 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b  intf(pOut, ")");
1b1e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1b1f0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
1b200 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1b210 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20  RY */..    /*.  
1b220 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45    **    x BETWEE
1b230 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a  N y AND z.    **
1b240 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20  .    ** This is 
1b250 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20  equivalent to.  
1b260 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78    **.    **    x
1b270 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20  >=y AND x<=z.   
1b280 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20   **.    ** X is 
1b290 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
1b2a0 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
1b2b0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
1b2c0 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
1b2d0 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a  .pExpr..    ** Z
1b2e0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
1b2f0 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d  xpr->pList->a[1]
1b300 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20  .pExpr..    */. 
1b310 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
1b320 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  EN: {.      Expr
1b330 20 2a 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c   *pX = pExpr->pL
1b340 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  eft;.      Expr 
1b350 2a 70 59 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  *pY = pExpr->x.p
1b360 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
1b370 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 5a  ;.      Expr *pZ
1b380 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1b390 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
1b3a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1b3b0 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1b3c0 22 42 45 54 57 45 45 4e 28 22 29 3b 0a 20 20 20  "BETWEEN(");.   
1b3d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1b3e0 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 58 29 3b  nExpr(pOut, pX);
1b3f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1b400 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1b410 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 73 71  , ",");.      sq
1b420 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1b430 28 70 4f 75 74 2c 20 70 59 29 3b 0a 20 20 20 20  (pOut, pY);.    
1b440 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b450 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c 22  Printf(pOut, ","
1b460 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b470 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74  ExplainExpr(pOut
1b480 2c 20 70 5a 29 3b 0a 20 20 20 20 20 20 73 71 6c  , pZ);.      sql
1b490 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1b4a0 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20  f(pOut, ")");.  
1b4b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1b4c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49  .    case TK_TRI
1b4d0 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  GGER: {.      /*
1b4e0 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69   If the opcode i
1b4f0 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68  s TK_TRIGGER, th
1b500 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
1b510 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  n is a reference
1b520 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63  .      ** to a c
1b530 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77  olumn in the new
1b540 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75  .* or old.* pseu
1b550 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61  do-tables availa
1b560 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ble to.      ** 
1b570 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73  trigger programs
1b580 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 45  . In this case E
1b590 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65  xpr.iTable is se
1b5a0 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20  t to 1 for the. 
1b5b0 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73       ** new.* ps
1b5c0 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30  eudo-table, or 0
1b5d0 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70   for the old.* p
1b5e0 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70  seudo-table. Exp
1b5f0 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  r.iColumn.      
1b600 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
1b610 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70   column of the p
1b620 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72  seudo-table to r
1b630 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f  ead, or to -1 to
1b640 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74  .      ** read t
1b650 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a  he rowid field..
1b660 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
1b670 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1b680 6e 74 66 28 70 4f 75 74 2c 20 22 25 73 28 25 64  ntf(pOut, "%s(%d
1b690 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  )", .          p
1b6a0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22  Expr->iTable ? "
1b6b0 4e 45 57 22 20 3a 20 22 4f 4c 44 22 2c 20 70 45  NEW" : "OLD", pE
1b6c0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  xpr->iColumn);. 
1b6d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b6e0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  }.    case TK_CA
1b6f0 53 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  SE: {.      sqli
1b700 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1b710 28 70 4f 75 74 2c 20 22 43 41 53 45 28 22 29 3b  (pOut, "CASE(");
1b720 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1b730 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
1b740 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1b750 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1b760 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1b770 22 2c 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ",");.      sqli
1b780 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69  te3ExplainExprLi
1b790 73 74 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e  st(pOut, pExpr->
1b7a0 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  x.pList);.      
1b7b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
1b7c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1b7d0 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61 73  _TRIGGER.    cas
1b7e0 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20  e TK_RAISE: {.  
1b7f0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1b800 7a 54 79 70 65 20 3d 20 22 75 6e 6b 22 3b 0a 20  zType = "unk";. 
1b810 20 20 20 20 20 73 77 69 74 63 68 28 20 70 45 78       switch( pEx
1b820 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 29 7b 0a  pr->affinity ){.
1b830 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f          case OE_
1b840 52 6f 6c 6c 62 61 63 6b 3a 20 20 20 7a 54 79 70  Rollback:   zTyp
1b850 65 20 3d 20 22 72 6f 6c 6c 62 61 63 6b 22 3b 20  e = "rollback"; 
1b860 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1b870 63 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a 20 20  case OE_Abort:  
1b880 20 20 20 20 7a 54 79 70 65 20 3d 20 22 61 62 6f      zType = "abo
1b890 72 74 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  rt";     break;.
1b8a0 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f          case OE_
1b8b0 46 61 69 6c 3a 20 20 20 20 20 20 20 7a 54 79 70  Fail:       zTyp
1b8c0 65 20 3d 20 22 66 61 69 6c 22 3b 20 20 20 20 20  e = "fail";     
1b8d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1b8e0 63 61 73 65 20 4f 45 5f 49 67 6e 6f 72 65 3a 20  case OE_Ignore: 
1b8f0 20 20 20 20 7a 54 79 70 65 20 3d 20 22 69 67 6e      zType = "ign
1b900 6f 72 65 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  ore";    break;.
1b910 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1b920 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1b930 74 66 28 70 4f 75 74 2c 20 22 52 41 49 53 45 2d  tf(pOut, "RAISE-
1b940 25 73 28 25 73 29 22 2c 20 7a 54 79 70 65 2c 20  %s(%s)", zType, 
1b950 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
1b960 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1b970 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
1b980 20 20 69 66 28 20 7a 42 69 6e 4f 70 20 29 7b 0a    if( zBinOp ){.
1b990 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1b9a0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25  inPrintf(pOut,"%
1b9b0 73 28 22 2c 20 7a 42 69 6e 4f 70 29 3b 0a 20 20  s(", zBinOp);.  
1b9c0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b9d0 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72  Expr(pOut, pExpr
1b9e0 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71  ->pLeft);.    sq
1b9f0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1ba00 74 66 28 70 4f 75 74 2c 22 2c 22 29 3b 0a 20 20  tf(pOut,",");.  
1ba10 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1ba20 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72  Expr(pOut, pExpr
1ba30 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 73  ->pRight);.    s
1ba40 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1ba50 6e 74 66 28 70 4f 75 74 2c 22 29 22 29 3b 0a 20  ntf(pOut,")");. 
1ba60 20 7d 65 6c 73 65 20 69 66 28 20 7a 55 6e 69 4f   }else if( zUniO
1ba70 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
1ba80 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1ba90 75 74 2c 22 25 73 28 22 2c 20 7a 55 6e 69 4f 70  ut,"%s(", zUniOp
1baa0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1bab0 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
1bac0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1bad0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1bae0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 29 22  nPrintf(pOut,")"
1baf0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
1bb00 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
1bb10 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
1bb20 50 4c 41 49 4e 29 20 2a 2f 0a 0a 23 69 66 20 64  PLAIN) */..#if d
1bb30 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1bb40 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49  ABLE_TREE_EXPLAI
1bb50 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  N)./*.** Generat
1bb60 65 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  e a human-readab
1bb70 6c 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  le explanation o
1bb80 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
1bb90 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  list..*/.void sq
1bba0 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1bbb0 4c 69 73 74 28 56 64 62 65 20 2a 70 4f 75 74 2c  List(Vdbe *pOut,
1bbc0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1bbd0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1bbe0 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 4c  ( pList==0 || pL
1bbf0 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 7b  ist->nExpr==0 ){
1bc00 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
1bc10 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1bc20 22 28 65 6d 70 74 79 2d 6c 69 73 74 29 22 29 3b  "(empty-list)");
1bc30 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1bc40 65 6c 73 65 20 69 66 28 20 70 4c 69 73 74 2d 3e  else if( pList->
1bc50 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20  nExpr==1 ){.    
1bc60 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
1bc70 70 72 28 70 4f 75 74 2c 20 70 4c 69 73 74 2d 3e  pr(pOut, pList->
1bc80 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d  a[0].pExpr);.  }
1bc90 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
1bca0 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70 4f 75  3ExplainPush(pOu
1bcb0 74 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  t);.    for(i=0;
1bcc0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
1bcd0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
1bce0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1bcf0 66 28 70 4f 75 74 2c 20 22 69 74 65 6d 5b 25 64  f(pOut, "item[%d
1bd00 5d 20 3d 20 22 2c 20 69 29 3b 0a 20 20 20 20 20  ] = ", i);.     
1bd10 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1bd20 75 73 68 28 70 4f 75 74 29 3b 0a 20 20 20 20 20  ush(pOut);.     
1bd30 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1bd40 78 70 72 28 70 4f 75 74 2c 20 70 4c 69 73 74 2d  xpr(pOut, pList-
1bd50 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
1bd60 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1bd70 69 6e 50 6f 70 28 70 4f 75 74 29 3b 0a 20 20 20  inPop(pOut);.   
1bd80 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b     if( pList->a[
1bd90 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  i].zName ){.    
1bda0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1bdb0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1bdc0 20 41 53 20 25 73 22 2c 20 70 4c 69 73 74 2d 3e   AS %s", pList->
1bdd0 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
1bde0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1bdf0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 62 53 70 61 6e  List->a[i].bSpan
1be00 49 73 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  IsTab ){.       
1be10 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1be20 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 20 28 25  rintf(pOut, " (%
1be30 73 29 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  s)", pList->a[i]
1be40 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d  .zSpan);.      }
1be50 0a 20 20 20 20 20 20 69 66 28 20 69 3c 70 4c 69  .      if( i<pLi
1be60 73 74 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20  st->nExpr-1 ){. 
1be70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1be80 70 6c 61 69 6e 4e 4c 28 70 4f 75 74 29 3b 0a 20  plainNL(pOut);. 
1be90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1bea0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1beb0 6f 70 28 70 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a  op(pOut);.  }.}.
1bec0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1bed0 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
1bee0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
1bef0 70 45 78 70 72 20 69 73 20 61 6e 20 63 6f 6e 73  pExpr is an cons
1bf00 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
1bf10 74 68 61 74 20 69 73 20 61 70 70 72 6f 70 72 69  that is appropri
1bf20 61 74 65 0a 2a 2a 20 66 6f 72 20 66 61 63 74 6f  ate.** for facto
1bf30 72 69 6e 67 20 6f 75 74 20 6f 66 20 61 20 6c 6f  ring out of a lo
1bf40 6f 70 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65  op.  Appropriate
1bf50 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
1bf60 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e  :.**.**    *  An
1bf70 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  y expression tha
1bf80 74 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74  t evaluates to t
1bf90 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 70 63 6f 64  wo or more opcod
1bfa0 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  es..**.**    *  
1bfb0 41 6e 79 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  Any OP_Integer, 
1bfc0 4f 50 5f 52 65 61 6c 2c 20 4f 50 5f 53 74 72 69  OP_Real, OP_Stri
1bfd0 6e 67 2c 20 4f 50 5f 42 6c 6f 62 2c 20 4f 50 5f  ng, OP_Blob, OP_
1bfe0 4e 75 6c 6c 2c 20 0a 2a 2a 20 20 20 20 20 20 20  Null, .**       
1bff0 6f 72 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 74  or OP_Variable t
1c000 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
1c010 64 20 74 6f 20 62 65 20 70 6c 61 63 65 64 20 69  d to be placed i
1c020 6e 20 61 20 0a 2a 2a 20 20 20 20 20 20 20 73 70  n a .**       sp
1c030 65 63 69 66 69 63 20 72 65 67 69 73 74 65 72 2e  ecific register.
1c040 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
1c050 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 66 61 63 74  no point in fact
1c060 6f 72 69 6e 67 20 6f 75 74 20 73 69 6e 67 6c 65  oring out single
1c070 2d 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e  -instruction con
1c080 73 74 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73  stant.** express
1c090 69 6f 6e 73 20 74 68 61 74 20 6e 65 65 64 20 74  ions that need t
1c0a0 6f 20 62 65 20 70 6c 61 63 65 64 20 69 6e 20 61  o be placed in a
1c0b0 20 70 61 72 74 69 63 75 6c 61 72 20 72 65 67 69   particular regi
1c0c0 73 74 65 72 2e 20 20 0a 2a 2a 20 57 65 20 63 6f  ster.  .** We co
1c0d0 75 6c 64 20 66 61 63 74 6f 72 20 74 68 65 6d 20  uld factor them 
1c0e0 6f 75 74 2c 20 62 75 74 20 74 68 65 6e 20 77 65  out, but then we
1c0f0 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 61 64   would end up ad
1c100 64 69 6e 67 20 61 6e 0a 2a 2a 20 4f 50 5f 53 43  ding an.** OP_SC
1c110 6f 70 79 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  opy instruction 
1c120 74 6f 20 6d 6f 76 65 20 74 68 65 20 76 61 6c 75  to move the valu
1c130 65 20 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65  e into the corre
1c140 63 74 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 6c  ct register.** l
1c150 61 74 65 72 2e 20 20 57 65 20 6d 69 67 68 74 20  ater.  We might 
1c160 61 73 20 77 65 6c 6c 20 6a 75 73 74 20 75 73 65  as well just use
1c170 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e   the original in
1c180 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a  struction and.**
1c190 20 61 76 6f 69 64 20 74 68 65 20 4f 50 5f 53 43   avoid the OP_SC
1c1a0 6f 70 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  opy..*/.static i
1c1b0 6e 74 20 69 73 41 70 70 72 6f 70 72 69 61 74 65  nt isAppropriate
1c1c0 46 6f 72 46 61 63 74 6f 72 69 6e 67 28 45 78 70  ForFactoring(Exp
1c1d0 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 21 73 71  r *p){.  if( !sq
1c1e0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
1c1f0 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 29 20 29 7b  antNotJoin(p) ){
1c200 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
1c210 2f 2a 20 4f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74  /* Only constant
1c220 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
1c230 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
1c240 20 66 61 63 74 6f 72 69 6e 67 20 2a 2f 0a 20 20   factoring */.  
1c250 7d 0a 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67  }.  if( (p->flag
1c260 73 20 26 20 45 50 5f 46 69 78 65 64 44 65 73 74  s & EP_FixedDest
1c270 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
1c280 72 6e 20 31 3b 20 20 2f 2a 20 41 6e 79 20 63 6f  rn 1;  /* Any co
1c290 6e 73 74 61 6e 74 20 77 69 74 68 6f 75 74 20 61  nstant without a
1c2a0 20 66 69 78 65 64 20 64 65 73 74 69 6e 61 74 69   fixed destinati
1c2b0 6f 6e 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  on is appropriat
1c2c0 65 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65  e */.  }.  while
1c2d0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55  ( p->op==TK_UPLU
1c2e0 53 20 29 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74  S ) p = p->pLeft
1c2f0 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  ;.  switch( p->o
1c300 70 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  p ){.#ifndef SQL
1c310 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49  ITE_OMIT_BLOB_LI
1c320 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54  TERAL.    case T
1c330 4b 5f 42 4c 4f 42 3a 0a 23 65 6e 64 69 66 0a 20  K_BLOB:.#endif. 
1c340 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
1c350 42 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  BLE:.    case TK
1c360 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61  _INTEGER:.    ca
1c370 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20  se TK_FLOAT:.   
1c380 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20   case TK_NULL:. 
1c390 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
1c3a0 47 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  G: {.      testc
1c3b0 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 42  ase( p->op==TK_B
1c3c0 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20 74 65 73  LOB );.      tes
1c3d0 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
1c3e0 5f 56 41 52 49 41 42 4c 45 20 29 3b 0a 20 20 20  _VARIABLE );.   
1c3f0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
1c400 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29  op==TK_INTEGER )
1c410 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1c420 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  ( p->op==TK_FLOA
1c430 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
1c440 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e  ase( p->op==TK_N
1c450 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ULL );.      tes
1c460 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
1c470 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20 20 20 20  _STRING );.     
1c480 20 2f 2a 20 53 69 6e 67 6c 65 2d 69 6e 73 74 72   /* Single-instr
1c490 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73  uction constants
1c4a0 20 77 69 74 68 20 61 20 66 69 78 65 64 20 64 65   with a fixed de
1c4b0 73 74 69 6e 61 74 69 6f 6e 20 61 72 65 0a 20 20  stination are.  
1c4c0 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20 64 6f      ** better do
1c4d0 6e 65 20 69 6e 2d 6c 69 6e 65 2e 20 20 49 66 20  ne in-line.  If 
1c4e0 77 65 20 66 61 63 74 6f 72 20 74 68 65 6d 2c 20  we factor them, 
1c4f0 74 68 65 79 20 77 69 6c 6c 20 6a 75 73 74 20 65  they will just e
1c500 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 70 20 67  nd.      ** up g
1c510 65 6e 65 72 61 74 69 6e 67 20 61 6e 20 4f 50 5f  enerating an OP_
1c520 53 43 6f 70 79 20 74 6f 20 6d 6f 76 65 20 74 68  SCopy to move th
1c530 65 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20 64  e value to the d
1c540 65 73 74 69 6e 61 74 69 6f 6e 0a 20 20 20 20 20  estination.     
1c550 20 2a 2a 20 72 65 67 69 73 74 65 72 2e 20 2a 2f   ** register. */
1c560 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1c570 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1c580 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
1c590 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 2d     if( p->pLeft-
1c5a0 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c  >op==TK_FLOAT ||
1c5b0 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54   p->pLeft->op==T
1c5c0 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  K_INTEGER ){.   
1c5d0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1c5e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1c5f0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
1c600 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 62  fault: {.      b
1c610 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1c620 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
1c630 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73  *.** If pExpr is
1c640 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72   a constant expr
1c650 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 61  ession that is a
1c660 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 0a 2a  ppropriate for.*
1c670 2a 20 66 61 63 74 6f 72 69 6e 67 20 6f 75 74 20  * factoring out 
1c680 6f 66 20 61 20 6c 6f 6f 70 2c 20 74 68 65 6e 20  of a loop, then 
1c690 65 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70  evaluate the exp
1c6a0 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20  ression.** into 
1c6b0 61 20 72 65 67 69 73 74 65 72 20 61 6e 64 20 63  a register and c
1c6c0 6f 6e 76 65 72 74 20 74 68 65 20 65 78 70 72 65  onvert the expre
1c6d0 73 73 69 6f 6e 20 69 6e 74 6f 20 61 20 54 4b 5f  ssion into a TK_
1c6e0 52 45 47 49 53 54 45 52 0a 2a 2a 20 65 78 70 72  REGISTER.** expr
1c6f0 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ession..*/.stati
1c700 63 20 69 6e 74 20 65 76 61 6c 43 6f 6e 73 74 45  c int evalConstE
1c710 78 70 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  xpr(Walker *pWal
1c720 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
1c730 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
1c740 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
1c750 61 72 73 65 3b 0a 20 20 73 77 69 74 63 68 28 20  arse;.  switch( 
1c760 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
1c770 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20   case TK_IN:.   
1c780 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
1c790 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  R: {.      retur
1c7a0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
1c7b0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
1c7c0 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  OLLATE: {.      
1c7d0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
1c7e0 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  nue;.    }.    c
1c7f0 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
1c800 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
1c810 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63  _FUNCTION:.    c
1c820 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e  ase TK_CONST_FUN
1c830 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  C: {.      /* Th
1c840 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 61  e arguments to a
1c850 20 66 75 6e 63 74 69 6f 6e 20 68 61 76 65 20 61   function have a
1c860 20 66 69 78 65 64 20 64 65 73 74 69 6e 61 74 69   fixed destinati
1c870 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 4d 61 72  on..      ** Mar
1c880 6b 20 74 68 65 6d 20 74 68 69 73 20 77 61 79 20  k them this way 
1c890 74 6f 20 61 76 6f 69 64 20 67 65 6e 65 72 61 74  to avoid generat
1c8a0 65 64 20 75 6e 6e 65 65 64 65 64 20 4f 50 5f 53  ed unneeded OP_S
1c8b0 43 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 69 6e  Copy.      ** in
1c8c0 73 74 72 75 63 74 69 6f 6e 73 2e 20 0a 20 20 20  structions. .   
1c8d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72     */.      Expr
1c8e0 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
1c8f0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
1c900 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1c910 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1c920 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
1c930 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
1c940 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
1c950 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e  int i = pList->n
1c960 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 73 74  Expr;.        st
1c970 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
1c980 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 4c 69 73  em *pItem = pLis
1c990 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f  t->a;.        fo
1c9a0 72 28 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  r(; i>0; i--, pI
1c9b0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
1c9c0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 74    if( ALWAYS(pIt
1c9d0 65 6d 2d 3e 70 45 78 70 72 29 20 29 20 70 49 74  em->pExpr) ) pIt
1c9e0 65 6d 2d 3e 70 45 78 70 72 2d 3e 66 6c 61 67 73  em->pExpr->flags
1c9f0 20 7c 3d 20 45 50 5f 46 69 78 65 64 44 65 73 74   |= EP_FixedDest
1ca00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ca10 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
1ca20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1ca30 20 69 73 41 70 70 72 6f 70 72 69 61 74 65 46 6f   isAppropriateFo
1ca40 72 46 61 63 74 6f 72 69 6e 67 28 70 45 78 70 72  rFactoring(pExpr
1ca50 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 20  ) ){.    int r1 
1ca60 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1ca70 3b 0a 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73  ;.    int r2 = s
1ca80 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
1ca90 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
1caa0 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 2f 2a 20  pr, r1);.    /* 
1cab0 49 66 20 72 32 21 3d 72 31 2c 20 69 74 20 6d 65  If r2!=r1, it me
1cac0 61 6e 73 20 74 68 61 74 20 72 65 67 69 73 74 65  ans that registe
1cad0 72 20 72 31 20 69 73 20 6e 65 76 65 72 20 75 73  r r1 is never us
1cae0 65 64 2e 20 20 54 68 61 74 20 69 73 20 68 61 72  ed.  That is har
1caf0 6d 6c 65 73 73 0a 20 20 20 20 2a 2a 20 62 75 74  mless.    ** but
1cb00 20 73 75 62 6f 70 74 69 6d 61 6c 2c 20 73 6f 20   suboptimal, so 
1cb10 77 65 20 77 61 6e 74 20 74 6f 20 6b 6e 6f 77 20  we want to know 
1cb20 61 62 6f 75 74 20 74 68 65 20 73 69 74 75 61 74  about the situat
1cb30 69 6f 6e 20 74 6f 20 66 69 78 20 69 74 2e 0a 20  ion to fix it.. 
1cb40 20 20 20 2a 2a 20 48 65 6e 63 65 20 74 68 65 20     ** Hence the 
1cb50 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
1cb60 3a 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  : */.    assert(
1cb70 20 72 32 3d 3d 72 31 20 29 3b 0a 20 20 20 20 65   r2==r1 );.    e
1cb80 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 70 45  xprToRegister(pE
1cb90 78 70 72 2c 20 72 32 29 3b 0a 20 20 20 20 72 65  xpr, r2);.    re
1cba0 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
1cbb0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
1cbc0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
1cbd0 0a 2a 2a 20 50 72 65 65 76 61 6c 75 61 74 65 20  .** Preevaluate 
1cbe0 63 6f 6e 73 74 61 6e 74 20 73 75 62 65 78 70 72  constant subexpr
1cbf0 65 73 73 69 6f 6e 73 20 77 69 74 68 69 6e 20 70  essions within p
1cc00 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74  Expr and store t
1cc10 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e  he.** results in
1cc20 20 72 65 67 69 73 74 65 72 73 2e 20 20 4d 6f 64   registers.  Mod
1cc30 69 66 79 20 70 45 78 70 72 20 73 6f 20 74 68 61  ify pExpr so tha
1cc40 74 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 73  t the constant s
1cc50 75 62 65 78 70 72 65 73 69 6f 6e 73 0a 2a 2a 20  ubexpresions.** 
1cc60 61 72 65 20 54 4b 5f 52 45 47 49 53 54 45 52 20  are TK_REGISTER 
1cc70 6f 70 63 6f 64 65 73 20 74 68 61 74 20 72 65 66  opcodes that ref
1cc80 65 72 20 74 6f 20 74 68 65 20 70 72 65 63 6f 6d  er to the precom
1cc90 70 75 74 65 64 20 76 61 6c 75 65 73 2e 0a 2a 2a  puted values..**
1cca0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1ccb0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
1ccc0 68 65 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 63  he jump to the c
1ccd0 6f 6f 6b 69 65 2d 63 68 65 63 6b 20 63 6f 64 65  ookie-check code
1cce0 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20   has.** already 
1ccf0 6f 63 63 75 72 2e 20 20 53 69 6e 63 65 20 74 68  occur.  Since th
1cd00 65 20 63 6f 6f 6b 69 65 2d 63 68 65 63 6b 20 6a  e cookie-check j
1cd10 75 6d 70 20 69 73 20 67 65 6e 65 72 61 74 65 64  ump is generated
1cd20 20 70 72 69 6f 72 20 74 6f 0a 2a 2a 20 61 6e 79   prior to.** any
1cd30 20 6f 74 68 65 72 20 73 65 72 69 6f 75 73 20 70   other serious p
1cd40 72 6f 63 65 73 73 69 6e 67 2c 20 74 68 69 73 20  rocessing, this 
1cd50 63 68 65 63 6b 20 65 6e 73 75 72 65 73 20 74 68  check ensures th
1cd60 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 2a  at there is no.*
1cd70 2a 20 77 61 79 20 74 6f 20 61 63 63 69 64 65 6e  * way to acciden
1cd80 74 6c 79 20 62 79 70 61 73 73 20 74 68 65 20 63  tly bypass the c
1cd90 6f 6e 73 74 61 6e 74 20 69 6e 69 74 69 61 6c 69  onstant initiali
1cda0 7a 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  zations..**.** T
1cdb0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1cdc0 6c 73 6f 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74  lso a no-op if t
1cdd0 68 65 20 53 51 4c 49 54 45 5f 46 61 63 74 6f 72  he SQLITE_Factor
1cde0 4f 75 74 43 6f 6e 73 74 20 6f 70 74 69 6d 69 7a  OutConst optimiz
1cdf0 61 74 69 6f 6e 0a 2a 2a 20 69 73 20 64 69 73 61  ation.** is disa
1ce00 62 6c 65 64 20 76 69 61 20 74 68 65 20 73 71 6c  bled via the sql
1ce10 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1ce20 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1ce30 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 29  L_OPTIMIZATIONS)
1ce40 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 20 20  .** interface.  
1ce50 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 65 73 74  This allows test
1ce60 20 6c 6f 67 69 63 20 74 6f 20 76 65 72 69 66 79   logic to verify
1ce70 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 61   that the same a
1ce80 6e 73 77 65 72 20 69 73 0a 2a 2a 20 6f 62 74 61  nswer is.** obta
1ce90 69 6e 65 64 20 66 6f 72 20 71 75 65 72 69 65 73  ined for queries
1cea0 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
1ceb0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 63 6f  hether or not co
1cec0 6e 73 74 61 6e 74 73 20 61 72 65 0a 2a 2a 20 70  nstants are.** p
1ced0 72 65 63 6f 6d 70 75 74 65 64 20 69 6e 74 6f 20  recomputed into 
1cee0 72 65 67 69 73 74 65 72 73 20 6f 72 20 69 66 20  registers or if 
1cef0 74 68 65 79 20 61 72 65 20 69 6e 73 65 72 74 65  they are inserte
1cf00 64 20 69 6e 2d 6c 69 6e 65 2e 0a 2a 2f 0a 76 6f  d in-line..*/.vo
1cf10 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
1cf20 64 65 43 6f 6e 73 74 61 6e 74 73 28 50 61 72 73  deConstants(Pars
1cf30 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1cf40 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65  *pExpr){.  Walke
1cf50 72 20 77 3b 0a 20 20 69 66 28 20 70 50 61 72 73  r w;.  if( pPars
1cf60 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 29 20  e->cookieGoto ) 
1cf70 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 4f 70  return;.  if( Op
1cf80 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
1cf90 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53  ed(pParse->db, S
1cfa0 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74 43  QLITE_FactorOutC
1cfb0 6f 6e 73 74 29 20 29 20 72 65 74 75 72 6e 3b 0a  onst) ) return;.
1cfc0 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
1cfd0 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
1cfe0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
1cff0 65 76 61 6c 43 6f 6e 73 74 45 78 70 72 3b 0a 20  evalConstExpr;. 
1d000 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
1d010 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  se;.  sqlite3Wal
1d020 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29  kExpr(&w, pExpr)
1d030 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
1d040 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 70  rate code that p
1d050 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65 20  ushes the value 
1d060 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74  of every element
1d070 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a   of the given.**
1d080 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
1d090 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65   into a sequence
1d0a0 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 62 65   of registers be
1d0b0 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65  ginning at targe
1d0c0 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  t..**.** Return 
1d0d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
1d0e0 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64  ements evaluated
1d0f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1d100 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
1d110 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1d120 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
1d130 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
1d140 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
1d150 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
1d160 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63  ion list to be c
1d170 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61  oded */.  int ta
1d180 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  rget,        /* 
1d190 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 72  Where to write r
1d1a0 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
1d1b0 64 6f 48 61 72 64 43 6f 70 79 20 20 20 20 20 2f  doHardCopy     /
1d1c0 2a 20 4d 61 6b 65 20 61 20 68 61 72 64 20 63 6f  * Make a hard co
1d1d0 70 79 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d  py of every elem
1d1e0 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ent */.){.  stru
1d1f0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
1d200 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
1d210 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  , n;.  assert( p
1d220 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  List!=0 );.  ass
1d230 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b  ert( target>0 );
1d240 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1d250 65 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b 20 20  e->pVdbe!=0 );  
1d260 2f 2a 20 4e 65 76 65 72 20 67 65 74 73 20 74 68  /* Never gets th
1d270 69 73 20 66 61 72 20 6f 74 68 65 72 77 69 73 65  is far otherwise
1d280 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d   */.  n = pList-
1d290 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28 70 49  >nExpr;.  for(pI
1d2a0 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
1d2b0 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74  0; i<n; i++, pIt
1d2c0 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  em++){.    Expr 
1d2d0 2a 70 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e  *pExpr = pItem->
1d2e0 70 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 69  pExpr;.    int i
1d2f0 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
1d300 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
1d310 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
1d320 65 74 2b 69 29 3b 0a 20 20 20 20 69 66 28 20 69  et+i);.    if( i
1d330 6e 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29  nReg!=target+i )
1d340 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1d350 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65  dbeAddOp2(pParse
1d360 2d 3e 70 56 64 62 65 2c 20 64 6f 48 61 72 64 43  ->pVdbe, doHardC
1d370 6f 70 79 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20  opy ? OP_Copy : 
1d380 4f 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20 20 20  OP_SCopy,.      
1d390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3a0 20 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b    inReg, target+
1d3b0 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  i);.    }.  }.  
1d3c0 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
1d3d0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1d3e0 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20 6f   for a BETWEEN o
1d3f0 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  perator..**.**  
1d400 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e    x BETWEEN y AN
1d410 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62  D z.**.** The ab
1d420 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ove is equivalen
1d430 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78  t to .**.**    x
1d440 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a  >=y AND x<=z.**.
1d450 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73 75  ** Code it as su
1d460 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20  ch, taking care 
1d470 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e  to do the common
1d480 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a   subexpression.*
1d490 2a 20 65 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  * elementation o
1d4a0 66 20 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  f x..*/.static v
1d4b0 6f 69 64 20 65 78 70 72 43 6f 64 65 42 65 74 77  oid exprCodeBetw
1d4c0 65 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  een(.  Parse *pP
1d4d0 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
1d4e0 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
1d4f0 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
1d500 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
1d510 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 45  ,      /* The BE
1d520 54 57 45 45 4e 20 65 78 70 72 65 73 73 69 6f 6e  TWEEN expression
1d530 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20   */.  int dest, 
1d540 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
1d550 68 65 72 65 20 69 66 20 74 68 65 20 6a 75 6d 70  here if the jump
1d560 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 69   is taken */.  i
1d570 6e 74 20 6a 75 6d 70 49 66 54 72 75 65 2c 20 20  nt jumpIfTrue,  
1d580 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d   /* Take the jum
1d590 70 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e  p if the BETWEEN
1d5a0 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e   is true */.  in
1d5b0 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20  t jumpIfNull    
1d5c0 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70  /* Take the jump
1d5d0 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20   if the BETWEEN 
1d5e0 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  is NULL */.){.  
1d5f0 45 78 70 72 20 65 78 70 72 41 6e 64 3b 20 20 20  Expr exprAnd;   
1d600 20 20 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70 65    /* The AND ope
1d610 72 61 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41  rator in  x>=y A
1d620 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78  ND x<=z  */.  Ex
1d630 70 72 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20  pr compLeft;    
1d640 2f 2a 20 54 68 65 20 20 78 3e 3d 79 20 20 74 65  /* The  x>=y  te
1d650 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d  rm */.  Expr com
1d660 70 52 69 67 68 74 3b 20 20 20 2f 2a 20 54 68 65  pRight;   /* The
1d670 20 20 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a    x<=z  term */.
1d680 20 20 45 78 70 72 20 65 78 70 72 58 3b 20 20 20    Expr exprX;   
1d690 20 20 20 20 2f 2a 20 54 68 65 20 20 78 20 20 73      /* The  x  s
1d6a0 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  ubexpression */.
1d6b0 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
1d6c0 20 30 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79   0; /* Temporary
1d6d0 20 75 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f   use register */
1d6e0 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ..  assert( !Exp
1d6f0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1d700 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
1d710 29 20 29 3b 0a 20 20 65 78 70 72 58 20 3d 20 2a  ) );.  exprX = *
1d720 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
1d730 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f  exprAnd.op = TK_
1d740 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70  AND;.  exprAnd.p
1d750 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74  Left = &compLeft
1d760 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 52 69 67  ;.  exprAnd.pRig
1d770 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b  ht = &compRight;
1d780 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d  .  compLeft.op =
1d790 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65   TK_GE;.  compLe
1d7a0 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72  ft.pLeft = &expr
1d7b0 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52  X;.  compLeft.pR
1d7c0 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  ight = pExpr->x.
1d7d0 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
1d7e0 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f  r;.  compRight.o
1d7f0 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d  p = TK_LE;.  com
1d800 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 26  pRight.pLeft = &
1d810 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67  exprX;.  compRig
1d820 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70  ht.pRight = pExp
1d830 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d  r->x.pList->a[1]
1d840 2e 70 45 78 70 72 3b 0a 20 20 65 78 70 72 54 6f  .pExpr;.  exprTo
1d850 52 65 67 69 73 74 65 72 28 26 65 78 70 72 58 2c  Register(&exprX,
1d860 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d870 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78  Temp(pParse, &ex
1d880 70 72 58 2c 20 26 72 65 67 46 72 65 65 31 29 29  prX, &regFree1))
1d890 3b 0a 20 20 69 66 28 20 6a 75 6d 70 49 66 54 72  ;.  if( jumpIfTr
1d8a0 75 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ue ){.    sqlite
1d8b0 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
1d8c0 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65  se, &exprAnd, de
1d8d0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1d8e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1d8f0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1d900 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e  (pParse, &exprAn
1d910 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  d, dest, jumpIfN
1d920 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ull);.  }.  sqli
1d930 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1d940 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
1d950 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72  e1);..  /* Ensur
1d960 65 20 61 64 65 71 75 61 74 65 20 74 65 73 74 20  e adequate test 
1d970 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74 65  coverage */.  te
1d980 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
1d990 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue==0 && jumpIfN
1d9a0 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
1d9b0 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
1d9c0 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d  ase( jumpIfTrue=
1d9d0 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
1d9e0 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  ==0 && regFree1!
1d9f0 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
1da00 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20  ( jumpIfTrue==0 
1da10 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
1da20 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
1da30 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  );.  testcase( j
1da40 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20  umpIfTrue==0 && 
1da50 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
1da60 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
1da70 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1da80 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d  IfTrue!=0 && jum
1da90 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
1daa0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
1dab0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1dac0 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue!=0 && jumpIf
1dad0 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
1dae0 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1!=0 );.  test
1daf0 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
1db00 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  !=0 && jumpIfNul
1db10 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
1db20 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
1db30 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30  e( jumpIfTrue!=0
1db40 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
1db50 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
1db60 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   );.}../*.** Gen
1db70 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
1db80 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
1db90 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
1dba0 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
1dbb0 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
1dbc0 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
1dbd0 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75  ssion is true bu
1dbe0 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63  t execution.** c
1dbf0 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68  ontinues straigh
1dc00 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78  t thru if the ex
1dc10 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
1dc20 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
1dc30 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
1dc40 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
1dc50 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
1dc60 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74  alse), then.** t
1dc70 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20  ake the jump if 
1dc80 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66  the jumpIfNull f
1dc90 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f 4a 55  lag is SQLITE_JU
1dca0 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  MPIFNULL..**.** 
1dcb0 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64  This code depend
1dcc0 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68  s on the fact th
1dcd0 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e  at certain token
1dce0 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f   values (ex: TK_
1dcf0 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73  EQ).** are the s
1dd00 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61  ame as opcode va
1dd10 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29  lues (ex: OP_Eq)
1dd20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20   that implement 
1dd30 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
1dd40 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20  g.** operation. 
1dd50 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74   Special comment
1dd60 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20  s in vdbe.c and 
1dd70 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77  the mkopcodeh.aw
1dd80 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74  k script in.** t
1dd90 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20  he make process 
1dda0 63 61 75 73 65 20 74 68 65 73 65 20 76 61 6c 75  cause these valu
1ddb0 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73  es to align.  As
1ddc0 73 65 72 74 28 29 73 20 69 6e 20 74 68 65 20 63  sert()s in the c
1ddd0 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72  ode.** below ver
1dde0 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d  ify that the num
1ddf0 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64  bers are aligned
1de00 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76   correctly..*/.v
1de10 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49  oid sqlite3ExprI
1de20 66 54 72 75 65 28 50 61 72 73 65 20 2a 70 50 61  fTrue(Parse *pPa
1de30 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1de40 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20  , int dest, int 
1de50 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56  jumpIfNull){.  V
1de60 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1de70 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70  >pVdbe;.  int op
1de80 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
1de90 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree1 = 0;.  int 
1dea0 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20  regFree2 = 0;.  
1deb0 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61  int r1, r2;..  a
1dec0 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c  ssert( jumpIfNul
1ded0 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  l==SQLITE_JUMPIF
1dee0 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75  NULL || jumpIfNu
1def0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e  ll==0 );.  if( N
1df00 45 56 45 52 28 76 3d 3d 30 29 20 29 20 20 20 20  EVER(v==0) )    
1df10 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69   return;  /* Exi
1df20 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63  stence of VDBE c
1df30 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72  hecked by caller
1df40 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
1df50 70 45 78 70 72 3d 3d 30 29 20 29 20 72 65 74 75  pExpr==0) ) retu
1df60 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74  rn;  /* No way t
1df70 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 2a  his can happen *
1df80 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  /.  op = pExpr->
1df90 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  op;.  switch( op
1dfa0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
1dfb0 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  AND: {.      int
1dfc0 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   d2 = sqlite3Vdb
1dfd0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1dfe0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1dff0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1e000 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1e010 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
1e020 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
1e030 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1e040 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1e050 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c  t, d2,jumpIfNull
1e060 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  ^SQLITE_JUMPIFNU
1e070 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  LL);.      sqlit
1e080 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
1e090 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1e0a0 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
1e0b0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
1e0c0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1e0d0 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
1e0e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1e0f0 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31  chePop(pParse, 1
1e100 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1e110 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1e120 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65  K_OR: {.      te
1e130 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1e140 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
1e150 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
1e160 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1e170 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
1e180 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1e190 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
1e1a0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1e1b0 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
1e1c0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1e1d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1e1e0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
1e1f0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1e200 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1e210 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e220 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1e230 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1e240 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1e250 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
1e260 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e270 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
1e280 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
1e290 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
1e2a0 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
1e2b0 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
1e2c0 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
1e2d0 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f  assert( TK_LT==O
1e2e0 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Lt );.      as
1e2f0 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f  sert( TK_LE==OP_
1e300 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Le );.      asse
1e310 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  rt( TK_GT==OP_Gt
1e320 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1e330 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29  ( TK_GE==OP_Ge )
1e340 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e350 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a  TK_EQ==OP_Eq );.
1e360 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1e370 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20  _NE==OP_Ne );.  
1e380 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1e390 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20  ==TK_LT );.     
1e3a0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1e3b0 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_LE );.      te
1e3c0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47  stcase( op==TK_G
1e3d0 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
1e3e0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29  ase( op==TK_GE )
1e3f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e400 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20  ( op==TK_EQ );. 
1e410 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1e420 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20  p==TK_NE );.    
1e430 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1e440 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1e450 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1e460 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1e470 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1e480 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1e490 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1e4a0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1e4b0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1e4c0 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
1e4d0 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
1e4e0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1e4f0 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
1e500 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
1e510 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
1e520 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r2, dest, jumpI
1e530 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 74 65  fNull);.      te
1e540 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1e550 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
1e560 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
1e570 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1e580 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1e590 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73  e TK_IS:.    cas
1e5a0 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20  e TK_ISNOT: {.  
1e5b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1e5c0 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20  ==TK_IS );.     
1e5d0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1e5e0 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20  K_ISNOT );.     
1e5f0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1e600 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1e610 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1e620 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1e630 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1e640 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1e650 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1e660 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1e670 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b      op = (op==TK
1e680 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54  _IS) ? TK_EQ : T
1e690 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f 64 65  K_NE;.      code
1e6a0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
1e6b0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
1e6c0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
1e6d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e6e0 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
1e6f0 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b   SQLITE_NULLEQ);
1e700 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e710 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1e720 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e730 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
1e740 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e750 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
1e760 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
1e770 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
1e780 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53     assert( TK_IS
1e790 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  NULL==OP_IsNull 
1e7a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e7b0 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f   TK_NOTNULL==OP_
1e7c0 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20  NotNull );.     
1e7d0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1e7e0 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  K_ISNULL );.    
1e7f0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1e800 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
1e810 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1e820 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1e830 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1e840 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1e850 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e860 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31  AddOp2(v, op, r1
1e870 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74  , dest);.      t
1e880 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1e890 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  1==0 );.      br
1e8a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1e8b0 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
1e8c0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1e8d0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1e8e0 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64  );.      exprCod
1e8f0 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c  eBetween(pParse,
1e900 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 31 2c   pExpr, dest, 1,
1e910 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1e920 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1e930 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e940 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
1e950 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
1e960 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
1e970 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56  False = sqlite3V
1e980 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1e990 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49  .      int destI
1e9a0 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75  fNull = jumpIfNu
1e9b0 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65 73 74  ll ? dest : dest
1e9c0 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20 20 73  IfFalse;.      s
1e9d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
1e9e0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1e9f0 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73  destIfFalse, des
1ea00 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
1ea10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ea20 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
1ea30 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71   dest);.      sq
1ea40 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1ea50 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46  Label(v, destIfF
1ea60 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65  alse);.      bre
1ea70 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
1ea80 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
1ea90 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1eaa0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1eab0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72  Parse, pExpr, &r
1eac0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1ead0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1eae0 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20  3(v, OP_If, r1, 
1eaf0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1eb00 21 3d 30 29 3b 0a 20 20 20 20 20 20 74 65 73 74  !=0);.      test
1eb10 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1eb20 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1eb30 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1eb40 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1eb50 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
1eb60 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1eb70 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
1eb80 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
1eb90 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1eba0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
1ebb0 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  );  .}../*.** Ge
1ebc0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1ebd0 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
1ebe0 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
1ebf0 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
1ec00 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
1ec10 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
1ec20 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20  ession is false 
1ec30 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
1ec40 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
1ec50 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
1ec60 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
1ec70 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
1ec80 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
1ec90 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
1eca0 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
1ecb0 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a  false) then.** j
1ecc0 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ump if jumpIfNul
1ecd0 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50  l is SQLITE_JUMP
1ece0 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74  IFNULL or fall t
1ecf0 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66  hrough if jumpIf
1ed00 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f  Null.** is 0..*/
1ed10 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1ed20 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a  rIfFalse(Parse *
1ed30 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1ed40 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
1ed50 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
1ed60 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1ed70 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
1ed80 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72   op = 0;.  int r
1ed90 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69  egFree1 = 0;.  i
1eda0 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
1edb0 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a  .  int r1, r2;..
1edc0 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66    assert( jumpIf
1edd0 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d  Null==SQLITE_JUM
1ede0 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49  PIFNULL || jumpI
1edf0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  fNull==0 );.  if
1ee00 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
1ee10 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74  return; /* Exist
1ee20 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65  ence of VDBE che
1ee30 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a  cked by caller *
1ee40 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  /.  if( pExpr==0
1ee50 20 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20   )    return;.. 
1ee60 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   /* The value of
1ee70 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f   pExpr->op and o
1ee80 70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73  p are related as
1ee90 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
1eea0 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d   **       pExpr-
1eeb0 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f  >op            o
1eec0 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d  p.  **       ---
1eed0 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20  ------          
1eee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20  ----------.  ** 
1eef0 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20        TK_ISNULL 
1ef00 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e           OP_NotN
1ef10 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
1ef20 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20  K_NOTNULL       
1ef30 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a    OP_IsNull.  **
1ef40 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20         TK_NE    
1ef50 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a            OP_Eq.
1ef60 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51    **       TK_EQ
1ef70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
1ef80 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Ne.  **       T
1ef90 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20  K_GT            
1efa0 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20    OP_Le.  **    
1efb0 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20     TK_LE        
1efc0 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a        OP_Gt.  **
1efd0 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20         TK_GE    
1efe0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a            OP_Lt.
1eff0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54    **       TK_LT
1f000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
1f010 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  _Ge.  **.  ** Fo
1f020 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  r other values o
1f030 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20  f pExpr->op, op 
1f040 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64  is undefined and
1f050 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68   unused..  ** Th
1f060 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61  e value of TK_ a
1f070 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
1f080 20 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75   are arranged su
1f090 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20  ch that we.  ** 
1f0a0 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20  can compute the 
1f0b0 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73  mapping above us
1f0c0 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
1f0d0 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20  g expression..  
1f0e0 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72  ** Assert()s ver
1f0f0 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d  ify that the com
1f100 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72  putation is corr
1f110 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d  ect..  */.  op =
1f120 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b   ((pExpr->op+(TK
1f130 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28  _ISNULL&1))^1)-(
1f140 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20  TK_ISNULL&1);.. 
1f150 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65   /* Verify corre
1f160 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  ct alignment of 
1f170 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
1f180 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  tants.  */.  ass
1f190 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
1f1a0 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  TK_ISNULL || op=
1f1b0 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
1f1c0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1f1d0 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c  op!=TK_NOTNULL |
1f1e0 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  | op==OP_IsNull 
1f1f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
1f200 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c  pr->op!=TK_NE ||
1f210 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20   op==OP_Eq );.  
1f220 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1f230 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d  p!=TK_EQ || op==
1f240 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ne );.  asser
1f250 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1f260 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65  _LT || op==OP_Ge
1f270 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1f280 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c  xpr->op!=TK_LE |
1f290 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  | op==OP_Gt );. 
1f2a0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1f2b0 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d  op!=TK_GT || op=
1f2c0 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Le );.  asse
1f2d0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1f2e0 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GE || op==OP_L
1f2f0 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  t );..  switch( 
1f300 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
1f310 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
1f320 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f330 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1f340 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1f350 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1f360 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1f370 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1f380 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f390 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1f3a0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1f3b0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1f3c0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
1f3d0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1f3e0 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
1f3f0 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
1f400 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1f410 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f420 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1f430 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1f440 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
1f450 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
1f460 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
1f470 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f480 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66  Left, d2, jumpIf
1f490 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50  Null^SQLITE_JUMP
1f4a0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
1f4b0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1f4c0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1f4d0 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
1f4e0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1f4f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1f500 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29  olveLabel(v, d2)
1f510 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1f520 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
1f530 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72  se, 1);.      br
1f540 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1f550 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
1f560 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1f570 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1f580 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1f590 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
1f5a0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
1f5b0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1f5c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f5d0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
1f5e0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
1f5f0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
1f600 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
1f610 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
1f620 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
1f630 51 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  Q: {.      testc
1f640 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29  ase( op==TK_LT )
1f650 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f660 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20  ( op==TK_LE );. 
1f670 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1f680 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20  p==TK_GT );.    
1f690 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f6a0 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_GE );.      t
1f6b0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f6c0 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  EQ );.      test
1f6d0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20  case( op==TK_NE 
1f6e0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f6f0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1f700 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
1f710 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1f720 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1f730 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1f740 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
1f750 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1f760 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1f770 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
1f780 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
1f790 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
1f7a0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
1f7b0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
1f7c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f7d0 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
1f7e0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1f7f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1f800 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1f810 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1f820 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
1f830 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f840 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
1f850 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
1f860 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
1f870 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
1f880 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74  TK_IS );.      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 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
1f8b0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1f8c0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1f8d0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1f8e0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1f8f0 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
1f900 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1f910 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f920 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
1f930 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 70  );.      op = (p
1f940 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29  Expr->op==TK_IS)
1f950 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51   ? TK_NE : TK_EQ
1f960 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
1f970 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
1f980 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
1f990 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
1f9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1f9b0 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 53 51 4c  1, r2, dest, SQL
1f9c0 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
1f9d0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1f9e0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1f9f0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1fa00 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
1fa10 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1fa20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
1fa30 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
1fa40 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 74  TNULL: {.      t
1fa50 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1fa60 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
1fa70 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1fa80 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  _NOTNULL );.    
1fa90 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1faa0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1fab0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1fac0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1fad0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1fae0 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20  dOp2(v, op, r1, 
1faf0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
1fb00 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1fb10 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1fb20 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1fb30 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
1fb40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fb50 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1fb60 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
1fb70 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
1fb80 45 78 70 72 2c 20 64 65 73 74 2c 20 30 2c 20 6a  Expr, dest, 0, j
1fb90 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1fba0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1fbb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1fbc0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
1fbd0 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
1fbe0 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66 4e 75      if( jumpIfNu
1fbf0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ll ){.        sq
1fc00 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
1fc10 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
1fc20 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  est, dest);.    
1fc30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1fc40 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
1fc50 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1fc60 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1fc70 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1fc80 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
1fc90 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 49 66  pr, dest, destIf
1fca0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  Null);.        s
1fcb0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1fcc0 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
1fcd0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Null);.      }. 
1fce0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1fcf0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66  }.#endif.    def
1fd00 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 31  ault: {.      r1
1fd10 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1fd20 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1fd30 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29  Expr, &regFree1)
1fd40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1fd50 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1fd60 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c  IfNot, r1, dest,
1fd70 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b   jumpIfNull!=0);
1fd80 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1fd90 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1fda0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fdb0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1fdc0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1fdd0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1fde0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1fdf0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
1fe00 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
1fe10 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1fe20 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a  e, regFree2);.}.
1fe30 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70  ./*.** Do a deep
1fe40 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74   comparison of t
1fe50 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  wo expression tr
1fe60 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ees.  Return 0 i
1fe70 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70  f the two.** exp
1fe80 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f 6d  ressions are com
1fe90 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69 63 61  pletely identica
1fea0 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  l.  Return 1 if 
1feb0 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e 6c 79  they differ only
1fec0 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54 45  .** by a COLLATE
1fed0 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74 68 65   operator at the
1fee0 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65 74   top level.  Ret
1fef0 75 72 6e 20 32 20 69 66 20 74 68 65 72 65 20 61  urn 2 if there a
1ff00 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 0a 2a  re differences.*
1ff10 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  * other than the
1ff20 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41   top-level COLLA
1ff30 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a  TE operator..**.
1ff40 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65  ** If any subele
1ff50 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45  ment of pB has E
1ff60 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29  xpr.iTable==(-1)
1ff70 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f   then it is allo
1ff80 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72  wed.** to compar
1ff90 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71  e equal to an eq
1ffa0 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74  uivalent element
1ffb0 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70 72   in pA with Expr
1ffc0 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a  .iTable==iTab..*
1ffd0 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73 69 64 65  *.** The pA side
1ffe0 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e 67 20   might be using 
1fff0 54 4b 5f 52 45 47 49 53 54 45 52 2e 20 20 49 66  TK_REGISTER.  If
20000 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
20010 65 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20 6e  e and pB is.** n
20020 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49  ot using TK_REGI
20030 53 54 45 52 20 62 75 74 20 69 73 20 6f 74 68 65  STER but is othe
20040 72 77 69 73 65 20 65 71 75 69 76 61 6c 65 6e 74  rwise equivalent
20050 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74  , then still ret
20060 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d  urn 0..**.** Som
20070 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75 74  etimes this rout
20080 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
20090 32 20 65 76 65 6e 20 69 66 20 74 68 65 20 74 77  2 even if the tw
200a0 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  o expressions.**
200b0 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75 69   really are equi
200c0 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20 63  valent.  If we c
200d0 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74  annot prove that
200e0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
200f0 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61   are.** identica
20100 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20 6a  l, we return 2 j
20110 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20  ust to be safe. 
20120 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
20130 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32  ine.** returns 2
20140 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f  , then you do no
20150 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f  t really know fo
20160 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68 65  r certain if the
20170 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69   two.** expressi
20180 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ons are the same
20190 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67 65  .  But if you ge
201a0 74 20 61 20 30 20 6f 72 20 31 20 72 65 74 75 72  t a 0 or 1 retur
201b0 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63  n, then you.** c
201c0 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20 65  an be sure the e
201d0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
201e0 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65  he same.  In the
201f0 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a   places where.**
20200 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
20210 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e   used, it does n
20220 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20 61  ot hurt to get a
20230 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68 61 74  n extra 2 - that
20240 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72  .** just might r
20250 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c  esult in some sl
20260 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f  ightly slower co
20270 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69  de.  But returni
20280 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65  ng.** an incorre
20290 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64 20  ct 0 or 1 could 
202a0 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e  lead to a malfun
202b0 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
202c0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
202d0 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20  (Expr *pA, Expr 
202e0 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a  *pB, int iTab){.
202f0 20 20 69 66 28 20 70 41 3d 3d 30 7c 7c 70 42 3d    if( pA==0||pB=
20300 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
20310 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b   pB==pA ? 0 : 2;
20320 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
20330 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
20340 70 41 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pA, EP_TokenOnly
20350 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
20360 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
20370 61 73 50 72 6f 70 65 72 74 79 28 70 42 2c 20 45  asProperty(pB, E
20380 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
20390 65 64 75 63 65 64 29 20 29 3b 0a 20 20 69 66 28  educed) );.  if(
203a0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
203b0 28 70 41 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pA, EP_xIsSelec
203c0 74 29 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f  t) || ExprHasPro
203d0 70 65 72 74 79 28 70 42 2c 20 45 50 5f 78 49 73  perty(pB, EP_xIs
203e0 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72  Select) ){.    r
203f0 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69  eturn 2;.  }.  i
20400 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20  f( (pA->flags & 
20410 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70  EP_Distinct)!=(p
20420 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  B->flags & EP_Di
20430 73 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e  stinct) ) return
20440 20 32 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70   2;.  if( pA->op
20450 21 3d 70 42 2d 3e 6f 70 20 26 26 20 28 70 41 2d  !=pB->op && (pA-
20460 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op!=TK_REGISTER
20470 20 7c 7c 20 70 41 2d 3e 6f 70 32 21 3d 70 42 2d   || pA->op2!=pB-
20480 3e 6f 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20  >op) ){.    if( 
20490 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41  pA->op==TK_COLLA
204a0 54 45 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  TE && sqlite3Exp
204b0 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65  rCompare(pA->pLe
204c0 66 74 2c 20 70 42 2c 20 69 54 61 62 29 3c 32 20  ft, pB, iTab)<2 
204d0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
204e0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
204f0 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   pB->op==TK_COLL
20500 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45 78  ATE && sqlite3Ex
20510 70 72 43 6f 6d 70 61 72 65 28 70 41 2c 20 70 42  prCompare(pA, pB
20520 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3c 32  ->pLeft, iTab)<2
20530 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
20540 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   1;.    }.    re
20550 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66  turn 2;.  }.  if
20560 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
20570 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20  pare(pA->pLeft, 
20580 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29  pB->pLeft, iTab)
20590 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69   ) return 2;.  i
205a0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
205b0 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74  mpare(pA->pRight
205c0 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c 20 69 54  , pB->pRight, iT
205d0 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ab) ) return 2;.
205e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
205f0 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 41 2d  rListCompare(pA-
20600 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e  >x.pList, pB->x.
20610 70 4c 69 73 74 2c 20 69 54 61 62 29 20 29 20 72  pList, iTab) ) r
20620 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 70  eturn 2;.  if( p
20630 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e  A->iColumn!=pB->
20640 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e  iColumn ) return
20650 20 32 3b 0a 20 20 69 66 28 20 70 41 2d 3e 69 54   2;.  if( pA->iT
20660 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65  able!=pB->iTable
20670 20 0a 20 20 20 26 26 20 70 41 2d 3e 6f 70 21 3d   .   && pA->op!=
20680 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 20 26  TK_REGISTER.   &
20690 26 20 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69  & (pA->iTable!=i
206a0 54 61 62 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d  Tab || NEVER(pB-
206b0 3e 69 54 61 62 6c 65 3e 3d 30 29 29 20 29 20 72  >iTable>=0)) ) r
206c0 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 45  eturn 2;.  if( E
206d0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
206e0 41 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  A, EP_IntValue) 
206f0 29 7b 0a 20 20 20 20 69 66 28 20 21 45 78 70 72  ){.    if( !Expr
20700 48 61 73 50 72 6f 70 65 72 74 79 28 70 42 2c 20  HasProperty(pB, 
20710 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20  EP_IntValue) || 
20720 70 41 2d 3e 75 2e 69 56 61 6c 75 65 21 3d 70 42  pA->u.iValue!=pB
20730 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20  ->u.iValue ){.  
20740 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
20750 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
20760 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pA->op!=TK_COLUM
20770 4e 20 26 26 20 41 4c 57 41 59 53 28 70 41 2d 3e  N && ALWAYS(pA->
20780 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op!=TK_AGG_COLUM
20790 4e 29 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b  N) && pA->u.zTok
207a0 65 6e 29 7b 0a 20 20 20 20 69 66 28 20 45 78 70  en){.    if( Exp
207b0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 42 2c  rHasProperty(pB,
207c0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c   EP_IntValue) ||
207d0 20 4e 45 56 45 52 28 70 42 2d 3e 75 2e 7a 54 6f   NEVER(pB->u.zTo
207e0 6b 65 6e 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  ken==0) ) return
207f0 20 32 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63   2;.    if( strc
20800 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  mp(pA->u.zToken,
20810 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30  pB->u.zToken)!=0
20820 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
20830 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   pA->op==TK_COLL
20840 41 54 45 20 3f 20 31 20 3a 20 32 3b 0a 20 20 20  ATE ? 1 : 2;.   
20850 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
20860 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  0;.}../*.** Comp
20870 61 72 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74  are two ExprList
20880 20 6f 62 6a 65 63 74 73 2e 20 20 52 65 74 75 72   objects.  Retur
20890 6e 20 30 20 69 66 20 74 68 65 79 20 61 72 65 20  n 0 if they are 
208a0 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a  identical and .*
208b0 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  * non-zero if th
208c0 65 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79  ey differ in any
208d0 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61   way..**.** If a
208e0 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66  ny subelement of
208f0 20 70 42 20 68 61 73 20 45 78 70 72 2e 69 54 61   pB has Expr.iTa
20900 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69  ble==(-1) then i
20910 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  t is allowed.** 
20920 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c  to compare equal
20930 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e   to an equivalen
20940 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20  t element in pA 
20950 77 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65  with Expr.iTable
20960 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68  ==iTab..**.** Th
20970 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
20980 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
20990 20 66 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20   for equivalent 
209a0 45 78 70 72 4c 69 73 74 73 2e 20 20 54 68 65 0a  ExprLists.  The.
209b0 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65  ** only conseque
209c0 6e 63 65 20 77 69 6c 6c 20 62 65 20 64 69 73 61  nce will be disa
209d0 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f  bled optimizatio
209e0 6e 73 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f  ns.  But this ro
209f0 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65  utine.** must ne
20a00 76 65 72 20 72 65 74 75 72 6e 20 30 20 69 66 20  ver return 0 if 
20a10 74 68 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74  the two ExprList
20a20 20 6f 62 6a 65 63 74 73 20 61 72 65 20 64 69 66   objects are dif
20a30 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20  ferent, or.** a 
20a40 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  malfunction will
20a50 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54   result..**.** T
20a60 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73  wo NULL pointers
20a70 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
20a80 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65 2e 20  to be the same. 
20a90 20 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e   But a NULL poin
20aa0 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69  ter.** always di
20ab0 66 66 65 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e  ffers from a non
20ac0 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a  -NULL pointer..*
20ad0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
20ae0 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 45 78 70  rListCompare(Exp
20af0 72 4c 69 73 74 20 2a 70 41 2c 20 45 78 70 72 4c  rList *pA, ExprL
20b00 69 73 74 20 2a 70 42 2c 20 69 6e 74 20 69 54 61  ist *pB, int iTa
20b10 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  b){.  int i;.  i
20b20 66 28 20 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d  f( pA==0 && pB==
20b30 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
20b40 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d  if( pA==0 || pB=
20b50 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
20b60 20 69 66 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d   if( pA->nExpr!=
20b70 70 42 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75  pB->nExpr ) retu
20b80 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  rn 1;.  for(i=0;
20b90 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b   i<pA->nExpr; i+
20ba0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
20bb0 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e  xprA = pA->a[i].
20bc0 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  pExpr;.    Expr 
20bd0 2a 70 45 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b  *pExprB = pB->a[
20be0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
20bf0 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  ( pA->a[i].sortO
20c00 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73  rder!=pB->a[i].s
20c10 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74 75 72  ortOrder ) retur
20c20 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 1;.    if( sql
20c30 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
20c40 70 45 78 70 72 41 2c 20 70 45 78 70 72 42 2c 20  pExprA, pExprB, 
20c50 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 31  iTab) ) return 1
20c60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
20c70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
20c80 6e 20 74 72 75 65 20 69 66 20 77 65 20 63 61 6e  n true if we can
20c90 20 70 72 6f 76 65 20 74 68 65 20 70 45 32 20 77   prove the pE2 w
20ca0 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74 72  ill always be tr
20cb0 75 65 20 69 66 20 70 45 31 20 69 73 0a 2a 2a 20  ue if pE1 is.** 
20cc0 74 72 75 65 2e 20 20 52 65 74 75 72 6e 20 66 61  true.  Return fa
20cd0 6c 73 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74  lse if we cannot
20ce0 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 70 72   complete the pr
20cf0 6f 6f 66 20 6f 72 20 69 66 20 70 45 32 20 6d 69  oof or if pE2 mi
20d00 67 68 74 0a 2a 2a 20 62 65 20 66 61 6c 73 65 2e  ght.** be false.
20d10 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a    Examples:.**.*
20d20 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 3d 35 20  *     pE1: x==5 
20d30 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20        pE2: x==5 
20d40 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73 75              Resu
20d50 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20  lt: true.**     
20d60 70 45 31 3a 20 78 3e 30 20 20 20 20 20 20 20 20  pE1: x>0        
20d70 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20  pE2: x==5       
20d80 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61        Result: fa
20d90 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  lse.**     pE1: 
20da0 78 3d 32 31 20 20 20 20 20 20 20 70 45 32 3a 20  x=21       pE2: 
20db0 78 3d 32 31 20 4f 52 20 79 3d 34 33 20 20 20 20  x=21 OR y=43    
20dc0 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
20dd0 20 20 20 20 20 70 45 31 3a 20 78 21 3d 31 32 33       pE1: x!=123
20de0 20 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e       pE2: x IS N
20df0 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c  OT NULL    Resul
20e00 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70  t: true.**     p
20e10 45 31 3a 20 78 21 3d 3f 31 20 20 20 20 20 20 70  E1: x!=?1      p
20e20 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
20e30 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75  L    Result: tru
20e40 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20  e.**     pE1: x 
20e50 49 53 20 4e 55 4c 4c 20 20 70 45 32 3a 20 78 20  IS NULL  pE2: x 
20e60 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
20e70 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20  esult: false.** 
20e80 20 20 20 20 70 45 31 3a 20 78 20 49 53 20 3f 32      pE1: x IS ?2
20e90 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f      pE2: x IS NO
20ea0 54 20 4e 55 4c 4c 20 20 20 20 52 65 75 73 6c 74  T NULL    Reuslt
20eb0 3a 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68  : false.**.** Wh
20ec0 65 6e 20 63 6f 6d 70 61 72 69 6e 67 20 54 4b 5f  en comparing TK_
20ed0 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 62 65 74  COLUMN nodes bet
20ee0 77 65 65 6e 20 70 45 31 20 61 6e 64 20 70 45 32  ween pE1 and pE2
20ef0 2c 20 69 66 20 70 45 32 20 68 61 73 0a 2a 2a 20  , if pE2 has.** 
20f00 45 78 70 72 2e 69 54 61 62 6c 65 3c 30 20 74 68  Expr.iTable<0 th
20f10 65 6e 20 61 73 73 75 6d 65 20 61 20 74 61 62 6c  en assume a tabl
20f20 65 20 6e 75 6d 62 65 72 20 67 69 76 65 6e 20 62  e number given b
20f30 79 20 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 57 68  y iTab..**.** Wh
20f40 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74  en in doubt, ret
20f50 75 72 6e 20 66 61 6c 73 65 2e 20 20 52 65 74 75  urn false.  Retu
20f60 72 6e 69 6e 67 20 74 72 75 65 20 6d 69 67 68 74  rning true might
20f70 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61   give a performa
20f80 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65  nce.** improveme
20f90 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 66  nt.  Returning f
20fa0 61 6c 73 65 20 6d 69 67 68 74 20 63 61 75 73 65  alse might cause
20fb0 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72   a performance r
20fc0 65 64 75 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  eduction, but.**
20fd0 20 69 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20   it will always 
20fe0 67 69 76 65 20 74 68 65 20 63 6f 72 72 65 63 74  give the correct
20ff0 20 61 6e 73 77 65 72 20 61 6e 64 20 69 73 20 68   answer and is h
21000 65 6e 63 65 20 61 6c 77 61 79 73 20 73 61 66 65  ence always safe
21010 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21020 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
21030 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70 72 20  Expr *pE1, Expr 
21040 2a 70 45 32 2c 20 69 6e 74 20 69 54 61 62 29 7b  *pE2, int iTab){
21050 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
21060 70 72 43 6f 6d 70 61 72 65 28 70 45 31 2c 20 70  prCompare(pE1, p
21070 45 32 2c 20 69 54 61 62 29 3d 3d 30 20 29 7b 0a  E2, iTab)==0 ){.
21080 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
21090 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d  }.  if( pE2->op=
210a0 3d 54 4b 5f 4f 52 0a 20 20 20 26 26 20 28 73 71  =TK_OR.   && (sq
210b0 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
210c0 45 78 70 72 28 70 45 31 2c 20 70 45 32 2d 3e 70  Expr(pE1, pE2->p
210d0 4c 65 66 74 2c 20 69 54 61 62 29 0a 20 20 20 20  Left, iTab).    
210e0 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
210f0 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78  te3ExprImpliesEx
21100 70 72 28 70 45 31 2c 20 70 45 32 2d 3e 70 52 69  pr(pE1, pE2->pRi
21110 67 68 74 2c 20 69 54 61 62 29 20 29 0a 20 20 29  ght, iTab) ).  )
21120 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
21130 20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f    }.  if( pE2->o
21140 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20  p==TK_NOTNULL.  
21150 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
21160 6f 6d 70 61 72 65 28 70 45 31 2d 3e 70 4c 65 66  ompare(pE1->pLef
21170 74 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69  t, pE2->pLeft, i
21180 54 61 62 29 3d 3d 30 0a 20 20 20 26 26 20 28 70  Tab)==0.   && (p
21190 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c  E1->op!=TK_ISNUL
211a0 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b  L && pE1->op!=TK
211b0 5f 49 53 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  _IS).  ){.    re
211c0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
211d0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
211e0 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
211f0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
21200 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20  ructure is used 
21210 62 79 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b  by the tree walk
21220 65 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74 20 72  er.** to count r
21230 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62  eferences to tab
21240 6c 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  le columns in th
21250 65 20 61 72 67 75 6d 65 6e 74 73 20 6f 66 20 61  e arguments of a
21260 6e 20 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 20  n .** aggregate 
21270 66 75 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f 72 64  function, in ord
21280 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  er to implement 
21290 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 75  the.** sqlite3Fu
212a0 6e 63 74 69 6f 6e 54 68 69 73 53 72 63 28 29 20  nctionThisSrc() 
212b0 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75  routine..*/.stru
212c0 63 74 20 53 72 63 43 6f 75 6e 74 20 7b 0a 20 20  ct SrcCount {.  
212d0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
212e0 20 2f 2a 20 4f 6e 65 20 70 61 72 74 69 63 75 6c   /* One particul
212f0 61 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  ar FROM clause i
21300 6e 20 61 20 6e 65 73 74 65 64 20 71 75 65 72 79  n a nested query
21310 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 68 69 73 3b   */.  int nThis;
21320 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
21330 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
21340 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 53 72  o columns in pSr
21350 63 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  cList */.  int n
21360 4f 74 68 65 72 3b 20 20 20 20 20 20 2f 2a 20 4e  Other;      /* N
21370 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
21380 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
21390 6e 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61  n other FROM cla
213a0 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  uses */.};../*.*
213b0 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
213c0 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
213d0 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a   to columns..*/.
213e0 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53  static int exprS
213f0 72 63 43 6f 75 6e 74 28 57 61 6c 6b 65 72 20 2a  rcCount(Walker *
21400 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
21410 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68 65 20  Expr){.  /* The 
21420 4e 45 56 45 52 28 29 20 6f 6e 20 74 68 65 20 73  NEVER() on the s
21430 65 63 6f 6e 64 20 74 65 72 6d 20 69 73 20 62 65  econd term is be
21440 63 61 75 73 65 20 73 71 6c 69 74 65 33 46 75 6e  cause sqlite3Fun
21450 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63  ctionUsesThisSrc
21460 28 29 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61 79  ().  ** is alway
21470 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
21480 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
21490 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20 61  zeAggregates() a
214a0 6e 64 20 73 6f 20 74 68 65 0a 20 20 2a 2a 20 54  nd so the.  ** T
214b0 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61 76 65 20 6e  K_COLUMNs have n
214c0 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 6e 76  ot yet been conv
214d0 65 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f 41 47  erted into TK_AG
214e0 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20 20  G_COLUMN.  If.  
214f0 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  ** sqlite3Functi
21500 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 20  onUsesThisSrc() 
21510 69 73 20 75 73 65 64 20 64 69 66 66 65 72 65 6e  is used differen
21520 74 6c 79 20 69 6e 20 74 68 65 20 66 75 74 75 72  tly in the futur
21530 65 2c 20 74 68 65 0a 20 20 2a 2a 20 4e 45 56 45  e, the.  ** NEVE
21540 52 28 29 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  R() will need to
21550 20 62 65 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a   be removed. */.
21560 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
21570 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45  =TK_COLUMN || NE
21580 56 45 52 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  VER(pExpr->op==T
21590 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b  K_AGG_COLUMN) ){
215a0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
215b0 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20  struct SrcCount 
215c0 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  *p = pWalker->u.
215d0 70 53 72 63 43 6f 75 6e 74 3b 0a 20 20 20 20 53  pSrcCount;.    S
215e0 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
215f0 2d 3e 70 53 72 63 3b 0a 20 20 20 20 66 6f 72 28  ->pSrc;.    for(
21600 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
21610 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  c; i++){.      i
21620 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
21630 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75  ==pSrc->a[i].iCu
21640 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  rsor ) break;.  
21650 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 70 53    }.    if( i<pS
21660 72 63 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20  rc->nSrc ){.    
21670 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20    p->nThis++;.  
21680 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
21690 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20  ->nOther++;.    
216a0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
216b0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
216c0 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
216d0 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72  if any of the ar
216e0 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70  guments to the p
216f0 45 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65  Expr Function re
21700 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c  ference.** pSrcL
21710 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ist.  Return tru
21720 65 20 69 66 20 74 68 65 79 20 64 6f 2e 20 20 41  e if they do.  A
21730 6c 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20  lso return true 
21740 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a  if the function.
21750 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67 75 6d 65  ** has no argume
21760 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20  nts or has only 
21770 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
21780 74 73 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ts.  Return fals
21790 65 20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72 65  e if pExpr.** re
217a0 66 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73  ferences columns
217b0 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73   but not columns
217c0 20 6f 66 20 74 61 62 6c 65 73 20 66 6f 75 6e 64   of tables found
217d0 20 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f   in pSrcList..*/
217e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 75 6e 63  .int sqlite3Func
217f0 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28  tionUsesThisSrc(
21800 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 72 63  Expr *pExpr, Src
21810 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 29 7b  List *pSrcList){
21820 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73  .  Walker w;.  s
21830 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 63  truct SrcCount c
21840 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  nt;.  assert( pE
21850 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
21860 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 6d 65  FUNCTION );.  me
21870 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
21880 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70  of(w));.  w.xExp
21890 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
218a0 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e 75 2e  SrcCount;.  w.u.
218b0 70 53 72 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74  pSrcCount = &cnt
218c0 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d 20 70  ;.  cnt.pSrc = p
218d0 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e  SrcList;.  cnt.n
218e0 54 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e  This = 0;.  cnt.
218f0 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20 73 71  nOther = 0;.  sq
21900 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73  lite3WalkExprLis
21910 74 28 26 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70  t(&w, pExpr->x.p
21920 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  List);.  return 
21930 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63  cnt.nThis>0 || c
21940 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a  nt.nOther==0;.}.
21950 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
21960 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
21970 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
21980 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
21990 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
219a0 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e  the new element.
219b0 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
219c0 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61  ive number if ma
219d0 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  lloc fails..*/.s
219e0 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67  tatic int addAgg
219f0 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74  InfoColumn(sqlit
21a00 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20  e3 *db, AggInfo 
21a10 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
21a20 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20  ;.  pInfo->aCol 
21a30 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
21a40 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64  locate(.       d
21a50 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  b,.       pInfo-
21a60 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69  >aCol,.       si
21a70 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c  zeof(pInfo->aCol
21a80 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49  [0]),.       &pI
21a90 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20  nfo->nColumn,.  
21aa0 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72       &i.  );.  r
21ab0 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a  eturn i;.}    ..
21ac0 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
21ad0 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  element to the p
21ae0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
21af0 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
21b00 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
21b10 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e  the new element.
21b20 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
21b30 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61  ive number if ma
21b40 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  lloc fails..*/.s
21b50 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67  tatic int addAgg
21b60 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33  InfoFunc(sqlite3
21b70 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70   *db, AggInfo *p
21b80 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Info){.  int i;.
21b90 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d    pInfo->aFunc =
21ba0 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
21bb0 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62  ocate(.       db
21bc0 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  , .       pInfo-
21bd0 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73  >aFunc,.       s
21be0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75  izeof(pInfo->aFu
21bf0 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26  nc[0]),.       &
21c00 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20  pInfo->nFunc,.  
21c10 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72       &i.  );.  r
21c20 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a  eturn i;.}    ..
21c30 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
21c40 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  e xExprCallback 
21c50 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c 6b 65  for a tree walke
21c60 72 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 74  r.  It is used t
21c70 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73  o.** implement s
21c80 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
21c90 65 41 67 67 72 65 67 61 74 65 73 28 29 2e 20 20  eAggregates().  
21ca0 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 41  See sqlite3ExprA
21cb0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
21cc0 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .** for addition
21cd0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
21ce0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e  */.static int an
21cf0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28 57  alyzeAggregate(W
21d00 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
21d10 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
21d20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
21d30 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c  text *pNC = pWal
21d40 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61  ker->u.pNC;.  Pa
21d50 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e  rse *pParse = pN
21d60 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63  C->pParse;.  Src
21d70 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d  List *pSrcList =
21d80 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
21d90 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49    AggInfo *pAggI
21da0 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49  nfo = pNC->pAggI
21db0 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  nfo;..  switch( 
21dc0 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
21dd0 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
21de0 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
21df0 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
21e00 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
21e10 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
21e20 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  UMN );.      tes
21e30 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
21e40 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
21e50 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
21e60 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75   see if the colu
21e70 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20  mn is in one of 
21e80 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  the tables in th
21e90 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20  e FROM.      ** 
21ea0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67  clause of the ag
21eb0 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f  gregate query */
21ec0 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
21ed0 53 28 70 53 72 63 4c 69 73 74 21 3d 30 29 20 29  S(pSrcList!=0) )
21ee0 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
21ef0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
21f00 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d  Item = pSrcList-
21f10 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  >a;.        for(
21f20 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d  i=0; i<pSrcList-
21f30 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
21f40 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
21f50 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
21f60 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20  ol *pCol;.      
21f70 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
21f80 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
21f90 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
21fa0 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
21fb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
21fc0 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
21fd0 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20  em->iCursor ){. 
21fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
21ff0 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
22000 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74  oint, it means t
22010 68 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73  hat pExpr refers
22020 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20   to a table.    
22030 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
22040 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  is in the FROM c
22050 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67  lause of the agg
22060 72 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a  regate query.  .
22070 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20              **. 
22080 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61             ** Ma
22090 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ke an entry for 
220a0 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41  the column in pA
220b0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69  ggInfo->aCol[] i
220c0 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20  f there.        
220d0 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e      ** is not an
220e0 20 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72   entry there alr
220f0 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20  eady..          
22100 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
22110 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20   int k;.        
22120 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49      pCol = pAggI
22130 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  nfo->aCol;.     
22140 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20         for(k=0; 
22150 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  k<pAggInfo->nCol
22160 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b  umn; k++, pCol++
22170 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
22180 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c   if( pCol->iTabl
22190 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
221a0 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
221b0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
221c0 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
221d0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
221e0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
221f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
22200 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22210 20 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d          if( (k>=
22220 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
22230 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n).             
22240 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e  && (k = addAggIn
22250 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d  foColumn(pParse-
22260 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e  >db, pAggInfo))>
22270 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
22280 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
22290 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66   pCol = &pAggInf
222a0 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20  o->aCol[k];.    
222b0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
222c0 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
222d0 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab;.            
222e0 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d    pCol->iTable =
222f0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
22300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
22310 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  ol->iColumn = pE
22320 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
22330 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
22340 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  ->iMem = ++pPars
22350 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
22360 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
22370 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  rterColumn = -1;
22380 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
22390 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  Col->pExpr = pEx
223a0 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
223b0 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e    if( pAggInfo->
223c0 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
223d0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
223e0 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  j, n;.          
223f0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
22400 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  pGB = pAggInfo->
22410 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  pGroupBy;.      
22420 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
22430 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
22440 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a  pTerm = pGB->a;.
22450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22460 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a  n = pGB->nExpr;.
22470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22480 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b  for(j=0; j<n; j+
22490 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
224a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
224b0 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d  xpr *pE = pTerm-
224c0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
224d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
224e0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
224f0 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70  && pE->iTable==p
22500 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a  Expr->iTable &&.
22510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22520 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d        pE->iColum
22530 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
22540 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
22550 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
22560 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a  SorterColumn = j
22570 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
22580 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
225a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
225b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
225c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
225d0 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74   if( pCol->iSort
225e0 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  erColumn<0 ){.  
225f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
22600 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
22610 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53  n = pAggInfo->nS
22620 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a  ortingColumn++;.
22630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
22640 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
22650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22660 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74  re is now an ent
22670 72 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20  ry for pExpr in 
22680 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
22690 20 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20   (either.       
226a0 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20       ** because 
226b0 69 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66  it was there bef
226c0 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77  ore or because w
226d0 65 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69  e just created i
226e0 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  t)..            
226f0 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70  ** Convert the p
22700 45 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f  Expr to be a TK_
22710 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72  AGG_COLUMN refer
22720 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20  ring to that.   
22730 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67           ** pAgg
22740 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74  Info->aCol[] ent
22750 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
22760 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  */.            E
22770 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
22780 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65  y(pExpr, EP_NoRe
22790 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20  duce);.         
227a0 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e     pExpr->pAggIn
227b0 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20  fo = pAggInfo;. 
227c0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
227d0 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f  ->op = TK_AGG_CO
227e0 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  LUMN;.          
227f0 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
22800 28 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20  (i16)k;.        
22810 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
22820 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20       } /* endif 
22830 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
22840 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f  Item->iCursor */
22850 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e  .        } /* en
22860 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63  d loop over pSrc
22870 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  List */.      }.
22880 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
22890 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  _Prune;.    }.  
228a0 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
228b0 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
228c0 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67  if( (pNC->ncFlag
228d0 73 20 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63  s & NC_InAggFunc
228e0 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70  )==0.       && p
228f0 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65  Walker->walkerDe
22900 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a  pth==pExpr->op2.
22910 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
22920 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
22930 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64   if pExpr is a d
22940 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74  uplicate of anot
22950 68 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20  her aggregate . 
22960 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
22970 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61  on that is alrea
22980 64 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e  dy in the pAggIn
22990 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20  fo structure.   
229a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
229b0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
229c0 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67  unc *pItem = pAg
229d0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20  gInfo->aFunc;.  
229e0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
229f0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
22a00 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
22a10 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
22a20 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
22a30 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20  e(pItem->pExpr, 
22a40 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b  pExpr, -1)==0 ){
22a50 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
22a60 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
22a70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22a80 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66    if( i>=pAggInf
22a90 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20  o->nFunc ){.    
22aa0 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69        /* pExpr i
22ab0 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b  s original.  Mak
22ac0 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  e a new entry in
22ad0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
22ae0 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  [].          */.
22af0 20 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63            u8 enc
22b00 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64   = ENC(pParse->d
22b10 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  b);.          i 
22b20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63  = addAggInfoFunc
22b30 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67  (pParse->db, pAg
22b40 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  gInfo);.        
22b50 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20    if( i>=0 ){.  
22b60 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
22b70 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
22b80 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
22b90 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
22ba0 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26         pItem = &
22bb0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
22bc0 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
22bd0 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
22be0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
22bf0 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20    pItem->iMem = 
22c00 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
22c10 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
22c20 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
22c30 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
22c40 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
22c50 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
22c60 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69  Func = sqlite3Fi
22c70 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  ndFunction(pPars
22c80 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20  e->db,.         
22c90 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
22ca0 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 73 71 6c 69 74  >u.zToken, sqlit
22cb0 65 33 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72  e3Strlen30(pExpr
22cc0 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2c 0a 20 20 20  ->u.zToken),.   
22cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ce0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f  pExpr->x.pList ?
22cf0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
22d00 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c  >nExpr : 0, enc,
22d10 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
22d20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
22d30 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20  s & EP_Distinct 
22d40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
22d50 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63   pItem->iDistinc
22d60 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
22d70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
22d80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
22d90 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73       pItem->iDis
22da0 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
22db0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22dc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
22dd0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
22de0 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74  pExpr point to t
22df0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70  he appropriate p
22e00 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
22e10 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a   entry.        *
22e20 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
22e30 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
22e40 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b  ty(pExpr, EP_Tok
22e50 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
22e60 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78  d) );.        Ex
22e70 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
22e80 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64  (pExpr, EP_NoRed
22e90 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70 45  uce);.        pE
22ea0 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36  xpr->iAgg = (i16
22eb0 29 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  )i;.        pExp
22ec0 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41  r->pAggInfo = pA
22ed0 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  ggInfo;.        
22ee0 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
22ef0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
22f00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
22f10 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  C_Continue;.    
22f20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
22f30 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
22f40 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  nue;.}.static in
22f50 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  t analyzeAggrega
22f60 74 65 73 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b  tesInSelect(Walk
22f70 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
22f80 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
22f90 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
22fa0 52 28 70 57 61 6c 6b 65 72 29 3b 0a 20 20 55 4e  R(pWalker);.  UN
22fb0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
22fc0 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75 72  Select);.  retur
22fd0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
22fe0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
22ff0 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65   the pExpr expre
23000 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ssion looking fo
23010 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  r aggregate func
23020 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72  tions and.** for
23030 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20   variables that 
23040 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64  need to be added
23050 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65   to AggInfo obje
23060 63 74 20 74 68 61 74 20 70 4e 43 2d 3e 70 41 67  ct that pNC->pAg
23070 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20  gInfo.** points 
23080 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20  to.  Additional 
23090 65 6e 74 72 69 65 73 20 61 72 65 20 6d 61 64 65  entries are made
230a0 20 6f 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20   on the AggInfo 
230b0 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63  object as.** nec
230c0 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  essary..**.** Th
230d0 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
230e0 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  d only be called
230f0 20 61 66 74 65 72 20 74 68 65 20 65 78 70 72 65   after the expre
23100 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a  ssion has been.*
23110 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71  * analyzed by sq
23120 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
23130 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Names()..*/.void
23140 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
23150 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e 61  yzeAggregates(Na
23160 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
23170 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
23180 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73  Walker w;.  mems
23190 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&w, 0, sizeof
231a0 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43  (w));.  w.xExprC
231b0 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a  allback = analyz
231c0 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e  eAggregate;.  w.
231d0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
231e0 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  = analyzeAggrega
231f0 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77  tesInSelect;.  w
23200 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20  .u.pNC = pNC;.  
23210 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72  assert( pNC->pSr
23220 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 71  cList!=0 );.  sq
23230 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
23240 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pExpr);.}../*.
23250 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45  ** Call sqlite3E
23260 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
23270 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72 79  ates() for every
23280 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
23290 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
232a0 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68  list.  Return th
232b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
232c0 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  rs..**.** If an 
232d0 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20  error is found, 
232e0 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20  the analysis is 
232f0 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f  cut short..*/.vo
23300 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  id sqlite3ExprAn
23310 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d  alyzeAggList(Nam
23320 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
23330 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
23340 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
23350 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
23360 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
23370 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
23380 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
23390 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
233a0 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
233b0 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
233c0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
233d0 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65  egates(pNC, pIte
233e0 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  m->pExpr);.    }
233f0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
23400 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65 20  locate a single 
23410 6e 65 77 20 72 65 67 69 73 74 65 72 20 66 6f 72  new register for
23420 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d   use to hold som
23430 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  e intermediate r
23440 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  esult..*/.int sq
23450 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
23460 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
23470 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54    if( pParse->nT
23480 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20  empReg==0 ){.   
23490 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65   return ++pParse
234a0 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65  ->nMem;.  }.  re
234b0 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65  turn pParse->aTe
234c0 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e  mpReg[--pParse->
234d0 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a  nTempReg];.}../*
234e0 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  .** Deallocate a
234f0 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e   register, makin
23500 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  g available for 
23510 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f  reuse for some o
23520 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e  ther.** purpose.
23530 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69  .**.** If a regi
23540 73 74 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c  ster is currentl
23550 79 20 62 65 69 6e 67 20 75 73 65 64 20 62 79 20  y being used by 
23560 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
23570 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 61  , then.** the da
23580 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64 65 66  llocation is def
23590 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20  erred until the 
235a0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e  column cache lin
235b0 65 20 74 68 61 74 20 75 73 65 73 0a 2a 2a 20 74  e that uses.** t
235c0 68 65 20 72 65 67 69 73 74 65 72 20 62 65 63 6f  he register beco
235d0 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f  mes stale..*/.vo
235e0 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  id sqlite3Releas
235f0 65 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a  eTempReg(Parse *
23600 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
23610 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26  ){.  if( iReg &&
23620 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
23630 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72  g<ArraySize(pPar
23640 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b  se->aTempReg) ){
23650 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
23660 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
23670 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   *p;.    for(i=0
23680 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
23690 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
236a0 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
236b0 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   p++){.      if(
236c0 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29   p->iReg==iReg )
236d0 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 65 6d  {.        p->tem
236e0 70 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  pReg = 1;.      
236f0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
23700 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  }.    }.    pPar
23710 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61  se->aTempReg[pPa
23720 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d  rse->nTempReg++]
23730 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a   = iReg;.  }.}..
23740 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f  /*.** Allocate o
23750 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62  r deallocate a b
23760 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e  lock of nReg con
23770 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65  secutive registe
23780 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  rs.*/.int sqlite
23790 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61  3GetTempRange(Pa
237a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
237b0 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c   nReg){.  int i,
237c0 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65   n;.  i = pParse
237d0 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e  ->iRangeReg;.  n
237e0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67   = pParse->nRang
237f0 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67  eReg;.  if( nReg
23800 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  <=n ){.    asser
23810 74 28 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e  t( !usedAsColumn
23820 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c  Cache(pParse, i,
23830 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20 70   i+n-1) );.    p
23840 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
23850 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50   += nReg;.    pP
23860 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
23870 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65  -= nReg;.  }else
23880 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73 65  {.    i = pParse
23890 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50  ->nMem+1;.    pP
238a0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
238b0 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  eg;.  }.  return
238c0 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74   i;.}.void sqlit
238d0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
238e0 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
238f0 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20  , int iReg, int 
23900 6e 52 65 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  nReg){.  sqlite3
23910 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
23920 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 52  pParse, iReg, nR
23930 65 67 29 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e  eg);.  if( nReg>
23940 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
23950 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  g ){.    pParse-
23960 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65  >nRangeReg = nRe
23970 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  g;.    pParse->i
23980 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b  RangeReg = iReg;
23990 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
239a0 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79  rk all temporary
239b0 20 72 65 67 69 73 74 65 72 73 20 61 73 20 62 65   registers as be
239c0 69 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c 65 20  ing unavailable 
239d0 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f  for reuse..*/.vo
239e0 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54  id sqlite3ClearT
239f0 65 6d 70 52 65 67 43 61 63 68 65 28 50 61 72 73  empRegCache(Pars
23a00 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50  e *pParse){.  pP
23a10 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d  arse->nTempReg =
23a20 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52   0;.  pParse->nR
23a30 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a     angeReg = 0;.}.